TabPyを使ってみる
はじめに
こんちには。以前にTableauを利用して株価の可視化をしてみましたが、データの加工で苦戦していました。
調べたところ、TableauからPythonを実行できるTabPyという拡張機能があるようなので、TabPyを利用してデータの加工を行ってみたいと思います。
TabPyとは
TabPy(The Tableau Python Server)とは、TableauからリモートでPythonコードを実行できるようにする機能です。
Tableau上でPythonを実行するのではなく、Pythonの実行環境をTableauからRestAPIを通じて呼び出して利用します。
事前準備
利用するデータは前回の記事と同じく日経平均の過去10年分のデータとします。
TabPyはTableau Publicでは利用できないため、Tableau Desktopを利用します。
Pythonのインストール
TabPyの動作要件としてPython3.7 / 3.8 / 3.9が記載されています。
今回はサポートされている最新のバージョンである3.9を利用します。
また、TabPyの実行は仮想環境で行うことが推奨されているため、仮想環境を作成しておきます。
python -m venv tabpy
TabPyのインストール
作成したPythonの仮想環境にTabPyとPandasをインストールします。
# 仮想環境アクティベート
./tabpy/Scripts/activate
# pipのアップデート
python -m pip install --upgrade pip
# tabpyインストール
pip install tabpy tabpy_client pandas
インストールが完了したらTabPyを起動します。
tabpy
認証無しで実行してもよいか聞かれるので「y」を入力し続行します。
Web service listening on port 9004が表示されれば起動成功です。
TableauとTabPyの接続
「ヘルプ」- 「設定とパフォーマンス」-「分析拡張機能の接続の管理」を開き、TabPyを選択します。
画像の通り設定をしておきます。
自分の環境では途中からlocalhostでの接続ができなくなったため、プライベートIP指定で設定しました。
TabPyの利用
関数のデプロイ
前日比騰落率の算出をTabPyで実行するために関数を作成します。
以下の内容を記載したファイルを作成し、スクリプトを実行します。
import tabpy_client
import pandas as pd
def calc_volatility(input, period):
data = pd.Series(input)
result = data.pct_change(period[0]) * 100
result.fillna(0, inplace=True)
return result.to_list()
# TabPyサーバへ接続
client = tabpy_client.Client('http://localhost:9004/')
# 関数のデプロイ
client.deploy('Volatility', calc_volatility, override=True)
TableauからTabPyの利用
前日比騰落率の計算フィールドを以下のように変更します。
SCRIPT_REAL("return tabpy.query('Volatility',_arg1,_arg2)['response']", SUM([日経平均株価]), [移動平均の期間])
特にエラーなどが発生しなければこれでTabPyへの切り替えは終了です。
TabPyサーバには以下のような実行時のログが出力されていると思います。
(base_handler.py:base_handler:115): function to evaluate=def _user_script(tabpy, _arg1, _arg2):
return tabpy.query('Volatility',_arg1,_arg2)['response']
TabPyハマりポイント
TabPyを使ってみたところ、いくつかハマりポイントがありました。
パラメータも配列で渡される
パラメータを他のカラムと一緒に引数でTabPyに渡した場合、list型として渡されます。
例えば、10というパラメータを長さの5のカラムと渡した場合は[10,10,10,10,10]という配列がPythonに渡されます。計算フィールドの制約を受ける
TabPyは計算フィールドから利用することになるため、クエリパイプラインを考慮する必要があります。
また、集計と非集計を混在されることができず、引数としてどんな値でも渡せるというわけではないようです。戻り値のFillが必要
Pythonで値を返す際にlist型の中にnanが含まれている場合はエラーになりました。
想定する戻り値の型に合わせてnanをFillする必要があります。
おわりに
TabPyを触ってみましたが、いくつか制約があることがわかりました。
データ加工を全てTableau上で行うということは難しいようです。
業務やチーム等の複数人でTableauを利用する環境下では、TabPyを利用することで
計算処理の一元管理
Tableau上で計算を実行している場合は、処理をPythonで一元管理することでヒューマンエラーの発生を抑制できますTableauにはない分析機能の追加
scikit-learn等のPythonの強力な計算ライブラリを利用することで高度な計算を実装できますデータソースへの接続の高速化
Tableauで全てのデータを読み込むと処理が遅延するような場合、TabPyでデータ取得や計算処理を外出しすることで高速化することができます
特に取得したいデータが動的に変化する場合に有用かと思います
等のメリットがあります。
Pythonの知識がないユーザでも簡単にPythonの恩恵を得られるようになるのは大きいですね。
この記事が気に入ったらサポートをしてみませんか?