AlteryxのPythonツールで自作のスクリプトを使いたい

こんにちは、小澤です。

AlteryxのPythonツールでは標準でいくつかのライブラリが含まれていますが、それ以外に利用したいものがある場合インストールが必要です。 その方法は、PythonツールないのJuypter Notebookにデフォルトで記載されているように以下のような処理を実行します。

from ayx import Package
Package.installPackages(['<package1>', '<package2>'])

この処理は内部的にはpipコマンドを呼び出しているため、PyPIに登録されていたり、利用可能な形式でGitで管理されてたりなどであれば利用可能です。

今回は、そこまでしていないちょっとした自作の関数やクラスを使いたいときにどうするか、を解説します。

sys.pathとライブラリの読み込み

Pythonでライブラリ読み込み対象のパスを指定したい場合は、sys.path変数に値を追加します。 sys.pathはlistなので、AlteryxのPythonツール上で以下のような処理を実行することでお手製ライブラリのインポートが可能になります。

import sys
sys.path.append('<ライブラリのパス>')

さて、問題はこの"ライブラリのパス"にどのようにファイルを配置して、どのパスをしてするのかですね。 この辺りはPythonの仕様に従えば問題ありません。

niino というフォルダを作ってその中に以下のようにファイルを配置しました。

niino.py の中身は以下のようになっています。

import pandas as pd

def niino():
    df = pd.DataFrame({'id': [1, 2], 'name' : ['niinoman', 'robot-niinoman']})
    return df

Pandasを使って簡単なデータフレームを作成してそれを返しているだけです。

__init__.py は何も記述されていない空のファイルです。 今回は、Pythonの仕様に関する詳細には立ち入りませんが、このファイルを配置することによってこのフォルダの中の.pyファイルを他から読み込めるように設定しています。

これで準備は完了です。 この niino フォルダをsys.pathに追加します。

import sys
sys.path.append('/path/to/niino')

以下のようにワークフローと同じ階層に niino フォルダを配置したのち、 Alteryxから定数として利用可能なワークフローのパスを利用して以下のように指定しました。

ワークフローと同じ階層に置くことは必須ではなく、任意の場所においてそのパスを指定すればいいのですが、今回はこの後のことを考えてこのような使い方にしています。

sys.pathの設定をしたくない場合は

ここで少し余談です。

実はsys.pathに追加する設定をしなくても大丈夫な方法もあります。 ayx などのパッケージはこのような設定をしなくてもそのままインポートできていますね。 このほかにもAlteryxのPythonツールにはいくつか標準で含まれているパッケージがありますし、冒頭の Package.installPackages で追加したものに関してもこの設定は必要ありません。

実は、特に設定しなくても標準でsys.pathに含まれているパスが存在しています。 AlteryxのPythonツールはそれ用のvenv環境が作成されているため、その環境の中にインストールされたライブラリを入れておくパスは標準で含まれているというわけです。

そのパスというのが <Alteryxのインストールフォルダ>\bin\Minoconda3\envs\JupyterTool_vEnv になります。 Admin版Alteryx Designerの標準のパスであれば C:\Program Files\Alteryx\bin\Miniconda3\envs\JupyterTool_vEnv になります。

Admin版は管理者権限で実行しないとライブラリの追加ができない理由もここに追加されるためです。

Package.installPackages を使ってインストールしたライブラリはこのvenv環境内の Lib\site-packages 内に追加されます。 そのため、実は先ほどの niino フォルダを直接この中に配置することでsys.pathを追加しなくても利用可能になります。

追加したものを他の環境でも使えるようにする

さて、このようにして追加したものですが、ワークフローを移動させたり他の人に渡したりする際には一緒に渡して、配置する場所を伝える必要があります。

これは、少々面倒でうっかり渡し忘れるなどのミスにつながるものなので、できれば簡略化したいですね。

そこで利用できるのがAsset機能です。 以下のように、Pythonツールの「User added assets」に niino フォルダ以下の各種ファイルを追加してやります

ツールのメニューにAssetsがない場合はメニューのOptions > User Settings > Edit User Settingsにて、Advancedタブの「Display Asset Management in Properties Windwos」にチェックを入れてください。

この状態で、ワークフローをエクスポートして.yxzpファイルを作成すると、 niino フォルダもまとめてパッケージングされます。

Pythonの処理では、 Engine.WorkflowDirectory を使ってパスを指定しているため、 その部分がワークフローが実際に保存されているパスに切り替わり、yxzpを展開すればそのまま実行可能な状態となっています。

また、yxzpによるパッケージングの仕組みは、Alteryx Serverへアップロードする際にも利用されている物のため、 このユーザアセットによる管理を行っておけば、Alteryx Serverにアップロードした際にものそのまま実行可能な状態となります。

一点だけ注意が必要な部分としては、Pythonファイルに変更が加わった場合です。 yxzpの実態はzipファイルでワークフローとアセットをまとめたものとなります。 そのため、複数のワークフローで同じライブラリを利用している場合などはこの管理方法だと、すべてワークフローで変更を反映させたのちアップロードしなおす必要が生じます。

そのあたりまで管理したい場合は素直にバージョン管理しつつpipでインストール可能な形式にしてしまうのがいいでしょう。

おわりに

今回は、AlteryxのPythonツールを使う際に独自のスクリプトを読み込ませる方法を紹介しました。

Pythonで記述された様々な分析処理が既に存在していて、 Alteryxでもそのまま使える状態にしたいなどの際にはお試しください。

Alteryxの導入なら、クラスメソッドにおまかせください

日本初のAlteryxビジネスパートナーであるクラスメソッドが、Alteryxの導入から活用方法までサポートします。14日間の無料トライアルも実施中ですので、お気軽にご相談ください。

alteryx_960x400