デジタル推進課

KNIME・Excel Macro・Power Automateなど日々の業務で使用できる自動化ツールを中心に書き綴ります

KNIME - ゼロ点揃えはできるのか?ワークフロー作成の考え方も解説 ~実践編~

f:id:makkynm:20210211160438p:plain

 

はじめに

こんにちは、自動化大好きまっきーです。嬉しいことに、以前時系列データの処理に関する問い合わせがありました。今回はその回答を掲載したいと思います。

質問者様から、「この問合せと同様のことでお困りの方々も沢山いらっしゃるのではないかと思いますので、ぜひブログで解説頂けると嬉しいです。」との暖かいお言葉をいただいたので、頑張って解説していきたいと思います。

 

内容としては、列ごとに処理するのではなく、行ごとに処理するにはどうすれば良いのか?という部分になります。

また、KNIMEでWorkflowを作る際にどうやって考えていけばいいのか?まで解説したいと思います。

 

このワークフローですが、時系列処理を今までKNIMEでやったことがない私が作ったものなので、かなり不器用なやり方をしているなと少し反省しています。もし経験のある方、こんな方法があるよ、こんな方法の方がいいんじゃない?というのがあればぜひコメント等お願いします!

 

今回のテーマ ~時系列データ ゼロ点揃え~

f:id:makkynm:20210211112532p:plain

今回のテーマ ~時系列データ ゼロ点揃え~

 

やりたいこと

お問い合わせ内容

まずはお問い合わせいただいた内容を掲載します。

********

時系列データのCSV(又はエクセル)ファイルが複数あります。1つのファイルにはサンプリング周期が0.01secで約1秒(約100行)分記録されています。

・・・下記にデータを模擬的に記載

          Column 0    Column 1      
row0 0   row0 0    row0 0 row0 0
row1 0    row1 3    row1 0 row1 0
row2 1    row2 4    row2 0 row2 0
row3 2    row3 5   row3 0 row3 0
row4 5    row4 7   row4 2 row4 0
row5 8    row5 9   row5 4 row5 3
row6 9    row6 9   row6 8 row6 4
・           ・           ・                   ・
・           ・           ・                   ・
・           ・           ・                   ・
row98 0   row98 0 row98 0 row98 0
row99 0 row99 0 row99 0
  row100 0 row100 0

この様なデータを、0「ゼロ」点をそろえて、80行までで1ファイル(時系列row⇒clumnに並べ替え)をにして、教師データを生成したいのですが、どの様なノードを使ってどう設定すれば可能でしょうか?


【結果のイメージ】
CM1 CM2 CM3 CM4 CM5 CM6 ・・・ CLM80
row0 0 1 2 5 8 9 0
row1 0 3 4 5 7 9 0
row2 0 2 4 8 9 8 1
 ・
 ・
row2,000 0 3 4 5 8 9 0

 

****************

 

やるべきこと

質問いただいた内容からやるべきことをあげると下記のようになると思います。

  1.  複数のファイルを1つにして取り込む
  2. 0始まりに揃える(データの最初の0は一つだけにしたい)
  3. データの数は80に統一
  4. 最後にPivotして出力

 

練習問題として、これらを達成するにはどのNodeをつかえばいいか?というのをぜひ考えてみてください。

f:id:makkynm:20210211112109p:plain

やりたいこと

 

  

覚えてほしいこと

ワークフロー作成の手順

Step1 - 要件を箇条書きで書き出す

Step2 -どんなOutputがあれば達成できそうか想像する

Step3 - 使えそうなNodeを想像する

 

ワーフクロー作成の考え方

さて、Workflowを実際に作る前に、どのような方針でデータを作っていくかを考えていきます。設計図がないとWorkflowは作れないですもんね。

Step1 - 要件を箇条書きで洗い出す

今回の要件をまずは箇条書きにしていきます。

  •  複数のファイルを1つにして取り込む
  • 0始まりに揃える(データの最初の0は一つだけにしたい)
  • データの数は80に統一
  • 最後にPivotして出力

Step2 - どんなOutputがあれば達成できそうか想像する

  • 複数のファイルを1つにして取り込む 

--> ファイルをLoopを使って取り込めばできそう。

  • 0始まりに揃える(データの最初の0は一つだけにしたい)

--> 最初に0ではなくなる位置を取得できればできそう。1ファイルごとに処理するべきだからLoopの中かな。

  • データの数は80に統一

--> 終了位置を開始位置とデータ数から特定できればできそう。1ファイルごとに処理するべきだからLoopの中かな。

  • 最後にPivotして出力

--> データ数が揃った後に縦から横に変換すればできそう。Loopの外でもできそうだな。

Step3 - 使えそうなNodeを想像する

  • 複数のファイルを1つにして取り込む :ファイルをLoopを使って取り込めばできそう

--> List Files とLoopの組み合わせかな

  • 0始まりに揃える(データの最初の0は一つだけにしたい):終了位置を開始位置とデータ数から特定できればできそう

--> Chunk Loopで1行ずつ取り出してRuleEngineで判断、Condition Loop Endで終了位置を変数で取得かな 

  • データの数は80に統一:終了位置を開始位置とデータ数から特定できればできそう

--> Row Filterを変数で指定すればできそうだな

 

  • 最後にPivotして出力: データ数が揃った後に縦から横に変換すればできそう

-->Pivoting でできそうだな

 

 

事前準備

今回は簡単な時系列データのサンプルとして、Sin関数を使ってサンプルファイルを作ってみます。開始位置のズレたSin関数を4つ用意しました。

