BigQuery DataFrames로 데이터 조작

이 문서에서는 BigQuery DataFrames에서 사용할 수 있는 데이터 조작 기능을 설명합니다. bigframes.bigquery 라이브러리에서 설명된 함수를 찾을 수 있습니다.

필요한 역할

이 문서의 태스크를 완료하는 데 필요한 권한을 얻으려면 관리자에게 프로젝트에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.

역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.

커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.

노트북, Python REPL 또는 명령줄과 같은 대화형 환경에서 최종 사용자 인증을 수행할 때 BigQuery DataFrames에서 필요한 경우 인증을 요청하는 메시지를 표시합니다. 그렇지 않은 경우 다양한 환경에서 애플리케이션 기본 사용자 인증 정보를 설정하는 방법을 참조하세요.

pandas API

BigQuery DataFrames의 주목할 만한 기능은 bigframes.pandas API가 Pandas 라이브러리의 API와 유사하도록 설계되었다는 점입니다. 이 설계를 사용하면 데이터 조작 작업에 익숙한 구문 패턴을 사용할 수 있습니다. BigQuery DataFrames API를 통해 정의된 작업은 서버 측에서 실행되며 BigQuery 내에 저장된 데이터를 직접 조작하므로 BigQuery에서 데이터 세트를 전송할 필요가 없습니다.

BigQuery DataFrames에서 지원하는 Pandas API를 확인하려면 지원되는 Pandas API를 참고하세요.

데이터 검사 및 조작

bigframes.pandas API를 사용하여 데이터 검사 및 계산 작업을 수행할 수 있습니다. 다음 코드 샘플은 bigframes.pandas 라이브러리를 사용하여 body_mass_g 열을 검사하고 평균 body_mass를 계산하며 species로 평균 body_mass를 계산합니다.

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 라이브러리는 pandas에 상응하는 함수가 없는 BigQuery SQL 함수를 제공합니다. 다음 섹션에서는 몇 가지 예를 보여줍니다.

배열 값 처리

bigframes.bigquery 라이브러리의 bigframes.bigquery.array_agg() 함수를 사용하여 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 객체 만들기

bigframes.bigquery 라이브러리의 bigframes.bigquery.struct() 함수를 사용하여 DataFrame의 열마다 하위 필드가 있는 새 구조체 Series 객체를 만들 수 있습니다.

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]

타임스탬프를 유닉스 시간으로 변환

bigframes.bigquery 라이브러리의 bigframes.bigquery.unix_micros() 함수를 사용하여 타임스탬프를 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 라이브러리에서 bigframes.bigquery.sql_scalar() 함수를 사용하여 단일 열 표현식을 나타내는 임의의 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

다음 단계