[商品準備](flow_zone:lbU6WM1)ゾーンでは [product_holdings_renamed](dataset:product_holdings_renamed) データセットを事前処理します。

![Products Preparation Zone.png](aPFifONbILRL)

[Groupingレシピ](recipe:compute_products)は、product_idごとにproduct（商品）とproduct type（商品種別を取得して、[対応表-correspondence table](dataset:products)を作っています。


フローゾーンの上部では、[Joinレシピ](recipe:compute_product_holdings_history) でdates_historyデータセットの各行とproduct_holdingsデータセットの間のデカルト積を実行しています。次の[Prepareレシピ](recipe:compute_product_holdings_prepared)では、参照日と開始日または終了日の差分を取ることで、それぞれ作成からの経過年数と終了からの経過年数を計算します。各基準日に関して過去の保有量を保持するため、作成からの経過年数が正の行のみが保持されます。関連する特徴量は、後続の[Groupレシピで](recipe:compute_product_holdings_by_customer)作成されます。
 - created window: 作成日付が定義されたルックバックウィンドウより大きいかどうか(boolean)
 - terminated window: 終了からの経過年数が定義されたルックバックウィンドウよりも大きいかどうか（Boolean）
 
 次に、顧客と基準日ごとに4つの集計が定義されます。
 - count: 指定された基準日における契約されている商品数。
 - count on end date: 指定された基準日における解約されている商品数。
 - sum on created window: ルックバック期間前に契約されている商品数。
 - sum on terminated window:ルックバック期間前に解約されている商品数。

最後の[Prepareレシピ](recipe:compute_product_holdings_portfolio)では、クラスタリング処理で正しく処理するために欠損値を 0 で埋め、グループ化レシピから作成した列の名前をよりわかりやすいものに変更します。


