• home
  • about
  • 全ての投稿
  • ソフトウェア・ハードウェアの設定のまとめ
  • 分析関連のまとめ
  • ヘルスケア関連のまとめ
  • 生涯学習関連のまとめ

pandas-gbq

date: 2021-05-28 excerpt: pandas-gbqの使い方について

tag: pandaspandas-gbq


pandas-gbqの使い方について

  • 簡単にpandasとbigqueryを結合できる
  • 最初に認証を通す必要がある
    • 使えるクレデンシャルがない場合、~/.config/pandas_gbq/bigquery_credentials.datにユーザ認証で通した一時的なクレデンシャルが作成される
  • データのアップロード時には予めbq mk ~でバケットを作成する必要がある
  • あまり大きなデータをダウンロードできない
  • use_bqstorage_api=Trueでダウンロードを高速化できる

インストール

$ python3 -m pip install pandas-gbq

データのクエリとダウンロード

query = f"""
    SELECT
	  *
    FROM
      `bigquery-public-data.covid19_nyt.excess_deaths`
	LIMIT 1000
"""
projectid = 'starry-lattice-256603'
df = pd.read_gbq(query, projectid, dialect='standard', use_bqstorage_api=True)

データのアップロード

project_id = "starry-lattice-256603"
table_ida = "any_bucket.target_table01"
df.to_gbq(table_id, project_id=project_id, if_exists="replace")

認証

クレデンシャル(サービスアカウントの認証情報)を用いて初期化する

  • AWSでbigqueryにアクセスするときなどに必要な措置
  • google.oauth2には以下のライブラリが必要
    • google-api-python-client google-auth-httplib2 google-auth-oauthlib
import pandas_gbq
from google.oauth2 import service_account

pandas_gbq.context.credentials = (
  service_account.Credentials.from_service_account_file("path_of_creds.json")
)

対話式のUIでクレデンシャルを初期化する

  • ユースケース
    • キャッシュに保存されたクレデンシャルを再設定したい時
    • 明示的に、driveのスコープを有効化する時
import pydata_google_auth
SCOPES = [
    'https://www.googleapis.com/auth/cloud-platform',
    'https://www.googleapis.com/auth/drive',
]
credentials = pydata_google_auth.get_user_credentials(
    SCOPES,
    auth_local_webserver=False,
    # credentials_cache=pydata_google_auth.cache.NOOP, # 有効化すると、明示的にキャッシュを使用しない
)
pd.read_gbq(query, projectid, dialect='standard', use_bqstorage_api=True, credentials=credentials)

キャッシュされたユーザ認証のクレデンシャルを明示的に使う

from pathlib import Path
import pandas as pd
import pydata_google_auth

credentials = pydata_google_auth.load_user_credentials(
    Path("~/.config/pandas_gbq/bigquery_credentials.dat").expanduser()
)


df = pd.read_gbq(query, projectid, dialect="standard", credentials=credentials, use_bqstorage_api=True)
  • 自動で優先されるGOOGLE_APPLICATION_CREDENTIALSが設定されてしまっているときなどに有効

dockerのコンテナと認証情報を共有する

  • dockerでpandas_gbqを使用している際に、クレデンシャルをローカルと共有し、テストを通すために必要
$ docker run -v ~/.config/pandas_gbq/:/root/.config/pandas_gbq -it <container-name>

use_bqstorage_apiオプションについて

  • このオプションを有効化するとダウンロードが高速化する
  • bqstorageの機能を使うには bigquery.readsessions.create, bigquery.readsessions.getData, bigquery.readsessions.updateの権限がIAMに設定されている必要がある

トラブルシューティング

クレデンシャルを適切に設定しているのpermission errorが発生する

  • GOOGLE_APPLICATION_CREDENTIALSの環境変数が設定されているとキャッシュよりそちらを優先してしまう
  • jupyter等を起動する前に$ unset GOOGLE_APPLICATION_CREDENTIALSして環境変数を削除している必要がある
    • jupyter内で!echo $GOOGLE_APPLICATION_CREDENTIALSすることで設定状況を確認することができる


pandaspandas-gbq Share Tweet