キー列ごとにカウントアップや累積和・移動平均の計算をしたい

時系列の波形データを例に、キー列ごとに数値列の累積和(該当行までの値の和)や移動平均を計算する方法を解説します。

説明

キー列の値が同じものを同じグループとして、グループ内での連番(カウントアップ)や累積和などを計算するスクリプトです。

入出力イメージ

  • 入力

  • 出力

使い方

  1. 計算元となるデータを用意し、「Python script」アイコンを繋げます。 (例では、時系列波形データ.dftを計算元のデータとしています。このデータは、共有ワークスペース>サンプル>Alkano>時系列波形データ.dft にあります。)

  1. 「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)
  1. 「Python script」アイコンを実行します。終了後、可視化画面で結果を確認すると、キー列ごとのカウントアップ・累積和・移動平均が計算できていることが分かります。移動平均列は、計算の定義から、window_sizeで指定した窓サイズ-1行のNAがはじめに現れます。

分析への応用

顧客ごとの可変長系列データに対し、顧客の順序付けや月ごとの平均計算などを行う

OnePoint

  • groupby関数を用いることで、キー列ごとの塊を作り、塊に対して共通の操作・計算を行うことができます。
  • cumcount関数は0からの連番を振るため、例ではその値に1を加えて1から連番を振るようにしています。
  • rolling関数は窓のサイズ(window_size)ごとの塊を作ります。例では、それに対しmean関数で平均を計算し、列として追加するための処理をreset_index関数などで行っています。

関連項目