PyGWalkerとStreamlitでBigQueryからデータを取ってきてごにょごにょする簡易EDAツールを作ってみた
モチベーション
- PyGWalkerをColabratory上で実行してBigQueryのデータをいじるのが便利だったが、ColabのUIがちょっと煩わしくに感じるときもある
- ColabとPyGWalkerUIが別々にスクロールする
- PyGWalker以外のUIがEDAをするにあたっては不要
- StreamlitでシュッとPyGWalkerを動かせるっぽいので、勉強がてら作ってみたくなった
- 結局作ってみた結果個人的には「Jupyterでいいや」となったが、そう思った理由の整理等をまとめておきたい
要素技術
PyGWalker+Streamlitの事例はすでにいっぱいあるので、簡単に記載します。
- PyGWalker: Dataframeを与えるとTableauライクなUIで可視化をできるPythonライブラリ
- Streamlit: 簡便なWebアプリを構築・ホストできるPythonライブラリ
- BigQuery: Google CloudのDWHサービスで、今回のデータソース
想定ユースケースと完成イメージ
想定ユースケースとしては、BigQueryで取得したデータをPyGWalkerでアドホックに可視化する場合を想定しました。
- 何らかの画面でクエリを入力してデータをロードする
- 1.でロードしたデータをPyGWalkerでEDAできる
完成イメージとしては公式ページや先行記事等にあるPyGWalker+Streamlitの構成をベースにBigQueryからデータをロードできるようにするだけ。
実際に作ってみた
使い方
-
READMEの環境構築を済ませてstreamlitを起動し、
localhost:8501
にアクセスすると、トップページに飛びます
-
loaderに移動し、クエリを入力して「ロードする」を実行します。
pygwalkerのspec(後述)をJSONとして保存している場合は、復帰用にロードできるようにしています。
-
explorerに移動してPyGWalkerに触れるようになります。
この画面で「export_code」から取得できるJSONが2.で利用できるspecになります。
工夫した・躓いた点
StreamlitのSession State
(理解がまだ浅いので間違っていたらすいません)Streamlitでは、ページをロードするたびに変数は基本的にリセットされてしまうようです。
なので、「loaderページでBigQueryからデータをロードしたは良いけど、その後explorerページに遷移するとデータが消えてる。。。」という状態が発生してしまいました。
このような場合に、セッション内で変数を保持しておく機能がSession Stateで、それを利用してBigQueryから取得したデータを保持するようにしました。
ページ分け
もともとPyGWalkerのUIだけに集中したかったので、他のUIが混じらないようなページ構成にするようにしました。
1ページにUIだけ表示されて個人的には満足しました。
作ってみた感想
なんだかんだColabで良い気がしてきた。。
下記点がColabのほうが優れているので、なんだかんだ良い気がした
GoogleCloudへの認証が楽
Colabでは↓を実行するだけで、認証を通せます。
from google.colab import auth
auth.authenticate_user()
対して、今回作ったツールはgcloudを入れてログインする必要があります。。
Colabのほうがファイル管理が楽
ColabであればGoogleDrive上でよしなに管理できます。
今回作ったツールではJSONとクエリをどこかにいい感じに保存しておく必要があります。
試していないですが、ついでにColabの自動保存を考えるとブラウザが落ちた場合の復旧もColabが有利だったり。。?
とはいえ勉強にはなった()
- Streamlitに触れた
- 業務内だとなかなか試しづらい
使えそうなところメモ
PyGWalker+Streamlitには簡易EDAツールのほか、簡易的なBIツール/ダッシュボードツールとしての利用もありそうな気がした。
- (EDAツール)SQLやシステムに不慣れなユーザー向けに、各種KPI等を自由に組み合わせて可視化できる環境
- (EDAツール)アナリストが高速にEDA・可視化を行うための環境(これは上述の通りColab/Jupyterで良い気もする)
- (ダッシュボード)可視化内容まですべてをコード管理したダッシュボード環境
Discussion