繁体   English   中英

Pandas 使用 MultiIndex 和 GroupBy 滚动

[英]Pandas Rolling With MultiIndex and GroupBy

我正在考虑为给定的id创建过去n结果的滚动总和。 DataFrame 的索引是iddate

下面的代码适用于非基于时间的滚动窗口,即整数。 但是,不适用于基于时间的间隔,例如'10D' (10 天)。

1.

df2['rolling_sum'] = df2.groupby(['id'])['a_column_to_rolling_sum'].apply(lambda x: x.rolling(2, 1).sum().shift())

>> Rolling Result
id               date_dt   
-2143487296      2019-07-08         NaN
                 2019-07-15    0.104478
                 2019-07-19    0.217260
-2143477291      2019-07-05         NaN
                 2019-07-10    0.238764
                 2019-07-16    0.391669
                 2019-07-22    0.255469
                 2019-07-29    0.244011

下面的代码几乎可以得到我想要的,但是,当到达一个新组时,它应该是NaN因为不能有以前的总和。

2.

rolling_result = (
    df2
    .reset_index(level=0)
    .groupby('id')['a_column_to_rolling_sum']
    .rolling('10D', min_periods=1)
    .sum()
    .shift(1)
)

# Add to df
df2['rolling_sum'] = rolling_result

>> Rolling Result
id               date_dt   
-2143487296      2019-07-08         NaN
                 2019-07-15    0.104478
                 2019-07-19    0.217260
-2143477291      2019-07-05    0.229506  <- Why is it not NaN!
                 2019-07-10    0.238764
                 2019-07-16    0.391669
                 2019-07-22    0.255469
                 2019-07-29    0.244011

两列的图像,左边是我想要的,右边是我从2得到的。

回顾一下:我想按多列分组,包括iddate 对于这些组中的每一个,我想创建n天( '10D' )和m次出现(整数值)的滚动总和,这样每个组的开始都是NaN

非常感谢!

您应该从rolling中删除min_periods=1参数,这将为您提供您所寻求的(作为参考, min_periods参数记录为“窗口中需要具有值的最小观察数;否则,结果为 np.nan。” )

问题发生在轮班期间。 滚动结果需要再次分组,即

rolling_result = (
    df2
    .reset_index(level=0)
    .groupby('id')['a_column_to_rolling_sum']
    .rolling('10D', min_periods=1)
    .sum()
    .groupby('id')
    .shift(1)
)

# Add to df
df2['rolling_sum'] = rolling_result

这也适用于多个groupby参数。 如果您有其他索引,请删除所有日期栏,即.reset_index(level=(0,1,...))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM