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を選択します。
画像の通り設定をしておきます。

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を使ってみたところ、いくつかハマりポイントがありました。

  1. パラメータも配列で渡される
    パラメータを他のカラムと一緒に引数でTabPyに渡した場合、list型として渡されます。
    例えば、10というパラメータを長さの5のカラムと渡した場合は[10,10,10,10,10]という配列がPythonに渡されます。

  2. 計算フィールドの制約を受ける
    TabPyは計算フィールドから利用することになるため、クエリパイプラインを考慮する必要があります。
    また、集計と非集計を混在されることができず、引数としてどんな値でも渡せるというわけではないようです。

  3. 戻り値のFillが必要
    Pythonで値を返す際にlist型の中にnanが含まれている場合はエラーになりました。
    想定する戻り値の型に合わせてnanをFillする必要があります。

おわりに

TabPyを触ってみましたが、いくつか制約があることがわかりました。
データ加工を全てTableau上で行うということは難しいようです。
業務やチーム等の複数人でTableauを利用する環境下では、TabPyを利用することで

  • 計算処理の一元管理
    Tableau上で計算を実行している場合は、処理をPythonで一元管理することでヒューマンエラーの発生を抑制できます

  • Tableauにはない分析機能の追加
    scikit-learn等のPythonの強力な計算ライブラリを利用することで高度な計算を実装できます

  • データソースへの接続の高速化
    Tableauで全てのデータを読み込むと処理が遅延するような場合、TabPyでデータ取得や計算処理を外出しすることで高速化することができます
    特に取得したいデータが動的に変化する場合に有用かと思います

等のメリットがあります。
Pythonの知識がないユーザでも簡単にPythonの恩恵を得られるようになるのは大きいですね。

この記事が気に入ったらサポートをしてみませんか?