見出し画像

Tableau PrepでAdvent of Codeは解けるのか?

こんにちは、kusakaと申します。冬至ですね⛄
Tabjoの2022アドベントカレンダー企画に参加しております。
本日はTableau Prepのスキルアップ方法としてAdvent of codeは解けるのか?という話を書いてみたいとおもいます。


Tableau Prepとは?

Tableauが提供しているETLツールです。
Tableau Creator ライセンスがあればだれでも使えます。
詳細な内容はこちらをお読みください

Prepで何ができるか(私が登壇した際の資料の抜粋)

Tableau Prepの勉強の方法は様々あります。
Tableau公式トレーニングビデオ
Preppin' Data(ウィークリーチャレンジ)
Prepのコミュニティに参加
・Udemyの講座をみる
…などなど、多岐にわたります。

ある日、Alteryx User Groupの幹事会に参加させていただいたところAlteryxレジェンドのKajitaniさんからAlteryx・プログラミング界隈で盛り上がっている「Advent of Code」なるものの情報を教えていただいたのですが、「これ…Prepでも使えるのでは…??」と思い立ち今回の記事にしたという流れです。


Advent of Codeとは?

毎年12月1日になると、クリスマスにちなんだ問題が出されるのでそれをプログラミングなどを駆使して解いていくというものです。25日まで続きます。詳しい参加方法はKajitaniさんのブログをご覧ください。
AlteryxユーザーのためのAdvent of Codeの始め方


早速解いてみる(1日目)

以下にアクセス。
https://adventofcode.com/

すでに画面がかっこいい

早速1日目から順番に解いていきたいと思います。1番したの「1」のリンクをクリック。表示されたのは英語ページ…英語が苦手なのでDeepL翻訳を駆使しつつやっていきます。

英語がわからないけどなんだかかっこいい

ストーリー要約

(間違ってたらすみません…)
サンタのトナカイがクリスマスに稼働するには魔法エネルギーが必要。
魔法エネルギーの補充にはジャングルの奥にあるレアリティの高いスターフルーツを12月25日までに最低50個食べなければいけない。トナカイのために1日ごとに出されるパズルを解いてエルフたちといっしょに徒歩でスターフルーツを採りに行こう!(そのジャングルは徒歩でしか行けない場所にあるらしい。車、空から滑空などはNG)

1日目の課題は題して「カロリー計算」

エルフとの旅での必要物資のカロリー計算は超重要任務。エルフは順番に持ってきたおやつや食事などに含まれるカロリーを1行に1項目記録していきます。すべてのアイテムのカロリーを書き終えると次のような形式のリストになりました。

カロリーが全体的にたかい

ここで例題。
食料を運んでいるエルフは5人。それぞれの内訳はこう。
 1人目:1000+2000+3000=合計6000kcalの食品を運んでいる。
 2人目:4000kcalの食品を1つ運んでいる。
 3人目:5000+6000=合計11000kcalの食品を運んでいる。
 4人目:7000+8000+9000=合計24000kcalの食品を運んでいる。
 5人目:10000kcalの食品を1つ運んでいる。
一番高いカロリーを運んでいるエルフの総カロリーは?

はい。24000がこたえですね。

こちらの例題をヒントに、パズルのInputデータはこちらというリンクがあるのでこれを使って問題を解いていきましょう。
(余談:私はここまでが本題だとおもって24000と入力してしまいました)

緑のリンクからダウンロードすると、
上記のようなデータがダウンロードできます
(めちゃくちゃ長い)

ここからPrepを使っていきます。
InputデータはWeb上にあるので、本当ならWeb上のテキストを取得…みたいな感じが望ましいのでしょうか、コピペでcsvにしてInputしました。

csvでInput

ヘッダーもない、縦に積まれて空白行で区切られたデータを集計してMAXの値をとる、というミッション。
Prepでできることは「データ加工の基本部分」のみなので、この中から試行錯誤してやっていきます。

Prepの全機能

まずはエルフごとの区切りのグループを作りたいが、現時点では空行でしか区切りが判別できないので空行に「Elf」文字をセット。それ以外はカロリーを文字列に変換。

続いて、これを縦持ちから横持ちに変換してConcat・・・。できない。

早速詰みました

まずPrepでのピボット変換機能やサマライズの機能には行/列を文字列結合するなどのグルーピング機能が備わっていない。
行番号でグルーピングできるだろうから行番号つけようにも、「IDごと」とかでの連番しかつけれないので今回のようにIDなどがない、値のみのデータだと厳しい…どうにかつけれたとしても謎の順番でソートされてしまう…

連番を振りたいけどIDがないので1という項目を作って採番すれば
データ順での連番が降られるかと思いきや、
謎の順番でソートされてしまったの図

Pythonスクリプトを読み込ませてみる

仕方ないので、頼れるところはPythonに頼ります。
PrepではTabPyが使えるのでスクリプトを読み込ませてみたいとおもいます。
TabPyが必要なので、必要な方は以下を見ながら設定ください。
【Tableau Tips】PrepでPythonスクリプトを使用する(1)環境整備

まずはTabPyを起動し、TableauPrepの[ヘルプ]>[分析の拡張機能の接続]よりローカルのサーバーを接続します。

続いて、PrepのInputの後続処理で+ボタンからスクリプトを選択します

Pythonのコードを用意し、作ったコードのファイルと関数をセットします。

結果は以下のようになりました。

入力してみると…

以下の表示が出ました。

right answerなので正解だそうです!やっと★1つ獲得できました。
正解したらパート2の問題もでてきました。

結論

Tableau Prepの基本機能のみでAdvent of Codeは解けませんでしたが、Pythonスクリプトを読み込ませるとPrepで無理な処理もなんなくいけました。

Advent of Codeの他の課題も見てみたのですが、中盤からさらに難しくなってくるようで、繰り返し処理が多かったり複雑なことをまあまあしなければいけないので、Prep君の基本機能だけではむりでした…

非常に頭を使う問題が多いので、Preppin Dataなどがマンネリ化してしまった方、普通のトレーニングじゃ物足りないよ!という方やTabPyのトレーニングをしたい方におすすめです。

基本機能だけでいけた猛者がいたら私のTwitterにご連絡ください。


この記事が気に入ったらサポートをしてみませんか?