Visualizar gráficos con BigQuery DataFrames

En este documento se muestra cómo trazar varios tipos de gráficos con la biblioteca de visualización de DataFrames de BigQuery.

La API bigframes.pandas proporciona un ecosistema completo de herramientas para Python. La API admite operaciones estadísticas avanzadas y puedes visualizar las agregaciones generadas a partir de BigQuery DataFrames. También puedes cambiar de BigQuery DataFrames a un DataFrame de pandas con operaciones de muestreo integradas.

Histograma

En el siguiente ejemplo se leen datos de la tabla bigquery-public-data.ml_datasets.penguins para trazar un histograma sobre la distribución de las profundidades del pico de los pingüinos:

import bigframes.pandas as bpd

penguins = bpd.read_gbq("bigquery-public-data.ml_datasets.penguins")
penguins["culmen_depth_mm"].plot.hist(bins=40)

Ejemplo de un histograma en BigQuery DataFrames.

Gráfico de líneas

En el siguiente ejemplo se usan datos de la tabla bigquery-public-data.noaa_gsod.gsod2021 para trazar un gráfico de líneas de los cambios de temperatura media a lo largo del año:

import bigframes.pandas as bpd

noaa_surface = bpd.read_gbq("bigquery-public-data.noaa_gsod.gsod2021")

# Calculate median temperature for each day
noaa_surface_median_temps = noaa_surface[["date", "temp"]].groupby("date").median()

noaa_surface_median_temps.plot.line()

Ejemplo de un gráfico de líneas en BigQuery DataFrames.

Gráfico de área

En el siguiente ejemplo se usa la tabla bigquery-public-data.usa_names.usa_1910_2013 para monitorizar la popularidad de los nombres en la historia de EE. UU. y se centra en los nombres Mary, Emily y Lisa:

import bigframes.pandas as bpd

usa_names = bpd.read_gbq("bigquery-public-data.usa_names.usa_1910_2013")

# Count the occurences of the target names each year. The result is a dataframe with a multi-index.
name_counts = (
    usa_names[usa_names["name"].isin(("Mary", "Emily", "Lisa"))]
    .groupby(("year", "name"))["number"]
    .sum()
)

# Flatten the index of the dataframe so that the counts for each name has their own columns.
name_counts = name_counts.unstack(level=1).fillna(0)

name_counts.plot.area(stacked=False, alpha=0.5)

Ejemplo de un gráfico de áreas en BigQuery DataFrames.

Gráfico de barras

En el siguiente ejemplo se usa la tabla bigquery-public-data.ml_datasets.penguins para visualizar la distribución de sexos de los pingüinos:

import bigframes.pandas as bpd

penguins = bpd.read_gbq("bigquery-public-data.ml_datasets.penguins")

penguin_count_by_sex = (
    penguins[penguins["sex"].isin(("MALE", "FEMALE"))]
    .groupby("sex")["species"]
    .count()
)
penguin_count_by_sex.plot.bar()

Ejemplo de un gráfico de barras en BigQuery DataFrames.

Gráfico de dispersión

En el siguiente ejemplo se usa la tabla bigquery-public-data.new_york_taxi_trips.tlc_yellow_trips_2021 para analizar la relación entre los importes de las tarifas de taxi y las distancias de los trayectos:

import bigframes.pandas as bpd

taxi_trips = bpd.read_gbq(
    "bigquery-public-data.new_york_taxi_trips.tlc_yellow_trips_2021"
).dropna()

# Data Cleaning
taxi_trips = taxi_trips[
    taxi_trips["trip_distance"].between(0, 10, inclusive="right")
]
taxi_trips = taxi_trips[taxi_trips["fare_amount"].between(0, 50, inclusive="right")]

# If you are using partial ordering mode, you will also need to assign an order to your dataset.
# Otherwise, the next line can be skipped.
taxi_trips = taxi_trips.sort_values("pickup_datetime")

