我有一个具有以下结构的数据框:
索引:DatetimeIndex 列:客户,业务,余额
我的数据跨越了多年。我正在尝试按年份获取余额的滚动平均值。这意味着我想要一个可变长度的窗口,该窗口在一年的1月1日将是一个大小为1的窗口,在12月31日将是一个大小为365的窗口。然后在第二年,它将从1开始并从那里开始构建。我也在按客户和业务分组。
我尝试了以下操作:
df.groupby(["Client", "Business"]).rolling("AS")["Balances"].mean()
我还尝试过使用"A"
滚动。
我遇到了错误:
ValueError: <YearBegin: month=1> is a non-fixed frequency
从文档中,我认为滚动可以接受和补偿可变长度窗口,但他们认为是不可行的。
什么是正确的方法?
答案 0 :(得分:0)
该错误很可能是因为一年中的天数不固定。另一种选择是使用365d
代替下面的代码中使用.expanding()
window和pd.Grouper()
here。假定预期输出如下所示,因为它未发布在问题中。
# Import libraries
import pandas as pd
# Create DataFrame
dt = [
'2020-05-29',
'2020-05-29',
'2020-01-29',
'2020-01-29',
'2020-02-29',
'2020-03-29',
'2020-06-29',
'2020-06-29'
]
df = pd.DataFrame({
'dt':times
})
df['dt'] = pd.to_datetime(df['dt'])
df['Balances'] = np.random.randint(0,100,8)
df['Client'] = ['A','B','C','A']*2
df['Business'] = ['x','y','z','x']*2
# Groupby
df.groupby([pd.Grouper(key='dt', freq='365d'), "Client", "Business"])['Balances'].expanding().mean()
输出
dfg
dt Client Business
2020-06-29 A x 0 44.0
3 51.0
4 63.0
7 36.0
B y 1 54.0
5 13.0
C z 2 43.0
6 48.0