【问题标题】:Applying the Python Pandas Exponential Weighted Average in Reverse Order以相反的顺序应用 Python Pandas 指数加权平均值
【发布时间】:2018-06-07 18:04:35
【问题描述】:

对于 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

【问题讨论】:

  • 你能发布你想要的输出吗?
  • 我添加了所需的输出。我只想将权重以相反的顺序应用于数据。我最相关的数据位于表格底部,因此我希望它的权重最大。

标签: python pandas exponential weighted weighted-average


【解决方案1】:

我找到了解决问题的方法。您可以在应用 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

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

【讨论】:

    【解决方案2】:

    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 的解决方案当然假设索引值以正确的方式排序。如果不是,我不确定采用滚动平均值是否会 有物理意义。

    【讨论】:

    • 更简单的解决方案是使用切片:df[::-1][col].ewm(...).mean()。我没有比较相对速度。
    猜你喜欢
    • 1970-01-01
    • 2016-05-23
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    • 2015-11-13
    • 2016-02-12
    相关资源
    最近更新 更多