PyGWalkerとは
PyGWalkerはPandasのDataFrameをTableau風のGUIで探索・可視化できるPythonライブラリです。
オープンソースソフトウェアとして開発されていてソースコードはGitHubで公開されています。
なお、READMEによると、
"Pig Walker"のように発音
…だそうです。
インストール
インストール手順は公式ドキュメントに記載されています。
pip install pygwalker
自分はAnaconda環境で構築しましたが、Anaconda環境が古すぎて失敗してしまったので、そのアップデートから実施しました。
また、今回はStreamlit上でPyGWalkerを起動させるので、Streamlitもインストールしておきます。
conda update -n base conda
conda install pandas
pip install pygwalker
pip install streamlit
Streamlit上でPyGWalkerを起動させる
以下のようなプログラムを作成します。
import pygwalker as pyg
import pandas as pd
import streamlit.components.v1 as components
import streamlit as st
import random
import datetime
# 今回のデータ生成に使う関数
def distance(x, y):
# 東京タワーの座標を基準に値を生成する
_x = 139.745433
_y = 35.658581
return ((x - _x)**2 + (y - _y)**2)**0.5
# ランダムなデータをnum_rows行を生成する
num_rows = 3000
df = pd.DataFrame(index=range(num_rows), columns=['名称', '緯度', '経度'])
df['名称'] = [''.join(random.choices('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', k=7)) for i in range(num_rows)]
df['緯度'] = [random.uniform(34, 38) for i in range(num_rows)]
df['経度'] = [random.uniform(135, 141) for i in range(num_rows)]
df['距離'] = [distance(df['経度'][i], df['緯度'][i]) for i in range(num_rows)]
df['カテゴリ'] = [random.randint(1, 10) for i in range(num_rows)]
df['バリュー'] = [random.random() * 100 for i in range(num_rows)]
# Streamlitページの幅を調整する
st.set_page_config(layout="wide")
# Pygwalkerを使用してHTMLを生成する
pyg_html = pyg.walk(df, env='Streamlit', return_html=True, dark='light')
# HTMLをStreamlitアプリケーションに埋め込む
components.html(pyg_html, width=1300, height=1000, scrolling=True)
PyGWalkerに分析したいデータソースをPandasのDataFrameとして渡してあげる必要があります。TableauのようにデータソースをGUIで柔軟に選択するものではないということですね。
pyg_html = pyg.walk(df, env='Streamlit', return_html=True)
また、PyGWalkerそのものにはWebアプリをホスティングする機能はありません。その代わりにGUIを実現するHTMLのソースコードを出力してくれるので、これをStreamlit上に埋め込んであげることで、ユーザにGUIを提供することができます。
components.html(pyg_html, width=1300, height=1000, scrolling=True)
起動方法は通常のStreamlitアプリと同様にstreamlit run
します。
streamlit run pygapp.py
GUIの操作例
PyGWalkerのGUIの操作方法(の一部)は以下の通りです。
例えば、初期状態から、
(1) 地図へのプロットに切り替えて
(2) 緯度
と経度
をDimensionsに変更して
(3) 緯度
をLatitude、経度
をLongitudeに指定して
(4) 地図を日本にスライドさせて
(5) プロットする点の色を距離
の値に応じて変えて
(6) バリュー
の値が50以上の点のみプロットするようにフィルタする
簡単ですね。
もっと詳しく使い方を知りたい!
インストール手順でも紹介した公式ドキュメントにある程度記載されています。
また、PyGWalkerを紹介しているいくつかの動画で具体的な操作を確認することができます。
PyGWalkerのアップデート
GUIの右上の方に半透明で「UPDATE (バージョン番号)↑」という表示が出ることがあります。
新しいバージョンがリリースされているので、必要に応じてアップデートしてあげましょう。
アップデートは一般的なPythonライブラリと同様にpip
を使います。
pip install -U pygwalker
追記
大規模なデータセットを扱う場合はwalk
の代わりにuse_kernel_calc=True
オプションを指定したinit_streamlit_html
を使うことで高速化できるとのことです。
このオプションを使うときにはinit_streamlit_comm
という初期化関数を呼んでおく必要があります。
ObservedObserverさん、コメントありがとうございます。
また、より大規模なデータセットを扱う場合は、Snowflakeに処理をプッシュできるプラグインがあるとのことです。(内部的にはSQLAlchemyを使っていそう)
Snowflake上のテーブルをPyGWalkerで探索できる、ということですね!