PyGWalker超入門【Streamlit編】

# PyGWalkerとは

PyGWalkerはPandasのDataFrameをTableau風のGUIで探索・可視化できるPythonライブラリです。  
オープンソースソフトウェアとして開発されていてソースコードはGitHubで公開されています。  

なお、[README](https://github.com/Kanaries/pygwalker/blob/main/docs/README.ja.md)によると、
> "Pig Walker"のように発音  

…だそうです。

## インストール

インストール手順は[公式ドキュメント](https://docs.kanaries.net/ja/pygwalker/installation)に記載されています。

https://docs.kanaries.net/ja/pygwalker/installation

```raw
pip install pygwalker
```

自分はAnaconda環境で構築しましたが、Anaconda環境が古すぎて失敗してしまったので、そのアップデートから実施しました。  
また、今回はStreamlit上でPyGWalkerを起動させるので、Streamlitもインストールしておきます。  

```raw
conda update -n base conda
conda install pandas
pip install pygwalker
pip install streamlit
```

## Streamlit上でPyGWalkerを起動させる

以下のようなプログラムを作成します。  

```py:pygapp.py
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で柔軟に選択するものではないということですね。  

```py:pygapp.py (抜粋)
pyg_html = pyg.walk(df, env='Streamlit', return_html=True)
```

また、PyGWalkerそのものにはWebアプリをホスティングする機能はありません。その代わりにGUIを実現するHTMLのソースコードを出力してくれるので、これをStreamlit上に埋め込んであげることで、ユーザにGUIを提供することができます。  

```py:pygapp.py (抜粋)
components.html(pyg_html, width=1300, height=1000, scrolling=True)
```

起動方法は通常のStreamlitアプリと同様に```streamlit run```します。

```raw
streamlit run pygapp.py
```

## GUIの操作例

PyGWalkerのGUIの操作方法(の一部)は以下の通りです。  

![pygwalker-manual.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/158f6aac-3337-b40e-69ea-188e176f26c7.png)

例えば、初期状態から、  
![pygwalker-train1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/834b7c1b-964e-9c81-2f7d-17ede011e33b.png)
(1) 地図へのプロットに切り替えて
![pygwalker-train2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/e845be1b-2ae2-1fb4-eee5-0ad61aa17697.png)
(2) ```緯度```と```経度```をDimensionsに変更して
![pygwalker-train3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/332f7ede-acf3-56b5-9d52-44526f674fe8.png)
(3) ```緯度```をLatitude、```経度```をLongitudeに指定して
![pygwalker-train4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/927e5191-ada1-53c7-a8b1-6300cb8d5ce9.png)
(4) 地図を日本にスライドさせて
![pygwalker-train5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/da5e3a36-e18e-d7c7-da9b-775dea31ec72.png)
(5) プロットする点の色を```距離```の値に応じて変えて
![pygwalker-train6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/5bc3c6ae-a510-c8f5-cb7a-563336d95d39.png)
(6) ```バリュー```の値が50以上の点のみプロットするようにフィルタする
![pygwalker-train7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/7076900f-7109-0bdc-c5be-fa2e3f1034ed.png)

簡単ですね。  

## もっと詳しく使い方を知りたい！

インストール手順でも紹介した[公式ドキュメント](https://docs.kanaries.net/ja/pygwalker)にある程度記載されています。  

https://docs.kanaries.net/ja/pygwalker

また、PyGWalkerを紹介しているいくつかの動画で具体的な操作を確認することができます。  

https://www.youtube.com/watch?v=ogyxjkYRgPE

https://www.youtube.com/watch?v=Ynt7Etci1KU

## PyGWalkerのアップデート

GUIの右上の方に半透明で「UPDATE (バージョン番号)↑」という表示が出ることがあります。  
![pygwalker-update.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/336dad2c-d2c8-7ef0-c4bc-985999e55235.png)

新しいバージョンがリリースされているので、必要に応じてアップデートしてあげましょう。  
アップデートは一般的なPythonライブラリと同様に```pip```を使います。  

```raw
pip install -U pygwalker
```

## 追記

大規模なデータセットを扱う場合は```walk```の代わりに```use_kernel_calc=True```オプションを指定した```init_streamlit_html```を使うことで高速化できるとのことです。  
このオプションを使うときには```init_streamlit_comm```という初期化関数を呼んでおく必要があります。  
ObservedObserverさん、コメントありがとうございます。  

参考：[Streamlit API](https://docs.kanaries.net/ja/pygwalker/api-reference/streamlit)

https://docs.kanaries.net/ja/pygwalker/api-reference/streamlit

また、より大規模なデータセットを扱う場合は、Snowflakeに処理をプッシュできるプラグインがあるとのことです。(内部的にはSQLAlchemyを使っていそう)  
Snowflake上のテーブルをPyGWalkerで探索できる、ということですね！  

参考：[PyGWalkerとSnowflake API](https://docs.kanaries.net/ja/pygwalker/api-reference/snowflake)

https://docs.kanaries.net/ja/pygwalker/api-reference/snowflake