notebook

都内でWEB系エンジニアやってます。

Google ColaboratoryとPyGWalkerでBigQueryのデータを読み込む

手元のデータとか、あまりクラウドに上げて共有したくないような情報があるデータとかをグラフなどで可視化しながら考察したいみたいなとき

今までは対象データをCSVにしてLookerStudioのCSVアップロードでアップして色々可視化してみるっていう流れが多かったが、最近DuckDBを触ってみたらよかったので触発されて他の方法も試してみようかという気持ちになった

Colaboratory + PyGWalker

いったんこの組み合わせでやってみようという感じになった

理由は

  • 自身でサーバを立てるなどの用意をしなくて良い
  • BigQueryやスプレッドシートなど、Google関連サービスとの連携しやすさ
  • 可視化ツールやプロット系のライブラリとの相性
    • PyGWalkerもそうだが、データを読ませて可視化のUIを表示します、UI上でがちゃがちゃしてさまざまな種類のグラフをインタラクティブに作れます!っていう感じのことをやってみたかった
    • そういうUIをライブラリ単体で提供しているパターンが少なそうで(単に見つけられなかっただけかもしれない)notebook系なら使えますというのが多かったため
  • PyGWalkerはいくつか調べた中でUIが良さそうだったため

PyGWalker

公式サンプルやスクショ見るのがわかりやすいと思うが次のように各種データの統計情報だったり、どの値が何割とかそういう情報もさっとみれる

Tableau風のUIでインタラクティブにさまざまなグラフ描画を行える

sample

  • 認証
from google.colab import auth
auth.authenticate_user()
  • ライブラリのインストール
!pip install pygwalker duckdb
  • ライブラリの読み込み
import pygwalker as pyg
import duckdb
from google.cloud import bigquery
  • 実行
client = bigquery.Client(project="project-111111")
table = bigquery.TableReference.from_string("project-111111.dataset.table")

query = f"select * from `{table}`"
rows = client.query(query)
results = rows.to_arrow(create_bqstorage_client=True)

con = duckdb.connect()
df = con.execute('select * from results r join additional_data.json p on(p.date = r.date)').df()

pyg.walk(df)

DuckDBをかませているのは、BigQueryのクライアントライブラリのクエリ結果からのto_dataframe()でもdataframeを生成できるが、この方法でPyGWalkerに読ませると日付系のデータが対応してないよというようなエラーにあってしまったため

多少冗長ではあるがほぼワンショットの実行だろうし、毎度日付系のデータがあったら変換し直すっていうのも微妙だし、DuckDBで手元のJSONやCSVなどを読ませて組み合わせるとかも可能になるのでこのようにした(サンプルは日毎のデータをJSONにしてJOINさせている)

おわり

以下所感

  • PyGWalker良いんだけど、操作に慣れる必要があるのと、見たいグラフにたどり着くまでに結構操作がいる
    • さらに、ちょっとデータの絞り込みをしてから再度グラフを見たいっていうときにColabで再実行してGUIが出てくるのを待って…グラフを作り直して…という感じで結構時間がかかる
    • 日付のドリルダウンとかをよしなにやりたいケースでは日付だけあればLookerStudioならdaily,monthlyなどドリルアップ/ダウンできるがそこまでの機能はなさそうだった

データの概要をいくつかグラフ化して把握するとかの用途だと良さそうかなーという印象だった

あと、自分がnotebook形式の操作にあんまり慣れていないというのもありそうかなーと思いつつ、ちょっとしっくりこないかもなーというケースもそれなりにあった

引き続きいろいろ試してみたい