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() 函式用於訊號處理,可以返回兩個陣列的線性卷積。每個步驟要做的是取一個陣列與當前視窗之間的內積並取它們的總和。

以下程式碼在使用者定義的函式中實現了此函式。

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,因此在開始處存在三個 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,所以在開始時存在三個 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