Analizar datos multimodales en Python con BigQuery DataFrames

En este tutorial se muestra cómo analizar datos multimodales en un cuaderno de Python mediante las clases y los métodos de DataFrames de BigQuery.

En este tutorial se usa el catálogo de productos del conjunto de datos público de la tienda de mascotas Cymbal.

Para subir un cuaderno que ya tenga las tareas que se explican en este tutorial, consulta BigFrames Multimodal DataFrame.

Objetivos

  • Crea DataFrames multimodales.
  • Combina datos estructurados y sin estructurar en un DataFrame.
  • Transformar imágenes.
  • Generar texto e incrustaciones a partir de datos de imagen.
  • Divide los PDFs en fragmentos para analizarlos más a fondo.

Costes

En este documento, se utilizan los siguientes componentes facturables de Google Cloud:

  • BigQuery: you incur costs for the data that you process in BigQuery.
  • BigQuery Python UDFs: you incur costs for using BigQuery DataFrames image transformation and chunk PDF methods.
  • Cloud Storage: you incur costs for the objects stored in Cloud Storage.
  • Vertex AI: you incur costs for calls to Vertex AI models.

Para generar una estimación de costes basada en el uso previsto, utiliza la calculadora de precios.

Los usuarios nuevos Google Cloud pueden disfrutar de una prueba gratuita.

Para obtener más información, consulta las siguientes páginas de precios:

Antes de empezar

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  2. Verify that billing is enabled for your Google Cloud project.

  3. Enable the BigQuery, BigQuery Connection, Cloud Storage, and Vertex AI APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

Roles obligatorios

Para obtener los permisos que necesitas para completar este tutorial, pide a tu administrador que te conceda los siguientes roles de gestión de identidades y accesos:

Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar el acceso a proyectos, carpetas y organizaciones.

También puedes conseguir los permisos necesarios a través de roles personalizados u otros roles predefinidos.

Configurar

En esta sección, creará el segmento de Cloud Storage, la conexión y el cuaderno que se usan en este tutorial.

Crear un segmento

Crea un segmento de Cloud Storage para almacenar los objetos transformados:

  1. En la Google Cloud consola, ve a la página Buckets.

    Ir a Contenedores

  2. Haz clic en Crear.

  3. En la página Crear un contenedor, en la sección Empezar, introduce un nombre único a nivel global que cumpla los requisitos de los nombres de los contenedores.

  4. Haz clic en Crear.

Crear una conexión

Crea una conexión de recursos de Cloud y obtén la cuenta de servicio de la conexión. BigQuery usa la conexión para acceder a los objetos de Cloud Storage.

  1. Ve a la página BigQuery.

    Ir a BigQuery

  2. En el panel Explorador, haz clic en Añadir datos.

    Se abrirá el cuadro de diálogo Añadir datos.

  3. En el panel Filtrar por, en la sección Tipo de fuente de datos, selecciona Aplicaciones empresariales.

    También puede introducir Vertex AI en el campo Buscar fuentes de datos.

  4. En la sección Fuentes de datos destacadas, haga clic en Vertex AI.

  5. Haz clic en la tarjeta de solución Modelos de Vertex AI: federación de BigQuery.

  6. En la lista Tipo de conexión, selecciona Modelos remotos, funciones remotas y BigLake (recurso de Cloud) de Vertex AI.

  7. En el campo Connection ID (ID de conexión), escribe bigframes-default-connection.

  8. Haga clic en Crear conexión.

  9. Haz clic en Ir a la conexión.

  10. En el panel Información de conexión, copia el ID de la cuenta de servicio para usarlo en un paso posterior.

Conceder permisos a la cuenta de servicio de la conexión

Concede a la cuenta de servicio de la conexión los roles que necesita para acceder a Cloud Storage y Vertex AI. Debes conceder estos roles en el mismo proyecto que has creado o seleccionado en la sección Antes de empezar.

Para conceder el rol, sigue estos pasos:

  1. Ve a la página IAM y administración.

    Ir a IAM y administración

  2. Haz clic en Conceder acceso.

  3. En el campo Nuevos principales, introduce el ID de la cuenta de servicio que has copiado anteriormente.

  4. En el campo Selecciona un rol, elige Cloud Storage y, a continuación, selecciona Usuario de objetos de Storage.

  5. Haz clic en Añadir otro rol.

  6. En el campo Selecciona un rol, elige Vertex AI y, a continuación, Usuario de Vertex AI.

  7. Haz clic en Guardar.

Crear un cuaderno

Crea un cuaderno en el que puedas ejecutar código Python:

  1. Ve a la página BigQuery.

    Ir a BigQuery

  2. En la barra de pestañas del panel del editor, haz clic en la flecha desplegable junto a Consulta de SQL y, a continuación, en Notebook.

  3. En el panel Empezar con una plantilla, haz clic en Cerrar.

  4. Haz clic en Conectar > Conectar con un tiempo de ejecución.

  5. Si ya tienes un tiempo de ejecución, acepta la configuración predeterminada y haz clic en Conectar. Si no tienes ningún tiempo de ejecución, selecciona Crear nuevo tiempo de ejecución y, a continuación, haz clic en Conectar.

    El tiempo de ejecución puede tardar varios minutos en configurarse.

Crear un DataFrame multimodal

