Memanipulasi data dengan DataFrame BigQuery

Dokumen ini menjelaskan kemampuan manipulasi data yang tersedia dengan BigQuery DataFrame. Anda dapat menemukan fungsi yang dijelaskan di library bigframes.bigquery.

Peran yang diperlukan

Untuk mendapatkan izin yang Anda perlukan untuk menyelesaikan tugas dalam dokumen ini, minta administrator Anda untuk memberi Anda peran IAM berikut di project Anda:

Untuk mengetahui informasi selengkapnya tentang pemberian peran, lihat Mengelola akses ke project, folder, dan organisasi.

Anda mungkin juga bisa mendapatkan izin yang diperlukan melalui peran khusus atau peran bawaan lainnya.

Saat Anda melakukan autentikasi pengguna akhir di lingkungan interaktif seperti notebook, REPL Python, atau command line, BigQuery DataFrames akan meminta autentikasi, jika diperlukan. Jika tidak, lihat cara menyiapkan kredensial default aplikasi untuk berbagai lingkungan.

pandas API

Fitur penting BigQuery DataFrames adalah bigframes.pandas API didesain agar mirip dengan API di library pandas. Desain ini memungkinkan Anda menggunakan pola sintaksis yang sudah dikenal untuk tugas manipulasi data. Operasi yang ditentukan melalui BigQuery DataFrames API dieksekusi di sisi server, beroperasi langsung pada data yang disimpan dalam BigQuery dan menghilangkan kebutuhan untuk mentransfer set data dari BigQuery.

Untuk memeriksa API pandas mana yang didukung oleh BigQuery DataFrames, lihat API pandas yang didukung.

Memeriksa dan memanipulasi data

Anda dapat menggunakan bigframes.pandas API untuk melakukan operasi inspeksi dan kalkulasi data. Contoh kode berikut menggunakan pustaka bigframes.pandas untuk memeriksa kolom body_mass_g, menghitung rata-rata body_mass, dan menghitung rata-rata body_mass menurut 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)
)

Library BigQuery

Library BigQuery menyediakan fungsi SQL BigQuery yang mungkin tidak memiliki padanan pandas. Bagian berikut menampilkan beberapa contoh.

Memproses nilai array

Anda dapat menggunakan fungsi bigframes.bigquery.array_agg() di library bigframes.bigquery untuk menggabungkan nilai setelah operasi 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]

Anda juga dapat menggunakan fungsi array array_length() dan array_to_string().

Buat objek struct Series

Anda dapat menggunakan fungsi bigframes.bigquery.struct() di library bigframes.bigquery untuk membuat objek struct Series baru dengan sub-bidang untuk setiap kolom dalam 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]

Mengonversi stempel waktu menjadi epoch Unix

Anda dapat menggunakan fungsi bigframes.bigquery.unix_micros() di library bigframes.bigquery untuk mengonversi stempel waktu menjadi mikrodetik 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

Anda juga dapat menggunakan fungsi waktu unix_seconds() dan unix_millis().

Menggunakan fungsi skalar SQL

Anda dapat menggunakan fungsi bigframes.bigquery.sql_scalar() di library bigframes.bigquery untuk mengakses sintaksis SQL arbitrer yang merepresentasikan ekspresi satu kolom:

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

Langkah berikutnya