[英]rolling mean with increasing window
我有一個范圍
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中是否沒有開箱即用功能給我這個結果?
你可以使用expanding()
(需要pandas 0.18.0):
ser = pd.Series(np.arange(1, 11))
ser.expanding().mean()
Out:
0 1.0
1 1.5
2 2.0
3 2.5
4 3.0
5 3.5
6 4.0
7 4.5
8 5.0
9 5.5
dtype: float64
這似乎是最簡單的,但如果x非常大,它可能會變得低效:
x = range(1,11)
[np.mean(x[:i+1]) for i in xrange(0,len(x))]
這是一個矢量化的方法 -
a.cumsum()/(np.arange(a.size)+1)
請注意,為了確保結果是浮點數,我們需要在開頭添加:
from __future__ import division
或者,我們可以使用np.true_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 ])
從Pandas 0.18.0開箱即用,如你所願:)
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.