Crea un DataFrame multimodal que integre datos estructurados y no estructurados con el método from_glob_path de la clase Session:

  1. En el cuaderno, crea una celda de código y copia el siguiente código:
    import bigframes
    
    # Flags to control preview image/video preview size
    bigframes.options.display.blob_display_width = 300
    
    import bigframes.pandas as bpd
    
    # Create blob columns from wildcard path.
    df_image = bpd.from_glob_path(
        "gs://cloud-samples-data/bigquery/tutorials/cymbal-pets/images/*", name="image"
    )
    # Other ways are: from string uri column
    # df = bpd.DataFrame({"uri": ["gs://<my_bucket>/<my_file_0>", "gs://<my_bucket>/<my_file_1>"]})
    # df["blob_col"] = df["uri"].str.to_blob()
    
    # From an existing object table
    # df = bpd.read_gbq_object_table("<my_object_table>", name="blob_col")
    
    # Take only the 5 images to deal with. Preview the content of the Mutimodal DataFrame
    df_image = df_image.head(5)
    df_image
  2. Haz clic en Ejecutar.

    La última llamada a df_image devuelve las imágenes que se han añadido al DataFrame. También puedes llamar al método .display.

Combinar datos estructurados y sin estructurar en el DataFrame

Combina datos de texto e imagen en el DataFrame multimodal:

  1. En el cuaderno, crea una celda de código y copia el siguiente código:
    # Combine unstructured data with structured data
    df_image["author"] = ["alice", "bob", "bob", "alice", "bob"]  # type: ignore
    df_image["content_type"] = df_image["image"].blob.content_type()
    df_image["size"] = df_image["image"].blob.size()
    df_image["updated"] = df_image["image"].blob.updated()
    df_image
  2. Haz clic en Ejecutar .

    El código devuelve los datos de DataFrame.

  3. En el cuaderno, crea una celda de código y copia el siguiente código en ella:

    # Filter images and display, you can also display audio and video types. Use width/height parameters to constrain window sizes.
    df_image[df_image["author"] == "alice"]["image"].blob.display()
  4. Haz clic en Ejecutar .

    El código devuelve imágenes del DataFrame en las que el valor de la columna author es alice.

Realizar transformaciones de imágenes

Transforma los datos de imagen usando los siguientes métodos de la clase Series.BlobAccessor:

Las imágenes transformadas se escriben en Cloud Storage.

Transformar imágenes:

  1. En el cuaderno, crea una celda de código y copia el siguiente código:
    df_image["blurred"] = df_image["image"].blob.image_blur(
        (20, 20), dst=f"{dst_bucket}/image_blur_transformed/", engine="opencv"
    )
    df_image["resized"] = df_image["image"].blob.image_resize(
        (300, 200), dst=f"{dst_bucket}/image_resize_transformed/", engine="opencv"
    )
    df_image["normalized"] = df_image["image"].blob.image_normalize(
        alpha=50.0,
        beta=150.0,
        norm_type="minmax",
        dst=f"{dst_bucket}/image_normalize_transformed/",
        engine="opencv",
    )
    
    # You can also chain functions together
    df_image["blur_resized"] = df_image["blurred"].blob.image_resize(
        (300, 200), dst=f"{dst_bucket}/image_blur_resize_transformed/", engine="opencv"
    )
    df_image
  2. Actualiza todas las referencias a {dst_bucket} para que hagan referencia al contenedor que has creado, con el formato gs://mybucket.
  3. Haz clic en Ejecutar .

    El código devuelve las imágenes originales, así como todas sus transformaciones.

Generar texto

Genera texto a partir de datos multimodales usando el método predict de la clase GeminiTextGenerator:

  1. En el cuaderno, crea una celda de código y copia el siguiente código:
    from bigframes.ml import llm
    
    gemini = llm.GeminiTextGenerator(model_name="gemini-2.0-flash-001")
    
    # Deal with first 2 images as example
    df_image = df_image.head(2)
    
    # Ask the same question on the images
    df_image = df_image.head(2)
    answer = gemini.predict(df_image, prompt=["what item is it?", df_image["image"]])
    answer[["ml_generate_text_llm_result", "image"]]
  2. Haz clic en Ejecutar .

    El código devuelve las dos primeras imágenes de df_image, junto con el texto generado en respuesta a la pregunta what item is it? para ambas imágenes.

  3. En el cuaderno, crea una celda de código y copia el siguiente código en ella:

    # Ask different questions
    df_image["question"] = [  # type: ignore
        "what item is it?",
        "what color is the picture?",
    ]
    answer_alt = gemini.predict(
        df_image, prompt=[df_image["question"], df_image["image"]]
    )
    answer_alt[["ml_generate_text_llm_result", "image"]]
  4. Haz clic en Ejecutar .

    El código devuelve las dos primeras imágenes de df_image, con el texto generado en respuesta a la pregunta what item is it? de la primera imagen y el texto generado en respuesta a la pregunta what color is the picture? de la segunda imagen.

Generar inserciones

Genera embeddings de datos multimodales con el método predict de la clase MultimodalEmbeddingGenerator:

  1. En el cuaderno, crea una celda de código y copia el siguiente código:
    # Generate embeddings on images
    embed_model = llm.MultimodalEmbeddingGenerator()
    embeddings = embed_model.predict(df_image["image"])
    embeddings
  2. Haz clic en Ejecutar .

    El código devuelve las inserciones generadas por una llamada a un modelo de inserciones.

Dividir PDFs en fragmentos

Divide en fragmentos los objetos PDF con el método pdf_chunk de la clase Series.BlobAccessor:

  1. En el cuaderno, crea una celda de código y copia el siguiente código:
    # PDF chunking
    df_pdf = bpd.from_glob_path(
        "gs://cloud-samples-data/bigquery/tutorials/cymbal-pets/documents/*", name="pdf"
    )
    df_pdf["chunked"] = df_pdf["pdf"].blob.pdf_chunk(engine="pypdf")
    chunked = df_pdf["chunked"].explode()
    chunked
  2. Haz clic en Ejecutar .

    El código devuelve los datos PDF fragmentados.

Limpieza

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.