つれづれなる備忘録

日々の発見をあるがままに綴る

Pythonによるデータ処理 ~ 移動平均

データの移動平均プロットを実行するpythonコードを作ろうと思ったときに、例えば

for i in np.arange(N-3)
 ave[i]=(data[i]+data[i+1]+data[i+2])/3

のようにfor文を使おうと思ったが、以下のように畳み込み積分を利用すると非常に簡単になる。

deepage.net

畳み込み積分を用いてN点の移動平均を実行するには、値が1/NでN要素数の行列を作っておき、np.convolveを用いて移動平均を実行する元のデータ行列と畳み込み計算を実行する。 for文で書こうとすると元のデータ列とデータ数を合わせるなど注意が必要だが、np.convolveの場合はmode='same'とするだけでよい。(mode='full'だと最後の点まで畳み込みを実行するので、元のデータ数より多くなる)

以下5点の移動平均処理のコードと実行例を示す。移動平均のデータはnp.random.randn(100)として100点の乱数をデータ行列yに格納した。また行列bは値が1/5で要素数5であり、これをyと畳み込み積分して移動平均処理されたy2を生成する。

import numpy as np
import matplotlib.pyplot as plt

y=np.random.randn(100)

num=5
b=np.ones(num)/num
y2=np.convolve(y,b,mode='same')

plt.plot(y,'c',label='original')
plt.plot(y2,'b',label='move ave')
plt.legend()

シアンが元のデータで青が5点移動平均したプロットで滑らかになっていることが確認できる。

"5点移動平均処理のプロット"
5点移動平均処理のプロット