時系列の波形データを例に、キー列ごとに数値列の累積和(該当行までの値の和)や移動平均を計算する方法を解説します。
説明
キー列の値が同じものを同じグループとして、グループ内での連番(カウントアップ)や累積和などを計算するスクリプトです。
入出力イメージ
- 入力
- 出力
使い方
- 計算元となるデータを用意し、「Python script」アイコンを繋げます。 (例では、時系列波形データ.dftを計算元のデータとしています。このデータは、共有ワークスペース>サンプル>Alkano>時系列波形データ.dft にあります。)
- 「Python script」アイコンの編集画面を開き、スクリプト部分を以下で置き換えます。
入出力設定は変更しません。
- Python script
from msi.common.dataframe import DataFrame, cbind, rbind, merge, select, is_valid, format_str from msi.common.dataframe.params import Axis, Merge, DType, Agg from msi.common.dataframe.special_values import Na, Error, NegativeInf, PositiveInf ############################## # 設定項目 ############################## # キー列を記載します key_col = "番号" # 累積和や移動平均の計算対象列を記載します calc_col = "値" # 移動平均の窓のサイズ(何行分の移動平均を計算するか)を記載します window_size = 2 ############################## ## pandas をインポートします import pandas as pd ## pandas変換用の関数をインポートします from msi.common.dataframe import pandas_to_dataframe ## MSI DataFrameからpandasに変換します table_pd = table.to_pandas() ### 計算の内容を記述します # キー列の値ごとに連番を振る table_pd['countup'] = table_pd.groupby([key_col]).cumcount()+1 # キー列の値ごとに累積和を計算する table_pd['cumsum'] = table_pd.groupby([key_col])[calc_col].cumsum() # キー列の値ごとにwindow_size分の移動平均を計算する table_pd['moving_average'] = table_pd.groupby([key_col])[calc_col].rolling(window=window_size).mean().reset_index()[calc_col] ## pandasをMSI DataFrameに変換します result = pandas_to_dataframe(table_pd)
- 「Python script」アイコンを実行します。終了後、可視化画面で結果を確認すると、キー列ごとのカウントアップ・累積和・移動平均が計算できていることが分かります。移動平均列は、計算の定義から、window_sizeで指定した窓サイズ-1行のNAがはじめに現れます。
分析への応用
顧客ごとの可変長系列データに対し、顧客の順序付けや月ごとの平均計算などを行う
OnePoint
- groupby関数を用いることで、キー列ごとの塊を作り、塊に対して共通の操作・計算を行うことができます。
- cumcount関数は0からの連番を振るため、例ではその値に1を加えて1から連番を振るようにしています。
- rolling関数は窓のサイズ(window_size)ごとの塊を作ります。例では、それに対しmean関数で平均を計算し、列として追加するための処理をreset_index関数などで行っています。