Python 窗口增大的滚动平均值

Python 窗口增大的滚动平均值,python,pandas,numpy,Python,Pandas,Numpy,我有一个范围 np.arange(1,11) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 对于每个元素,我,在我的范围内,我想计算从元素i=0到当前元素的平均值。结果是: array([ 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5, 5. , 5.5]) # got this result via np.cumsum(np.arange(1,11,dtype=np.float32))/(np.arange(1, 11

我有一个范围

np.arange(1,11) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
对于每个元素,我,在我的范围内,我想计算从元素i=0到当前元素的平均值。结果是:

array([ 1. ,  1.5,  2. ,  2.5,  3. ,  3.5,  4. ,  4.5,  5. ,  5.5])
 # got this result via np.cumsum(np.arange(1,11,dtype=np.float32))/(np.arange(1, 11))
我想知道numpy/pandas中是否没有现成的函数可以提供此结果?

您可以使用(需要pandas 0.18.0):


这似乎是最简单的,但如果x非常大,则可能会变得效率低下:

x = range(1,11)
[np.mean(x[:i+1]) for i in xrange(0,len(x))]

这是一种矢量化方法-

a.cumsum()/(np.arange(a.size)+1)
请注意,为了确保结果是浮动pt编号,我们需要在开始时添加:

from __future__ import division
或者,我们可以使用
np.true\u divide
进行除法-

np.true_divide(a.cumsum(),(np.arange(a.size)+1))
样本运行-

In [17]: a
Out[17]: array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])

In [18]: a.cumsum()/(np.arange(a.size)+1)
Out[18]: array([ 1. ,  1.5,  2. ,  2.5,  3. ,  3.5,  4. ,  4.5,  5. ,  5.5])

In [20]: a
Out[20]: array([3, 3, 2, 4, 6, 6, 3, 5, 6, 4])

In [21]: a.cumsum()/(np.arange(a.size)+1)
Out[21]: 
array([ 3.        ,  3.        ,  2.66666667,  3.        ,  3.6       ,
        4.        ,  3.85714286,  4.        ,  4.22222222,  4.2       ])

从熊猫0.18.0开箱即用,如您所愿:)

结果是:

0    1.0
1    1.5
2    2.0
3    2.5
4    3.0
dtype: float64
s = pd.Series([1, 2, 3, 4, 5])
s.rolling(5, min_periods=1).mean()
0    1.0
1    1.5
2    2.0
3    2.5
4    3.0
dtype: float64