以相反的顺序应用 Python Pandas 指数加权平均值
Applying the Python Pandas Exponential Weighted Average in Reverse Order
对于 pandas.DataFrame 示例:
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
我找到了解决问题的方法。您可以在应用 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
我仍然不确定这是否是最有效的方法。所以,如果有人有任何其他想法,我很想知道。
的变体。
注意
df[col].reindex(index=df.index[::-1])
获得与以下类似的结果:
df[col].sort_index(ascending=False)
一个区别是 reindex
就地更改了索引,而 sort_index
将 inplace
作为一个选项。因此,与 reindex
:
不同,sort_index
的一个优点是你不需要在最后切换回来
df[col] = df[col].sort_index(ascending=False).ewm(...).mean()
另请注意,sort_index
的解决方案当然假定索引值以正确的方式排序。如果不是,我不确定采用滚动平均值是否会
具有物理意义。
对于 pandas.DataFrame 示例:
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
我找到了解决问题的方法。您可以在应用 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
我仍然不确定这是否是最有效的方法。所以,如果有人有任何其他想法,我很想知道。
注意
df[col].reindex(index=df.index[::-1])
获得与以下类似的结果:
df[col].sort_index(ascending=False)
一个区别是 reindex
就地更改了索引,而 sort_index
将 inplace
作为一个选项。因此,与 reindex
:
sort_index
的一个优点是你不需要在最后切换回来
df[col] = df[col].sort_index(ascending=False).ewm(...).mean()
另请注意,sort_index
的解决方案当然假定索引值以正确的方式排序。如果不是,我不确定采用滚动平均值是否会
具有物理意义。