在Pandas中使用分组滚动相关性

5
假设我有一个类似下面的Pandas数据框,我该如何获取2个特定列的滚动相关性(在此示例中为2天),并按“ID”列进行分组?我熟悉Pandas rolling_corr()函数,但我无法弄清如何将其与groupby()子句结合使用。
我有什么:
ID  Date    Val1    Val2
A   1-Jan   45      22
A   2-Jan   15      66
A   3-Jan   55      13
B   1-Jan   41      12
B   2-Jan   87      45
B   3-Jan   82      66
C   1-Jan   33      34
C   2-Jan   15      67
C   3-Jan   46      22

我需要的是:

ID  Date    Val1    Val2    Rolling_Corr
A   1-Jan   45      22  
A   2-Jan   15      66      0.1
A   3-Jan   55      13      0.16
B   1-Jan   41      12  
B   2-Jan   87      45      0.15
B   3-Jan   82      66      0.05
C   1-Jan   33      34  
C   2-Jan   15      67      0.09
C   3-Jan   46      22      0.11

谢谢!

1个回答

3
您可以从这里开始简单地处理: Pandas相关性分组,然后像这样添加rolling(3)
df.groupby('ID')[['Val1','Val2']].rolling(3).corr()

我将窗口从2改为3,因为窗口大小为2时只能获得1或-1。不幸的是,输出结果(未显示)有些冗长,因为它输出了一个2x2的相关矩阵,而你只需要一个标量值。

但是,通过添加一行代码,你可以使输出更简洁:

df2 = df.groupby('ID')[['Val1','Val2']].rolling(3).corr()

df2.groupby(level=[0,1]).last()['Val1']

ID   
A   0         NaN
    1         NaN
    2   -0.996539
B   3         NaN
    4         NaN
    5    0.879868
C   6         NaN
    7         NaN
    8   -0.985529

3
感谢您的努力。我发布了另一个问题,但我认为我正在接近......使用apply方法与lambda函数似乎朝着正确的方向发展。 - Gohawks
新的问答:https://dev59.com/p4jca4cB1Zd3GeqPz6gO - JohnE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接