首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python: numpy,pandas,以及在前一个数组值(平滑平均值)上执行操作:有什么方法可以不使用FOR循环吗?EWMA?

Python: numpy,pandas,以及在前一个数组值(平滑平均值)上执行操作:有什么方法可以不使用FOR循环吗?EWMA?
EN

Stack Overflow用户
提问于 2018-07-27 02:29:56
回答 1查看 62关注 0票数 1

顺便说一句,我真的不知道该怎么问这个问题。我有一个值的数组,我希望将这些值的平滑平均值向前移动。在Excel中,计算过程为:

窗口大小=通过window_size

  • average_val_2的平均值=(位置window_size+1 * window_size-1 +average_val_1的值)/ window_size

  • average_val_3 =(位置window_size+2的值* window_size-1 + average_val_2) / window_size

等等。

在pandas和numpy中,我的代码如下

代码语言:javascript
复制
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

它返回:

代码语言:javascript
复制
    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 循环更好的方法。我认为答案与使用指数加权移动平均有关,但如果我能找出语法来理解它,我会被诅咒的。

有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-27 03:48:14

您可以使用ewm,例如:

代码语言:javascript
复制
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可以帮助您增加要计算的行的权重。

注意:虽然这段代码和您的代码一样,但我建议您查看代码中的这一行:

代码语言:javascript
复制
df['av'].iloc[5] = np.mean(df['values'][:5])

由于在对[:5]进行切片时排除了上界,因此df['values'][:5]是:

代码语言:javascript
复制
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])。如果你同意,那么我的上述内容必须稍作修改

代码语言:javascript
复制
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())
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51545419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档