f:id:makkynm:20210211162928p:plain

サンプルファイル

f:id:makkynm:20210211163553p:plain

サンプルファイル(Sin関数)

線グラフで表すとこんな感じです。

f:id:makkynm:20210211163727p:plain

元データサンプルファイル

 

Workflow解説 ~時系列データ~

このワークフローは仮定として必ず0が初めの行に挿入されていることを前提にしています。

Workflow

こちらが全体的なWorkflowです。先ほど設計した手順でNodeを組んでいきます。(Version Updateしてしまったので、昔のVersionのNodeを使っていることを示すDeprecatedという文字がついていますが、基本Versionが変わっても同じ使い方です)

  1.  複数のファイルを1つにして取り込む
  2. 0始まりに揃える(データの最初の0は一つだけにしたい)
  3. データの数は80に統一
  4. 最後にPivotして出力

f:id:makkynm:20210211163910p:plain

Workflow - ゼロ点揃え

f:id:makkynm:20210211163836p:plain

ゼロ揃え部分のMeta Node

 

Step1 複数のファイルを1つにして取り込む

黄緑の枠でくくった部分です。ここは以前解説した内容と変わりませんね。List Filesでファイル一覧を取得してLoopで一気に取り込みます。データの形式(コラム数とコラム名、データ型)が変わっていないことが条件となります。

過去記事を貼っておこうと思います。

degitalization.hatenablog.jp

 

Step2 0始まりに揃える(データの最初の0は一つだけにしたい)

Configure

さて、ここがポイントとなります。

  • Chunk Loop Startで1行ずつ取得
  • Rule Engineで値がゼロかどうかを判断(1行目は必ずゼロと判断)
  • Table Row to Variableで1行目の値を変数にする
  • Variable Condition Loop EndでRule Engineの値を元にゼロでない時点でLoopを終了、最後の行だけ残しておく。
  • Table Row to Variableで初めてゼロでない値が出た行を変数に変換。何行目だったかは繰り返し回数を示す、Iterationに記録される。

キーとなるNodeのConfigureは下記のようになっています。

f:id:makkynm:20210211165455p:plain

Rule Engine

f:id:makkynm:20210211165538p:plain

Variable Condition Loop End

 

それぞれのNodeが分からないという方は下記の記事をご覧ください。

degitalization.hatenablog.jp

  

degitalization.hatenablog.jp

 

degitalization.hatenablog.jp

 

Output 

最終的に、Variable Condition Loop EndのOutputを変数に変換した結果は下図のようになります。0から始まってChunk Loopで繰り返していき、Interationが6の時に0でない数字になったということが分かります。

f:id:makkynm:20210211170139p:plain

ゼロ点特定のOutput

 

Step3 データの数は80に統一

Configure

さて、ここまできたら単純でしょう。先ほど0でない数字が入っている行数を特定したので、あとは開始位置、終了位置を計算してRow Filterに流してあげましょう。

この時注意点は、先ほどの数字は0からカウントされているものの、今回計算しなければいけない開始位置の数字は1から始まっている点です。

  • Math Formula (Variable) で開始位置と終了位置を先ほどのIterationから計算
  • Row Fitlter で計算した開始位置・終了位置を使って抜き出し
  • Math Formulaで行番号を0から振り直す

f:id:makkynm:20210211170825p:plain

Math Formula 開始位置を計算

f:id:makkynm:20210211170847p:plain

Math Formula 終了位置を計算

f:id:makkynm:20210211170922p:plain

Row Filter - 行番号でFilter

f:id:makkynm:20210211170947p:plain

Row Filter - 行番号を変数で指定

f:id:makkynm:20210211171200p:plain

Math Formula - 行番号をふる

 

知らないNodeがある場合は下記のLinkからどうぞ!

degitalization.hatenablog.jp

 

degitalization.hatenablog.jp

 

Output

最終的なOutputはこちらになります。

f:id:makkynm:20210211171101p:plain

Output - 行数を揃える

 

Step4 最後にPivotして出力

さて、ここまで来たらやることはほぼないですよね。あとはPivotingして形を整えてあげましょう。行列を入れ替えたかったらTransposeを使ってあげてください。

 

degitalization.hatenablog.jp

degitalization.hatenablog.jp

degitalization.hatenablog.jp

 

 Output

f:id:makkynm:20210211171250p:plain

Output - Pivoting

f:id:makkynm:20210211171447p:plain

Output - ゼロ点揃え

 

 

おわりに

問い合わせいただくと非常に嬉しいですね。どうしても業務時間外にやっているので対応自体は遅くなってしまうのですが、可能な限り答えていきたいなと思っています。あと、Twitterもやっているので気軽にFollow ください〜

ではまた!

 

一日1回押していただけると大変応援になります↓ 

にほんブログ村 IT技術ブログへ

 

 

 

余談 

やっぱり楽天モバイルいいですね!私は昔auでしたが、その時はテザリングにオプション500円、そうでなくても1万円くらい払ってました。今やテザリング無料、通話無料、データ使い放題、1年無料とかなり経済的に助かってます。

全然2年契約の半ばでしたが、プラン変えてから1年間無料なことを考えると解約料数千円で抑えられますし、格安プラン出るの待つよりかはよほど経済的ですね。1年無料が終わって、楽天モバイルが改悪されればもちろん他を検討しますが、、

 あとは楽天モバイル圏内か、家でWifi契約しているのかにも少し寄ってきますが、通信制限下でも速度かなり出るのでそんな困ってませんね。ぜひおすすめです〜