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