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 值,因为无法为它们计算滑动平均值。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布,任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站。本站所有源码与软件均为原作者提供,仅供学习和研究使用。如您对本站的相关版权有任何异议,或者认为侵犯了您的合法权益,请及时通知我们处理。