расширение экспоненциального взвешивания на многоиндексном DataFrame Pandas, где каждый день является матрицей - PullRequest
0 голосов
/ 02 октября 2018

У меня есть многоиндексный фрейм данных, где первый индекс - дата, а каждый день - матрица 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-01-02, новый df - это экспоненциально взвешенное среднее из 2 матриц на 2017-01-01 и 2017-01-02 от df.На 2017-01-03 это средневзвешенное значение по экспоненте из 3 матриц.

Я пробовал сочетания группового / расширения / применения / ewm, но не нашел решения.

1 Ответ

0 голосов
/ 08 октября 2018

Будет ли работать ниже для вас?Группировка по второму индексу с последующим применением 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
...