带有Groupby的Pandas滚动函数

4

当我使用group by函数时,尝试在Pandas中实现'rolling'函数(即rolling_std()和rolling_corr())时,我遇到了问题。我已经尝试使用以下公式,但是我不断收到“ValueError:cannot reindex from a duplicate axis”的错误信息。

df是我的数据框:

df.groupby(level='ID')['Val1'].apply(lambda x: pd.rolling_std(x,30))

我所拥有的:

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    Rolling_Std (Val1)
A   1-Jan   45  22      
A   2-Jan   15  66  0.1 1.2
A   3-Jan   55  13  0.16    2.5
B   1-Jan   41  12      
B   2-Jan   87  45  0.15    2.8
B   3-Jan   82  66  0.05    1.1
C   1-Jan   33  34      
C   2-Jan   15  67  0.09    1.5
C   3-Jan   46  22  0.11    2.4

谢谢


我已经接近成功了。rolling_std函数现在实际上可以工作了。我不得不重新索引我的数据框。df['roll_corr'] = df.groupby(level='ID').apply(lambda x: pd.rolling_corr(x['Val1'],x['Val2'],2))当我添加rolling_corr()函数时,它没有返回任何错误,但也返回所有空值。有什么想法吗? - Gohawks
这个代码是可以运行的,但是它没有按照'ID'进行分组:df['roll_corr'] = pd.rolling_corr(df['Val1'],df['Val2'],2)。我也无法通过使用.apply函数来解决这个问题。 - Gohawks
2
嗨,Brendan,你解决了这个问题吗?如果是的话,能否请分享一下你的解决方案。 - Stergios
1个回答

0
在较新的pandas版本中,rolling的语法已经发生了变化,例如,从rolling_std()变为rolling().std(),并且在与groupby结合使用时效果很好。
df.groupby('ID').rolling(2).std()

     ID   Date       Val1       Val2
ID                                  
A  0  A  1-Jan        NaN        NaN
   1  A  2-Jan  21.213203  31.112698
   2  A  3-Jan  28.284271  37.476659
B  3  B  1-Jan        NaN        NaN
   4  B  2-Jan  32.526912  23.334524
   5  B  3-Jan   3.535534  14.849242
C  6  C  1-Jan        NaN        NaN
   7  C  2-Jan  12.727922  23.334524
   8  C  3-Jan  21.920310  31.819805

或者查看以下关于corr的内容,它类似但稍微复杂一些,因为corr输出冗长:

Pandas中按组滚动相关性


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