使用 Groupby 的 Pandas 滚动函数

Posted

技术标签:

【中文标题】使用 Groupby 的 Pandas 滚动函数【英文标题】:Pandas Rolling Functions with Groupby 【发布时间】:2015-05-14 15:47:33 【问题描述】:

在使用 group by 函数时,我在尝试在 Pandas 中实现“滚动”函数(即 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(),它不返回任何错误,但它也返回所有空值。有什么想法吗? 这可行,但它没有按“ID”分组:df['roll_corr'] = pd.rolling_corr(df['Val1'],df['Val2'],2)。我也无法让它与 .apply 函数一起使用。 嗨,Brendan,你解决了这个问题吗?如果是这样,您能否分享您的解决方案。 【参考方案1】:

在较新版本的 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 的详细输出,类似但稍微复杂一些:

Rolling Correlation with Groupby in Pandas

【讨论】:

以上是关于使用 Groupby 的 Pandas 滚动函数的主要内容,如果未能解决你的问题,请参考以下文章

pandas使用groupby函数计算dataframe数据中每个分组的滚动统计值(rolling statistics)的语法:例如分组的N天滚动平均值滚动中位数滚动最大最小值滚动加和等

pandas使用groupby函数计算dataframe数据中每个分组的N个数值的滚动标准差(rolling std)例如,计算某公司的多个店铺每N天(5天)的滚动销售额标准差

pandas使用groupby函数计算dataframe数据中每个分组的N个数值的滚动分位数(rolling quantile)例如,计算某公司的多个店铺每N天(5天)的滚动销售额分位数

pandas使用groupby函数计算dataframe数据中每个分组的N个数值的滚动计数个数(rolling count)例如,计算某公司的多个店铺每N天(5天)的滚动销售额计数个数

pandas使用groupby函数计算dataframe数据中每个分组的N个数值的滚动最小值(rolling min)例如,计算某公司的多个店铺每N天(5天)的滚动销售额最小值

pandas使用groupby函数计算dataframe数据中每个分组的N个数值的滚动最大值(rolling max)例如,计算某公司的多个店铺每N天(5天)的滚动销售额最大值