使用 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天)的滚动销售额最大值