Python での NumPy 配列の移動平均

Manav Narula 2023年1月30日
  1. numpy.convolve メソッドを使用して、NumPy 配列の移動平均を計算する
  2. scipy.convolve メソッドを使用して、NumPy 配列の移動平均を計算する
  3. bottleneck モジュールを使用して移動平均を計算する
  4. pandas モジュールを使用して移動平均を計算する
Python での NumPy 配列の移動平均

移動平均は、特定の間隔でデータの平均を計算することによって時系列データを調査する際に頻繁に使用されます。これは、いくつかの短期的な変動を平滑化し、データの傾向を調査するために使用されます。単純移動平均は、株価の傾向を調査する際によく使用されます。

加重移動平均は、古いデータよりも最近のデータに重点​​を置いています。

以下のグラフは、移動平均の理解を深めます。

単純移動平均

このチュートリアルでは、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 Narula
Manav Narula avatar Manav Narula avatar

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

関連記事 - Python NumPy