Manipola i dati con BigQuery DataFrames

BigQuery DataFrames ti consente di manipolare i dati utilizzando i pattern di sintassi pandas familiari senza trasferire i set di dati fuori dal tuo data warehouse. Poiché queste operazioni vengono eseguite lato server, puoi ispezionare, manipolare e applicare calcoli complessi direttamente ai dati archiviati in BigQuery.

Per saperne di più sulle funzioni supportate, consulta la libreria bigframes.bigquery.

Ruoli obbligatori

Per ottenere le autorizzazioni necessarie per completare le attività descritte in questo documento, chiedi all'amministratore di concederti i seguenti ruoli IAM nel progetto:

Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

Potresti anche riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.

Quando esegui l'autenticazione dell'utente finale in un ambiente interattivo come un notebook, un REPL Python o la riga di comando, BigQuery DataFrames richiede l'autenticazione, se necessario. In caso contrario, scopri come configurare le credenziali predefinite dell'applicazione per vari ambienti.

API pandas

Una caratteristica degna di nota di BigQuery DataFrames è che l'API bigframes.pandas è progettata per essere simile alle API della libreria pandas. Questo design ti consente di utilizzare pattern di sintassi familiari per le attività di manipolazione dei dati. Le operazioni definite tramite l'API BigQuery DataFrames vengono eseguite lato server, operando direttamente sui dati archiviati in BigQuery ed eliminando la necessità di trasferire i set di dati fuori da BigQuery.

Per verificare quali API pandas sono supportate da BigQuery DataFrames, consulta API pandas supportate.

Ispeziona e manipola i dati

Puoi utilizzare l'API bigframes.pandas per eseguire operazioni di ispezione e calcolo dei dati. Il seguente esempio di codice utilizza la libreria bigframes.pandas per ispezionare la colonna body_mass_g, calcolare la media body_mass e calcolare la media body_mass per species:

import bigframes.pandas as bpd

# Load data from BigQuery
query_or_table = "bigquery-public-data.ml_datasets.penguins"
bq_df = bpd.read_gbq(query_or_table)

# Inspect one of the columns (or series) of the DataFrame:
bq_df["body_mass_g"]

# Compute the mean of this series:
average_body_mass = bq_df["body_mass_g"].mean()
print(f"average_body_mass: {average_body_mass}")

# Find the heaviest species using the groupby operation to calculate the
# mean body_mass_g:
(
    bq_df["body_mass_g"]
    .groupby(by=bq_df["species"])
    .mean()
    .sort_values(ascending=False)
    .head(10)
)

Libreria BigQuery

La libreria BigQuery fornisce funzioni SQL di BigQuery che potrebbero non avere un equivalente in pandas. Le sezioni seguenti presentano alcuni esempi.

Elabora i valori dell'array

Puoi utilizzare la funzione bigframes.bigquery.array_agg() nella libreria bigframes.bigquery per aggregare i valori dopo un'operazione groupby:

import bigframes.bigquery as bbq
import bigframes.pandas as bpd

s = bpd.Series([0, 1, 2, 3, 4, 5])

# Group values by whether they are divisble by 2 and aggregate them into arrays
bbq.array_agg(s.groupby(s % 2 == 0))
# False    [1 3 5]
# True     [0 2 4]
# dtype: list<item: int64>[pyarrow]

Puoi anche utilizzare le funzioni di array array_length() e array_to_string().

Crea un oggetto struct Series

Puoi utilizzare la funzione bigframes.bigquery.struct() nella libreria bigframes.bigquery per creare un nuovo oggetto struct Series con campi secondari per ogni colonna in un DataFrame:

import bigframes.bigquery as bbq
import bigframes.pandas as bpd

# Load data from BigQuery
query_or_table = "bigquery-public-data.ml_datasets.penguins"
bq_df = bpd.read_gbq(query_or_table)

# Create a new STRUCT Series with subfields for each column in a DataFrames.
lengths = bbq.struct(
    bq_df[["culmen_length_mm", "culmen_depth_mm", "flipper_length_mm"]]
)

lengths.peek()
# 146	{'culmen_length_mm': 51.1, 'culmen_depth_mm': ...
# 278	{'culmen_length_mm': 48.2, 'culmen_depth_mm': ...
# 337	{'culmen_length_mm': 36.4, 'culmen_depth_mm': ...
# 154	{'culmen_length_mm': 46.5, 'culmen_depth_mm': ...
# 185	{'culmen_length_mm': 50.1, 'culmen_depth_mm': ...
# dtype: struct[pyarrow]

Converti i timestamp in epoche di Unix

Puoi utilizzare la funzione bigframes.bigquery.unix_micros() nella libreria bigframes.bigquery per convertire i timestamp in microsecondi Unix:

import pandas as pd

import bigframes.bigquery as bbq
import bigframes.pandas as bpd

# Create a series that consists of three timestamps: [1970-01-01, 1970-01-02, 1970-01-03]
s = bpd.Series(pd.date_range("1970-01-01", periods=3, freq="d", tz="UTC"))

bbq.unix_micros(s)
# 0               0
# 1     86400000000
# 2    172800000000
# dtype: Int64

Puoi anche utilizzare le funzioni di ora unix_seconds() e unix_millis().

Utilizza la funzione scalare SQL

Puoi utilizzare la funzione bigframes.bigquery.sql_scalar() nella libreria bigframes.bigquery per accedere alla sintassi SQL arbitraria che rappresenta un'espressione a colonna singola:

import bigframes.bigquery as bbq
import bigframes.pandas as bpd

# Load data from BigQuery
query_or_table = "bigquery-public-data.ml_datasets.penguins"

# The sql_scalar function can be used to inject SQL syntax that is not supported
# or difficult to express with the bigframes.pandas APIs.
bq_df = bpd.read_gbq(query_or_table)
shortest = bbq.sql_scalar(
    "LEAST({0}, {1}, {2})",
    columns=[
        bq_df["culmen_depth_mm"],
        bq_df["culmen_length_mm"],
        bq_df["flipper_length_mm"],
    ],
)

shortest.peek()
#         0
# 149	18.9
# 33	16.3
# 296	17.2
# 287	17.0
# 307	15.0
# dtype: Float64

Passaggi successivi