Manipolare i dati con BigQuery DataFrames

Questo documento descrive le funzionalità di manipolazione dei dati disponibili con BigQuery DataFrames. Puoi trovare le funzioni descritte nella 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 tuo 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, Python REPL o la riga di comando, BigQuery DataFrames richiede l'autenticazione, se necessario. In caso contrario, consulta come configurare le credenziali predefinite dell'applicazione per vari ambienti.

API pandas

Una funzionalità 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 al di fuori di BigQuery.

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

Ispezionare e manipolare 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.

Elaborare 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 Series con sottocampi per ogni colonna di 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]

Convertire i timestamp in epoch 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 temporali unix_seconds() e unix_millis().

Utilizzare la funzione scalare SQL

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

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