【小ネタ】AlteryxのPython SDKでデータ全体に対する処理を行う

こんにちは、小澤です。

AlteryxのPython SDKでは、IncomingInterfaceのii_push_recordメソッドが入力データ1行1行に対する処理を行っていました。

しかし、集計処理などのような、個々のレコードではなく全体を見る必要がある処理を実装する必要がある場合どのようにすればいいのでしょか? 今回は、そんな内容を扱っていきます。

処理終了時に呼び出されるメソッド

Python SDKでは、上記のようにii_push_recordメソッドを利用して1行1行に対する処理を行っていくのが基本的な流れとなります。

それでは、個々のレコード単位でしか処理ができないのか?というと実はそんなことはありません。

Python SDKでは全レコードに対する処理が終わった際に、終了処理としてii_closeが呼び出されます。 この性質を利用することで、以下のような処理が可能になります。

合計や平均を計算する

データ全体の合計値や平均値を計算するには以下のような手順になります。

  • コンストラクタ(__init__)で合計値とデータ件数を保持するための変数を0に初期化する
  • ii_push_recordで計算対象の列の値を取り出して合計値やデータ件数の追加を行う
  • ii_closeで合計/件数をoutput_anchorに合計値を出力する

グループごとに計算をする

続いて単純な全体合計などの計算ではなく、Group Byを指定したような計算の場合を考えてみます。 とはいっても考え方は同じです。

  • コンストラクタでdict型の変数を初期化する
  • ii_push_recordで現在のグループ化対象の値をキーとして値を取得
  • その値に新規レコード分の計算結果をくわえる
  • ii_closeでループ処理をしてキーの数だけ結果をoutput_anchorに出力する

Summarizeツールに用意されていないProduct関数的なことをするツールの作成なんかもこれで可能でしょう。 また、pre_sortを利用したりなどとこの過去の値を保持しておく方法を利用すれば、ウインド関数的な動きをする処理の実装も可能です。

おわりに

今回は、AlteryxのPythonSDKで個々のレコードではなく全体をみて計算する必要がある場合のやり方を解説しました。

このようなやり方はプログラムを書いていれば比較的思いつきやすいやり方ではありますが、 応用範囲は広いものになるかと思います。 ただし、実際にやるときはデータが大規模になってメモリに乗りきらない可能性とか考慮しなくいい?とか考える必要がある場面にも遭遇するかもしれません。

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

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

alteryx_960x400