pandasでresample間隔と違うスライドで集約する方法
Discussion
解決したいこと
python(pandas)で
欠損のない毎秒データを15分スライドで1時間分を集約(平均・偏差)する方法について教えてください。
とりあえずの解決
pd.concat([df_raw.resample("1H").sum(),
df_raw.resample("1H",offset="15T").sum(),
df_raw.resample("1H",offset="30T").sum(),
df_raw.resample("1H",offset="45T").sum()]).sort_index()
で、それらしきことはできているのですが、スマートではないと思うので、何かいい方法があれば教えてください。
0
df.rolling()
を使いましょう。
pandasで窓関数を適用するrollingを使って移動平均などを算出 | note.nkmk.me
例えば、
df_raw.rolling("1H").sum()[::60*15]
0Like
df_raw.resample("15min", closed="right", label="right").sum().rolling("1H").sum()
とする方法もあります。
以下のようにNumPyの機能を使うと高速に処理できますが、コードが煩雑に思われるかもしれません。この例では特定の1列に対してしか機能しません。
window_size = 60*60 # 1H
step_size = 60*15 # 15min
arr = np.lib.stride_tricks.sliding_window_view(df_raw["colA"].to_numpy(), window_size)[::step_size].sum(1)
pd.DataFrame(arr, index=df_raw.index[window_size::step_size])
pandasの次回バージョン1.5では、最も簡単に
df_raw.rolling("1H", step=60*15).sum()
と書くことが可能になる予定です。
1Like