はじめに
どうも、自動化大好きまっきーです。今回はChunk LoopというLoopの種類について解説するとともに、今まで解説してきたNodeの実践編として練習問題を提示したいと思います。中級編の必須シリーズまで終わっていることを前提としています。
やりたいことをみて、ぜひ今まで習得してきたNodeの実践編として、一度解説を見ずにやりたいことのWorkflowを作ってみて欲しいです。
私のWorkflowが正解ではありません。やりたいことが達成できるのであればどんなWorkflowでも正解です。ぜひチャレンジしてみてください。
今回のテーマ ~Chunk Loop Start~
覚えてほしいこと
Chunk Loopは、LoopとRow Filter(行数でのFiltering)を合わせたような機能
やりたいこと - 実践編
下図のように、店舗ごとで売上のデータがあったとします。
元データは、計測開始日、計測終了日という2つのコラムと合計売上の記載があるので、一日ごとの平均売上がわかりません。また、日付のコラムが2つもあるので計測期間もまちまちになってしまっています。
このデータの形式を、日付、日平均売上、計測店舗の3コラムに変換するのが今回のテーマです。
このデータの形式変換の作業は、データベースの考え方で非常に重要になります。いわゆる、前処理が命。と言われる話です。今回作りたいデータの形式にすることで、PowerBIなどのBIツール(グラフ化ツール)で簡単にデータを見える化することができるようになったり、機械学習に簡単に通すことができるようになります。
Chunk Loop Startの使い方
先にChunk Loop Startについて解説します。Chunk Loopは、LoopとRow Filter(Row数でのFiltering)を合わせたような機能を持ちます。
Workflow
実践編の回答になってしまうので、適当なWorkflowを作っています。
InputのTableを設定値に応じて行数でフィルタしてLoop内のWorkflowに流しています。
Confirm - Before After
1行ずつループさせる設定にしたときのOutputはこのような形になっています。1ループ目は元々のInputの1行目のみを抜き出して、Loop内のWorkflowに流すイメージです。
Configure
ループの回数を指定する方法か、ループ一回あたりの行数を指定する方法のどちらかでLoopの設定が可能です。両方ここで解説します。今回使用したのは、Rows per chunkの方です。
Rows per chunk:ループ一回あたりの行数を指定する方法
ループ回数=Tableの総行数 / 入力値
ループ1回の行数=入力値
一番単純な使い方が、1を入力するパターンです。1を入力すると、ループの回数=Tableの総行数となるため、1行ずつLoopを回すことができるので、1行ずつ処理を実行したい時に有効です。
No. of chunks:ループの回数を指定する方法
ループの回数を指定する方法でも設定が可能です。ループ回数とループ一回あたりの行数は下のように計算できます。
ループ回数=入力値
ループ1回の行数=Tableの総行数 / 入力値
自分で作ってみよう!
さて、ここからはぜひ自力で作ってみていただきたいです。スペースを作っておきますので、できたらまっきーはどう作ったんだ?という気持ちで読み進めてみてください。
わからない人にヒント!
ここで、わからない人にヒントを差し上げます。
まっきーが作ったWorkflowで使ったNodeの紹介記事を貼りたいと思います。これを元に考えてみてください。
まっきーはこう作った!
さて、私まっきーは少し不器用ながらこのように作りました。みなさんはどう作りましたか?何度もいうように、私のWorkflowが正解ではありません。やりたいことが達成できるのであればどんなWorkflowでも正解です。
まっきーはこう作ったんだなーというスタンスでみていただければと思います。
Workflow
Workflowの最初ブロックは日平均売上を計算する部分です。
続いて、対象期間の日付の行を作っていくフローへ移っていきます。各Nodeの説明は以前行っているので省略しますが、Outputのテーブルがどのように変化していくか解説したいと思います。
Workflowは下記からダウンロードできます。
Confirm - テーブルはどう移り変わっていくか。
1. 日平均売上を計算するワークフロー
まずは日平均売上を計算するワークフローです。
- Excel Reader:数日単位で入力された売上データのExcelを読み込む
- String to Date&Time:Start DateとEnd Dateのコラムのデータ型を文字列(String)から日付型(Date)に変換する
- Date&Time Difference:Start DateとEnd Dateの売上期間を計算する
- Math Formula:上で計算された売上期間は1日目が含まれないので、+1をして売上日数を計算する
- Math Formula:売上/売上日数を行って、日平均売上を計算する
2. 売上期間から売上日のコラムを作るワークフロー
売上期間として2つのコラムだったものを、売上日という一つのコラムにする部分です。
- Chunk Loop Start:1行ずつ抜き出してLoop
- Table Row to Variable:Tableの1行目を変数に変換。営業日数(Days)を変数として取得する。
- Counting Loop Start+Loop End:営業日数分、行をコピーする。
- Date&Time Shift:Start DateとLoop営業日数のLoop回数(Interation)の2つのコラムを使用して、営業日のコラムを作成する。これにより、Start DateからEnd Dateまでの日付を1つのコラムで作ることができる。
- Column Rename:Date&Time Shiftではコラム名をFullで指定することができないので、このNodeでコラム名を変更する
- Column Filter:計算に使用したコラム等は排除し、必要なコラムのみを残す
- Loop End:Chunk Loop StartのLoop End。ここで各行に適用されたLoop後の処理を統合する。
- Column Resorter:コラムの並び替え
おわりに
いかがだったでしょうか。実際に自分で作ってみるというのは少し頭の使い方も違うので、次のステップに進むためにかなり重要なのではないかなと思います。こう作った方がもっと簡単にできるのではないか?だったり、私はこう作りましたというのがあればぜひ共有いただければと思います!
余談
年末残すところあと数日ですね。コロナの影響でかなり外出が制限される中、いかがお過ごしでしょうか。巣ごもりが推奨される中なので、勉強をして自分の成長に繋げるのもいいですし、大掃除をして部屋をスッキリさせるのでもいいですし、Amazon PrimeやNetflix、テレビなどでのんびりするのもいいですよね。
マッチングアプリに勤しむのもいいと思います。最近は全くやっていませんが、以前巣ごもりで熱中したことがありました。コード公開しているのでよかったら見てみてください!ではまた!
参考リンク
- KNIME公式Node Pit(英語):
- KNIME Example Workflow(英語):