Python での NumPy 配列の移動平均
-
numpy.convolve
メソッドを使用して、NumPy 配列の移動平均を計算する -
scipy.convolve
メソッドを使用して、NumPy 配列の移動平均を計算する -
bottleneck
モジュールを使用して移動平均を計算する -
pandas
モジュールを使用して移動平均を計算する
移動平均は、特定の間隔でデータの平均を計算することによって時系列データを調査する際に頻繁に使用されます。これは、いくつかの短期的な変動を平滑化し、データの傾向を調査するために使用されます。単純移動平均は、株価の傾向を調査する際によく使用されます。
加重移動平均は、古いデータよりも最近のデータに重点を置いています。
以下のグラフは、移動平均の理解を深めます。
このチュートリアルでは、Python で numpy 配列の移動平均を実装する方法について説明します。
numpy.convolve
メソッドを使用して、NumPy 配列の移動平均を計算する
convolve()
関数は信号処理で使用され、2つの配列の線形畳み込みを返すことができます。各ステップで行われていることは、1 の配列と現在のウィンドウの間の内積を取得し、それらの合計を取得することです。
次のコードは、これをユーザー定義関数に実装します。
import numpy as np
def moving_average(x, w):
return np.convolve(x, np.ones(w), "valid") / w
data = np.array([10, 5, 8, 9, 15, 22, 26, 11, 15, 16, 18, 7])
print(moving_average(data, 4))
出力:
[ 8. 9.25 13.5 18. 18.5 18.5 17. 15. 14. ]
scipy.convolve
メソッドを使用して、NumPy 配列の移動平均を計算する
scipy.convolve()
関数も同じように使用できます。少し速いと思われます。numpy モジュールを使用して移動平均を計算する別の方法は、cumsum()
関数を使用することです。配列の累積合計を計算します。これは、移動平均を計算するための非常に簡単な非加重方法です。
次のコードは、この関数を使用して移動平均を返します。
def moving_average(a, n):
ret = np.cumsum(a, dtype=float)
ret[n:] = ret[n:] - ret[:-n]
return ret[n - 1 :] / n
data = np.array([10, 5, 8, 9, 15, 22, 26, 11, 15, 16, 18, 7])
print(moving_average(data, 4))
出力:
[ 8. 9.25 13.5 18. 18.5 18.5 17. 15. 14. ]
bottleneck
モジュールを使用して移動平均を計算する
bottleneck
モジュールは、簡単な numpy メソッドをまとめたものです。このモジュールには move_mean()
関数があり、一部のデータの移動平均を返すことができます。
例えば、
import bottleneck as bn
import numpy as np
def rollavg_bottlneck(a, n):
return bn.move_mean(a, window=n, min_count=None)
data = np.array([10, 5, 8, 9, 15, 22, 26, 11, 15, 16, 18, 7])
print(rollavg_bottlneck(data, 4))
出力:
[ nan nan nan 8. 9.25 13.5 18. 18.5 18.5 17. 15. 14. ]
時間ウィンドウ間隔が 4 であるため、移動平均を計算できなかったため、開始時に 3つの nan 値があります。
pandas
モジュールを使用して移動平均を計算する
時系列データは主に pandas
DataFrame に関連付けられています。したがって、ライブラリは、そのようなデータに対してさまざまな計算を実行するための設備が整っています。
以下に示すように、rolling()
および mean()
関数を使用して、時系列データの移動平均を計算できます。
import pandas as pd
import numpy as np
data = np.array([10, 5, 8, 9, 15, 22, 26, 11, 15, 16, 18, 7])
d = pd.Series(data)
print(d.rolling(4).mean())
出力:
0 NaN
1 NaN
2 NaN
3 8.00
4 9.25
5 13.50
6 18.00
7 18.50
8 18.50
9 17.00
10 15.00
11 14.00
dtype: float64
最初に numpy 配列を時系列オブジェクトに変換し、次に rolling()
関数を使用してローリングウィンドウで計算を実行し、mean()
関数を使用して移動平均を計算します。
ここでも、時間ウィンドウ間隔が 4 であるため、移動平均を計算できなかったため、開始時に 3つの nan 値があります。
Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.
LinkedIn