שינוי נתונים באמצעות BigQuery DataFrames

במאמר הזה מוסבר על היכולות של טיפול בנתונים שזמינות ב-BigQuery DataFrames. אפשר למצוא את הפונקציות שמתוארות בספרייה bigframes.bigquery.

התפקידים הנדרשים

כדי לקבל את ההרשאות שדרושות לביצוע המשימות שמתוארות במסמך הזה, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים בפרויקט:

להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.

כשמבצעים אימות של משתמשי קצה בסביבה אינטראקטיבית כמו מחברת, Python REPL או שורת הפקודה, BigQuery DataFrames מציג בקשה לאימות, אם צריך. אחרת, במאמר איך מגדירים Application Default Credentials מוסבר איך עושים את זה בסביבות שונות.

pandas API

תכונה חשובה של BigQuery DataFrames היא שממשק bigframes.pandas API דומה לממשקי API בספריית pandas. העיצוב הזה מאפשר להשתמש בדפוסי תחביר מוכרים למשימות של מניפולציה של נתונים. פעולות שמוגדרות באמצעות BigQuery DataFrames API מבוצעות בצד השרת, ופועלות ישירות על נתונים שמאוחסנים ב-BigQuery. כך אין צורך להעביר מערכי נתונים מ-BigQuery.

כדי לבדוק אילו ממשקי API של pandas נתמכים על ידי BigQuery DataFrames, אפשר לעיין במאמר בנושא ממשקי API נתמכים של pandas.

בדיקה ומניפולציה של נתונים

אתם יכולים להשתמש ב-bigframes.pandas API כדי לבצע פעולות של בדיקת נתונים וחישובים. בדוגמת הקוד הבאה נעשה שימוש בספרייה bigframes.pandas כדי לבדוק את העמודה body_mass_g, לחשב את הממוצע body_mass ולחשב את הממוצע body_mass לפי 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)
)

ספריית BigQuery

ספריית BigQuery מספקת פונקציות BigQuery SQL שאולי אין להן פונקציות מקבילות ב-pandas. בקטעים הבאים מוצגות כמה דוגמאות.

עיבוד ערכי מערך

אפשר להשתמש בפונקציה bigframes.bigquery.array_agg() בספרייה bigframes.bigquery כדי לצבור ערכים אחרי פעולת 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]

אפשר גם להשתמש בפונקציות המערך array_length() ו-array_to_string().

יצירת אובייקט Series struct

אפשר להשתמש בפונקציה bigframes.bigquery.struct() בספרייה bigframes.bigquery כדי ליצור אובייקט חדש של struct‏ Series עם שדות משנה לכל עמודה ב-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]

המרת חותמות זמן לראשית זמן יוניקס (Unix epoch)

אפשר להשתמש בפונקציה bigframes.bigquery.unix_micros() בספרייה bigframes.bigquery כדי להמיר חותמות זמן למיקרו-שניות לפי תקופת הזמן של מערכת 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

אפשר גם להשתמש בפונקציות הזמן unix_seconds() ו-unix_millis().

שימוש בפונקציית סקלר של SQL

אפשר להשתמש בפונקציה bigframes.bigquery.sql_scalar() בספרייה bigframes.bigquery כדי לגשת לתחביר SQL שרירותי שמייצג ביטוי של עמודה אחת:

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

המאמרים הבאים