taxi_trips.plot.scatter(x="trip_distance", y="fare_amount", alpha=0.5)

Ejemplo de un gráfico de dispersión en BigQuery DataFrames.

Visualizar un conjunto de datos de gran tamaño

BigQuery DataFrames descarga los datos en tu máquina local para visualizarlos. El número de puntos de datos que se pueden descargar está limitado a 1000 de forma predeterminada. Si el número de puntos de datos supera el límite, BigQuery DataFrames toma una muestra aleatoria del número de puntos de datos igual al límite.

Puede anular este límite definiendo el parámetro sampling_n al trazar un gráfico, como se muestra en el siguiente ejemplo:

import bigframes.pandas as bpd

noaa_surface = bpd.read_gbq("bigquery-public-data.noaa_gsod.gsod2021")

# Calculate median temperature for each day
noaa_surface_median_temps = noaa_surface[["date", "temp"]].groupby("date").median()

noaa_surface_median_temps.plot.line(sampling_n=40)

Ejemplo de un gráfico de líneas que visualiza un conjunto de datos de gran tamaño en BigQuery DataFrames.

Gráficos avanzados con parámetros de pandas y Matplotlib

Puedes introducir más parámetros para ajustar el gráfico, como en pandas, ya que la biblioteca de gráficos de BigQuery DataFrames se basa en pandas y Matplotlib. En las siguientes secciones se describen algunos ejemplos.

Tendencia de popularidad de nombres con gráficos secundarios

Si se usan los datos del historial de nombres del gráfico de áreas de ejemplo, en el siguiente ejemplo se crean gráficos individuales para cada nombre definiendo subplots=True en la llamada de la función plot.area():

import bigframes.pandas as bpd

usa_names = bpd.read_gbq("bigquery-public-data.usa_names.usa_1910_2013")

# Count the occurences of the target names each year. The result is a dataframe with a multi-index.
name_counts = (
    usa_names[usa_names["name"].isin(("Mary", "Emily", "Lisa"))]
    .groupby(("year", "name"))["number"]
    .sum()
)

# Flatten the index of the dataframe so that the counts for each name has their own columns.
name_counts = name_counts.unstack(level=1).fillna(0)

name_counts.plot.area(subplots=True, alpha=0.5)

Ejemplo de gráficos individuales con subgráficos en BigQuery DataFrames.

Gráfico de dispersión de viajes en taxi con varias dimensiones

A partir de los datos del ejemplo de gráfico de dispersión, en el siguiente ejemplo se cambian los nombres de las etiquetas de los ejes X e Y, se usa el parámetro passenger_count para los tamaños de los puntos, se usan puntos de color con el parámetro tip_amount y se cambia el tamaño de la figura:

import bigframes.pandas as bpd

taxi_trips = bpd.read_gbq(
    "bigquery-public-data.new_york_taxi_trips.tlc_yellow_trips_2021"
).dropna()

# Data Cleaning
taxi_trips = taxi_trips[
    taxi_trips["trip_distance"].between(0, 10, inclusive="right")
]
taxi_trips = taxi_trips[taxi_trips["fare_amount"].between(0, 50, inclusive="right")]

# If you are using partial ordering mode, you also need to assign an order to your dataset.
# Otherwise, the next line can be skipped.
taxi_trips = taxi_trips.sort_values("pickup_datetime")

taxi_trips["passenger_count_scaled"] = taxi_trips["passenger_count"] * 30

taxi_trips.plot.scatter(
    x="trip_distance",
    xlabel="trip distance (miles)",
    y="fare_amount",
    ylabel="fare amount (usd)",
    alpha=0.5,
    s="passenger_count_scaled",
    label="passenger_count",
    c="tip_amount",
    cmap="jet",
    colorbar=True,
    legend=True,
    figsize=(15, 7),
    sampling_n=1000,
)

Ejemplo de gráfico de dispersión con varias dimensiones en BigQuery DataFrames.

Siguientes pasos