Memanipulasi data dengan BigQuery DataFrames

Dokumen ini menjelaskan kemampuan manipulasi data yang tersedia dengan BigQuery DataFrames. 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, Python REPL, 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 yang dirancang agar mirip dengan API di library pandas. Desain ini memungkinkan Anda menggunakan pola sintaksis yang familiar 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 keluar dari BigQuery.

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

Memeriksa dan memanipulasi data

Anda dapat menggunakan bigframes.pandas API untuk melakukan operasi pemeriksaan dan perhitungan data. Contoh kode berikut menggunakan bigframes.pandas library untuk memeriksa kolom body_mass_g, menghitung body_mass rata-rata, dan menghitung body_mass rata-rata berdasarkan 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 pandas yang setara. Bagian berikut menyajikan beberapa contoh.

Memproses nilai array

Anda dapat menggunakan fungsi bigframes.bigquery.array_agg() di bigframes.bigquery library untuk menggabungkan nilai setelah operasi groupby operation:

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().

Membuat objek Series struct

Anda dapat menggunakan fungsi bigframes.bigquery.struct() di library bigframes.bigquery untuk membuat objek Series struct baru dengan subkolom untuk setiap kolom di 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 ke 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 bigframes.bigquery library untuk mengakses sintaksis SQL arbitrer yang mewakili 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