在 Pandas 多索引 DataFrame 上扩展指数权重,其中每一天都是一个矩阵

Posted

技术标签:

【中文标题】在 Pandas 多索引 DataFrame 上扩展指数权重,其中每一天都是一个矩阵【英文标题】:expanding exponential weighting on Pandas multi-index DataFrame where each day is a matrix 【发布时间】:2019-03-07 04:13:52 【问题描述】:

我有一个多索引数据框,其中第一个索引是日期,每天都是一个 3x3 矩阵:

multi_index = pd.MultiIndex.from_product([[pd.datetime(2017, 1, 1),pd.datetime(2017, 1, 2),pd.datetime(2017, 1, 3)], ['A','B','C']])
df = pd.DataFrame(index=multi_index, data="A": [1, 2, 3, 4, 1, 2, 3, 4, 2],"B": [1, 2, 3, 4, 1, 2, 3, 4, 2],"C": [1, 2, 3, 4, 1, 2, 3, 4, 2])

我想创建一个与 df 具有相同结构的新数据框,但这些值是矩阵扩展窗口的指数加权平均值。

因此对于 2017-01-01,新 df 与旧 df 相同。在 2017 年 1 月 2 日,新的 df 是来自 df 的 2017 年 1 月 1 日和 2017 年 1 月 2 日 2 个矩阵的指数加权平均值。在2017-01-03,它是3个矩阵的指数加权平均值。

我正在尝试 groupby/expanding/apply/ewm 的组合,但没有找到解决方案。

【问题讨论】:

我喜欢这个问题!我的理解是ewm 只有滚动窗口功能。所以我最初的猜测也是使用expanding,然后使用自定义函数进行指数平均。 @gofvonx 似乎“扩展”适用于行,而不是每日协方差矩阵。如果你能用给定的数据展示一个例子,那就太好了。 【参考方案1】:

以下内容对您有用吗?按第二个索引分组,然后应用pandas.DataFrame.ewm

print(df)
              A  B  C
2017-01-01 A  1  1  1
           B  2  2  2
           C  3  3  3
2017-01-02 A  4  4  4
           B  1  1  1
           C  2  2  2
2017-01-03 A  3  3  3
           B  4  4  4
           C  2  2  2

result = df.groupby(level=1).apply(lambda x: x.ewm(1).mean())
print(result)
                     A         B         C
2017-01-01 A  1.000000  1.000000  1.000000
           B  2.000000  2.000000  2.000000
           C  3.000000  3.000000  3.000000
2017-01-02 A  3.000000  3.000000  3.000000
           B  1.333333  1.333333  1.333333
           C  2.333333  2.333333  2.333333
2017-01-03 A  3.000000  3.000000  3.000000
           B  2.857143  2.857143  2.857143
           C  2.142857  2.142857  2.142857

【讨论】:

以上是关于在 Pandas 多索引 DataFrame 上扩展指数权重,其中每一天都是一个矩阵的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 多索引 DataFrame 到 Numpy Ndarray

Pandas - 在循环中应用多索引标签

在 Pandas 多索引 DataFrame 上扩展指数权重,其中每一天都是一个矩阵

绘制 pandas 多索引 DataFrame,其中一个索引作为 Y 轴,另一个作为 X 轴

使用多索引在 pandas DataFrame 上设置值

如何在 Pandas 中创建多索引