顺便说一句,我真的不知道该怎么问这个问题。我有一个值的数组,我希望将这些值的平滑平均值向前移动。在Excel中,计算过程为:
窗口大小=通过window_size
等等。
在pandas和numpy中,我的代码如下
df = pd.DataFrame({'av':np.nan, 'values':np.random.rand(10)})
df = df[['values','av']]
window = 5
df['av'].iloc[5] = np.mean(df['values'][:5])
for i in range(window+1,len(df.index)):
df['av'].iloc[i] = (df['values'].iloc[i] * (window-1) + df['av'].iloc[i-1])/window
它返回:
values av
0 0.418498 NaN
1 0.570326 NaN
2 0.296878 NaN
3 0.308445 NaN
4 0.127376 NaN
5 0.381160 0.344305
6 0.239725 0.260641
7 0.928491 0.794921
8 0.711632 0.728290
9 0.319791 0.401491
这些就是我正在寻找的值,但是一定有比使用 for 循环更好的方法。我认为答案与使用指数加权移动平均有关,但如果我能找出语法来理解它,我会被诅咒的。
有什么建议吗?
发布于 2018-07-27 03:48:14
您可以使用ewm,例如:
window = 5
df['av'] = np.nan
df['av'].iloc[window] = np.mean(df['values'][:window])
df.loc[window:,'av'] = (df.loc[window:,'av'].fillna(df['values'])
.ewm(adjust=False, alpha=(window-1.)/window).mean())
你会得到与循环for
相同的结果。为了确保它工作,列'av‘必须为nan
,否则包含列’fillna
‘的值将不会发生,并且在'av’中计算的值将是错误的。ewm
中的参数alpha
可以帮助您增加要计算的行的权重。
注意:虽然这段代码和您的代码一样,但我建议您查看代码中的这一行:
df['av'].iloc[5] = np.mean(df['values'][:5])
由于在对[:5]
进行切片时排除了上界,因此df['values'][:5]
是:
0 0.418498
1 0.570326
2 0.296878
3 0.308445
4 0.127376
Name: values, dtype: float64
所以我认为你应该做的是df['av'].iloc[4] = np.mean(df['values'][:5])
。如果你同意,那么我的上述内容必须稍作修改
df['av'].iloc[window-1] = np.mean(df['values'][:window])
df.loc[window-1:,'av'] = (df.loc[window-1:,'av'].fillna(df['values'])
.ewm(adjust=False, alpha=(window-1.)/window).mean())
https://stackoverflow.com/questions/51545419
复制相似问题