以相反的顺序应用 Python 熊猫指数加权平均值



对于熊猫。数据帧示例:

In: cols = ['cols1', 'cols2']
In: df = pd.DataFrame({'col1': [1, 2, 3, 4], 'col2': [3, 4, 5, 6]})
Out:       col1  col2
0     1     3
1     2     4
2     3     5
3     4     6

我正在使用指数加权平均值:

In: for i in range(len(df.columns)):
df[cols[i]] = df[cols[i]].ewm(com=None, span=None, halflife=None, 
alpha=.8, min_periods=0, adjust=True,
ignore_na=False, axis=0).mean()

效果很好!但是,权重的应用值从上到下呈指数递减:

Out:      col1      col2
0  1.000000  3.000000
1  1.833333  3.833333
2  2.774194  4.774194
3  3.756410  5.756410

我想知道是否有办法以相反的顺序(自下而上(应用权重。我想要的输出是:

Out:          col1          col2
0     0.9391025     2.8173075
1     1.8494627     3.6982925
2     2.7499995     4.5833325
3     4.000000      6.000000

kel's solution的变体。

请注意,

df[col].reindex(index=df.index[::-1])

获得的结果与以下内容类似:

df[col].sort_index(ascending=False)

一个区别是reindex更改索引,而sort_indexinplace作为一种选项。 因此,sort_index的一个优点是你不需要在最后切换回来,不像reindex

df[col] = df[col].sort_index(ascending=False).ewm(...).mean()

另请注意,带有sort_index的解决方案当然假定索引值以正确的方式排序。 如果不是,我不确定采用滚动平均值是否会 在物理上有意义。

我找到了解决问题的方法。您可以在应用 ewm(( 之前和之后重新索引:

In: df.reindex(index=df.index[:-1])
for i in range(len(df.columns)):
df[cols[i]] = df[cols[i]].ewm(com=None, span=None, halflife=None, 
alpha=.8, min_periods=0, adjust=True,
ignore_na=False, axis=0).mean()
Out:        col1      col2
3  4.000000  6.000000
2  3.166667  5.166667
1  2.225806  4.225806
0  1.243590  3.243590

然后,您可以再次应用它:

In: df.reindex(index=df.index[:-1])
Out:        col1      col2
0  1.243590  3.243590
1  2.225806  4.225806
2  3.166667  5.166667
3  4.000000  6.000000

我仍然不确定这是否是最有效的方法。所以,如果有人有任何其他想法,我很想知道。

最新更新