如何解决熊猫按组滚动协方差Rolling.cov
谁能给我一个有关如何使用Rolling.cov函数的示例: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.core.window.rolling.Rolling.cov.html
我想通过id计算RE和MA之间的90天滚动协方差。我尝试了类似的方法,但是它不起作用:
df.groupby(['id'])[['RE','MA']].rolling(90).cov()
解决方法
- 您可以使用
.set_index()
将Date
包含在数据框中。 - 在此示例中,您需要传递参数
min_periods
。例如,您可以传递min_periods=0
。 - 最后,这取决于您要如何构造数据,但是您可以根据所需的输出传递
.unstack(2)
或.reset_index()
。前者采用新创建的多索引中的第3列,并从行转换为列。后者只是将三个索引列从索引中移出并使其成为普通列:
import pandas as pd
df = pd.DataFrame({'id' : ['A','A','B','B'],'RE' : [1,2,3,4,5,6,7,8,9,10],'MA' : [10,20,30,40,50,60,70,80,90,100],'Date' : ['01-01-2020','02-15-2020','04-01-2020','05-15-2020','06-01-2020','07-15-2020','09-01-2020','10-15-2020','12-01-2020','12-15-2020']})
df['Date'] = pd.to_datetime(df['Date'])
df = df.set_index('Date').groupby(['id'])[['RE','MA']].rolling(90,min_periods=0).cov().unstack(2)
df
Out[24]:
RE MA
MA RE MA RE
id Date
A 2020-01-01 NaN NaN NaN NaN
2020-02-15 5.000000 0.500000 50.000000 5.000000
2020-04-01 10.000000 1.000000 100.000000 10.000000
2020-05-15 16.666667 1.666667 166.666667 16.666667
2020-06-01 25.000000 2.500000 250.000000 25.000000
B 2020-07-15 NaN NaN NaN NaN
2020-09-01 5.000000 0.500000 50.000000 5.000000
2020-10-15 10.000000 1.000000 100.000000 10.000000
2020-12-01 16.666667 1.666667 166.666667 16.666667
2020-12-15 25.000000 2.500000 250.000000 25.000000
使用reset_index()
代替unstack(2)
import pandas as pd
df = pd.DataFrame({'id' : ['A',min_periods=0).cov().reset_index()
df
Out[25]:
id Date level_2 RE MA
0 A 2020-01-01 RE NaN NaN
1 A 2020-01-01 MA NaN NaN
2 A 2020-02-15 RE 0.500000 5.000000
3 A 2020-02-15 MA 5.000000 50.000000
4 A 2020-04-01 RE 1.000000 10.000000
5 A 2020-04-01 MA 10.000000 100.000000
6 A 2020-05-15 RE 1.666667 16.666667
7 A 2020-05-15 MA 16.666667 166.666667
8 A 2020-06-01 RE 2.500000 25.000000
9 A 2020-06-01 MA 25.000000 250.000000
10 B 2020-07-15 RE NaN NaN
11 B 2020-07-15 MA NaN NaN
12 B 2020-09-01 RE 0.500000 5.000000
13 B 2020-09-01 MA 5.000000 50.000000
14 B 2020-10-15 RE 1.000000 10.000000
15 B 2020-10-15 MA 10.000000 100.000000
16 B 2020-12-01 RE 1.666667 16.666667
17 B 2020-12-01 MA 16.666667 166.666667
18 B 2020-12-15 RE 2.500000 25.000000
19 B 2020-12-15 MA 25.000000 250.000000
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。