熊猫每年滚动的平均值

时间:2020-07-07 18:03:57

标签: python pandas pandas-groupby

我有一个具有以下结构的数据框:

索引: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

从文档中,我认为滚动可以接受和补偿可变长度窗口,但他们认为是不可行的。

什么是正确的方法?

1 个答案:

答案 0 :(得分:0)

该错误很可能是因为一年中的天数不固定。另一种选择是使用365d代替下面的代码中使用.expanding() windowpd.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