在使用多索引Panda数据帧计算滚动平均值时,有没有办法指定日频率



我有一个Pandas数据帧,数据如下。我需要按companydate分组,然后通过这样的分组计算滚动平均值(例如2天、3天等(。

df = pd.DataFrame({
'company': ['abc', 'abc', 'abc', 'xyz', 'xyz', 'xyz'],
'dt': pd.to_datetime([
'2022-01-01', '2022-01-02', '2022-01-03',
'2022-01-31', '2022-02-01', '2022-02-02'
]),
'volume': [1, 2, 3, 4, 5, 6]
})

如果我执行以下操作,则滚动平均数是跨公司的。

df.groupby(['company', 'dt'])['volume'].mean().rolling(2).mean()

结果如下,但不是我想要的。当我到达xyz公司时,它应该只考虑与该公司相关的日期/值。

公司dtabc 2022-01-01 NaN2022-01-02 1.52022-01-03 2.5xyz 2022-01-31 3.52022-02-01 4.52022-02-02 5.5

此外,我不能指定频率为2D3D;如果我这样做,那么我会得到以下错误:ValueError: window must be an integer 0 or greater

唯一的方法是发布单独的代码吗?

df[df['company']=='abc'].groupby(['dt'])['volume'].mean().rolling('2D').mean()
df[df['company']=='xyz'].groupby(['dt'])['volume'].mean().rolling('2D').mean()

有更好的方法。在company上分组,并使用dt作为计算rolling窗口的列:

df['dt'] = pd.to_datetime(df['dt'])
df.groupby('company').rolling('2d', on='dt')['volume'].mean()

company  dt        
abc      2022-01-01    1.0
2022-01-02    1.5
2022-01-03    2.5
xyz      2022-01-31    4.0
2022-02-01    4.5
2022-02-02    5.5
Name: volume, dtype: float64

相关内容

最新更新