このページは解答編です。
↓ネ
↓タ
↓バ
↓レ
↓防
↓止
答えと解説
設問はこちらでした。
P-042: レシート明細データ(receipt.csv)の売上金額(amount)を日付(sales_ymd)ごとに集計し、各日付のデータに対し、前回、前々回、3回前に売上があった日のデータを結合せよ。そして結果を10件表示せよ。
※過去の売り上げ情報が不足する最初の3回分は最終結果から取り除くこと
解答ワークフローは以下のようになります。
今回は、前回売り上げがあった日、前々回売り上げがあった日、3回前の売り上げがあった日、のそれぞれの売上金額を新たなフィールドとして作成する問題です。
今回の問題も異なる行からのデータを引っ張ってくるという問題なので、複数行フォーミュラツールを使います。
それでは、さっそく進めていきたいと思います。
まず、集計を行うために数値型にする必要があります。今回はamountのみInt16型にします。
次に、集計です。日付(sales_ymd)ごとに売上金額(amount)を集計とのことなので、sales_ymdでグループ化し、amountの合計します。
次に、旧エンジン(E1 Engine)の場合はsales_ymd順に勝手に並び変わるのですが、AMP Engineを使う場合は並び替えが必要です。
ここまでは41問目と同じです。
次に、複数行フォーミュラツールを使います。1つ目の設定は以下の通りです。
新しいフィールドを作るため「新しいフィールドを作成する」を選択し、フィールド名は「Prev1」、データ型は「Int32」としています。元々amountというフィールドはInt16型でしたが、集計ツールで合計したため、Int16の範囲を超えており、Int32がベストマッチのデータ型となります。
計算式は以下の通り、一つ前のamountを参照する、という式になります。
[Row-1:amount]
結果として、先頭から5レコード抽出すると以下のような形になっています。
それでは、次の複数行フォーミュラツールの設定を行います。先ほどとの違いは、参照先のフィールドです。
新しいフィールドを作るため「新しいフィールドを作成する」を選択し、フィールド名は「Prev2」、データ型は「Int32」としています。元々amountというフィールドはInt16型でしたが、集計ツールで合計したため、Int16の範囲を超えており、Int32がベストマッチのデータ型となります。
計算式は以下の通り、一つ前のPrev1を参照する、という式になります。今回はamountではなく、すでに1レコードずれているPrev1を参照するのがポイントです。
[Row-1:Prev1]
結果として、先頭から5レコード抽出すると以下のような形になっています。
さらに次の複数行フォーミュラツールの設定を行っていきましょう。
新しいフィールドを作るため「新しいフィールドを作成する」を選択し、フィールド名は「Prev3」、データ型は「Int32」としています。元々amountというフィールドはInt16型でしたが、集計ツールで合計したため、Int16の範囲を超えており、Int32がベストマッチのデータ型となります。
計算式は以下の通り、一つ前のPrev2を参照する、という式になります。今回はamountではなく、すでに2レコードずれているPrev2を参照するのがポイントです。
[Row-1:Prev2]
結果として、先頭から5レコード抽出すると以下のような形になっています。
これで複数行フォーミュラツールの設定は完了です。
続いて、最初の3レコードは過去の参照する先がないためPrev1~3が0になっています。これらは不要なレコードなので削除しましょう。このような場合はサンプリングツールもしくはレコード選択ツールを使いますが、今回はサンプリングツールで行います。
「最初のN行をスキップ」で、N=3とします。
その後は10レコード抽出して完成です。
別解のワークフローについて(複数行フォーミュラツールのオプション変更)
複数行フォーミュラツールは、参照先の行数を変更することが可能です。
今回の3つの複数行フォーミュラツールですが、このオプションを使用した際の設定方法を紹介します。1つ目のツールは先ほどの設定と同じなので割愛します。2つ目のツールの設定がこちらです。
ポイントは、2行前のamountを参照する、というところで、そのために行数オプションを2に、式を以下のように2行前のamountを参照するようにしています。
[Row-2:amount]
次に、3つ目のツールです。設定は以下の通りです。
ポイントは、3行前のamountを参照するため以下のような式としています。
[Row-3:amount]
その他はすべて最初に紹介したワークフローと同様です。
まとめ
今回は、過去のレコードから値を参照する問題でした。レコードをまたぐ場合は複数行フォーミュラツールの独壇場ですので、このような問題の場合は複数行フォーミュラツールを使うことを検討してみましょう。1行に限らず複数行にまたがって参照できるのも特長ですが、動的に参照する行数を変更するのは難しいのでその点はご留意ください。
コメント