Alteryx特有の課題について学習する「Alteryx力を高める」コーナーを始めたいと思います。
今回は、バッチマクロを使ったツールのグループ実行を紹介したいと思います。
「グループごとに実行」するとは?
簡単な例として、通し番号をレコードにふっていきたい、といった場合はレコードIDツールを使うのが定番です。例えば、以下のようなデータを考えてみます。
これに通番をふるのであれば、以下のようなワークフローになります。
これにより、以下のようになります。
さて、ここで、カテゴリごとに番号をふりたい、とします。これには、いくつかの手法があり、タイルツールや複数行フォーミュラツールを使うことで簡単にできます。例として、タイルツールの場合を紹介します(計算式が不要なので個人的にはタイルツールをよく使います)。
ちなみに、複数行フォーミュラも、タイルツールもですが、グループ化というオプションがあるのでこのようなことが簡単にできるわけですが、すべてのツールにこのグループ化オプションがあるわけではありません。
この場合は代替ツールを使うか、ロジックを考え直すことで対応できますが、その他の方法としてバッチマクロを使った方法があります。
マクロとは
まず、Alteryxにおけるマクロについて簡単に説明したいと思います。Alteryxにおけるマクロとは、複数のツールを組み合わせて作った機能を一つの新たなツールにするものです。マクロは複数の種類があり、それぞれ特徴があります。
標準マクロ
最も一般的なマクロで、Alteryxのデフォルトのツールの中にもこの標準マクロとして作られているものが数多く存在します(データクレンジング、予測カテゴリのツール等)。
バッチマクロ
バッチマクロは繰り返し実行するタイプのマクロです。特徴的なのは、コントロールパラメータ入力という入力を備えていることで、この入力の部分に入力されるデータの個数分繰り返すようなマクロとなっています。この際に、マクロ内のツールのパラメータを書き換えることが可能です。
また、特徴的なのは、コントロールパラメータ入力に入力された値を入力データに対してフィルタとして機能させることができるのがポイントです。
今回は、この特徴を使ってグループ化処理を実現します。
反復マクロ
反復マクロも繰り返し実行するタイプのマクロです。一般的なプログラミング言語のForループ文を実現することができます。
しかしながら、うまくロジックを組めば、反復マクロを使わずともForループと同様の処理を行うことは可能です(処理は反復マクロを使わないほうが高速です)。
位置最適化マクロ
反復マクロの特殊なタイプのマクロと定義されていますが、これも繰り返し実行するタイプのマクロです。なお、必ず入力に位置データを必要とします。実際に使う場面としては、100箇所の候補場所から、特定の条件にもとづいて最適な4つの組み合わせを見つける、といったような問題を解くことが可能です。
使われる場面が少ないため、特に覚える必要はありません。
バッチマクロを使ったグループ化処理
インターフェースツールによるツールの設定値の書き換えについて
まず、通常のインターフェースツールの動きを見ていきましょう。
インターフェースツールをマクロに組み込むと、マクロの設定画面で値を入力できるようになります。ここで入力した値がインターフェースツールを通じてマクロ内のツールの設定値を書き換えます(以下のようにランダム%サンプリングツールを例にしてみましょう)。
この時、マクロの設定画面に設定した値はワークフローを作ると固定となります。値を変えたいときは、ワークフローを開いて手動で値を変更する必要があり、ワークフロー内の値によってダイナミックに値を変えることはできません。
コントロールパラメータの働きとは?
バッチマクロには必ずコントロールパラメータ入力という入力があります。
「¿」(逆疑問符)がついている入力がコントロールパラメータ入力です。基本的に一つしか持つことができませんが、複数のフィールドを入力することができます。この入力は、マクロ内のツールのパラメータを変更するために使われます。
つまり、インターフェースツールのテキスト入力などと同じく使うことができるのですが、ワークフロー内の値を参照することができるため、ワークフロー内の状況に応じて動的に変化させることが可能です。
ここでのポイントですが、コントロールパラメータ入力に1レコードだけ入力されていれば、一度値を書き換えて終了、となりますが、レコードが2つ入力されると、それぞれのデータで値を書き換えて実行するため、入力データは2回処理が行われます。つまり、コントロールパラメータ入力に入力されたレコード数の回数だけ処理を行うわけです。
例えば、以下のような簡単なサンプルを考えてみます。
販売リストには果物と野菜の原価が記載されたリストが来ており、これが通常の入力に入力されます。さらに、コントロールパラメータ入力には、利益が記載されたデータが2行入力されています。
マクロ内部の計算は単純で、入力された指定フィールドに対してフォーミュラツールで足し算するだけのワークフローです。この時、コントロールパラメータ入力はフォーミュラツールの足し算を行う値を書き換えて動作するため、今回入力された100,200という値それぞれを足し算する処理を行います。
結果として、この処理は以下のようになります。
入力されたデータに対して100を足した答えと、200を足した答えが出てきます。つまりそれぞれのレコードに対して2回計算されています。
これがバッチマクロの動きです。
フィルターツールを使ったグループごとの実施
先程の例の中で、例えばカテゴリが果物であれば利益100円、野菜であれば利益200円としたいとします。このような場合、単純に考えるとバッチマクロの中にフィルターを組み込めば良い、と考えると思います。実際にこれを作ってみましょう。
先程のマクロを改造してみましょう。
- マクロ入力ツールにCategoryフィールドを追加
- フィルターツールを追加し、Categoryフィールドでフィルタを行うように設定
- アクションツールでフィルタの値を書き換えるよう設定
これにより、もちろんコントロールパラメータにカテゴリフィールドを追加する必要があります。
これにより以下のような結果となります。
思い通りの結果が出ています。
グループ化オプションを使った方法
バッチマクロには、フィルターツールを使わなくてもフィルタとして機能させることができるオプションが存在します。以下のタブを見たことはあるでしょうか?
まず、少し解説したいと思います。
バッチマクロは、コントロールパラメータ入力の値を使って各マクロ入力に入る値を制御することが可能です。つまり、コントロールパラメータ入力に入ってきたレコードと同じ値を持つデータのみを処理するといった、いわゆる「フィルタ処理」を行うことができます。
具体的な例で説明したいと思います。まず、最初のバッチマクロにコントロールパラメータツールを追加します(この時、どこにも繋ぐ必要はありません)。
このマクロに対して、以下のようにデータを入力します。
ここまででマクロの作成は終わりです。ここからバッチマクロの設定を以下のようにします。わかりやすいように図にしてみました。
注意ポイントは、以下の通りです。
オレンジ色枠内:販売リストにある「カテゴリ」
赤色枠内:販売価格シミュレーションにある「Category」
- 質問タブ
- 「コントロールパラメータ グループフィールド」に「Category」を設定
- グループ化タブ
- 「Control GroupByフィールド」に「Category」を設定
- 「Input4 GroupByフィールド」に「カテゴリ」を設定
これにより、結果は以下の通りとなります。つまり、フィルタを組み込んだマクロと同等の動きをしています。
このグループ化オプションは、入力データとコントロールパラメータ入力の両方に同じグループを示すフィールドが存在する必要がありますが、フィルタを追加して作るのと同等の効果があるため、フィルタをわざわざ組み込むより手を抜いてバッチマクロを作成することが可能です。
また、実行時間も短縮可能です。グループ化オプションを使う場合は、データの入力自体が最初から削減され、実質的には全データを1回のみ処理するのに対し、グループ化オプションを使わずフィルタを組み込んだ場合は、一度すべてのデータをマクロ内で処理する必要があるため、処理時間がコントロールパラメータツールに入力されるレコード数分の掛け算と時間が多くかかります。
つまり、1000レコードの処理必要なデータがあり、コントロールパラメータに入力するグループが3だとすると、、、
- グループ化オプション使用:1000レコードの入力に対してこれを3つのグループごとに分割して実行するので、実質1000レコードを処理
- フィルタを組み込んだ場合:1000レコードに対してコントロールパラメータに入力されたレコード数3なので、1000レコードを3回処理し、実質3000レコードを処理
まとめ
- 良い点
- バッチマクロのグループ化オプションをうまく使うと処理が高速化される
- フィルタを組み込むよりバッチマクロの作成もシンプルになる
- デメリット
- 慣れるまでわかりにくい
- わかってないと設定がよくわからない
デメリットを考えると、バッチマクロに行った設定はコメントツールを使ってワークフロー内でいつでも確認できるようにしておくことをオススメします(ワークフローやマクロ改造中に設定が変わったり、マクロが行方不明になって設定をし直す際に設定が復元できないことを避けるため)。
もしくは、フィルタも組み込んでおくと設定をミスっても正常に動作はします(速度的には遅くなりますが)。
コメント