如何在Pandas中按客户ID计算近30天DaysLate滚动均值
按客户ID计算近30天DaysLate滚动均值的实现
直接通过分组结合时间窗口滚动即可实现,步骤如下:
- 先确保数据按客户ID和发票日期排序(时间窗口滚动依赖有序的时间序列)
- 按客户分组后,应用30天时间窗口的滚动均值计算
完整代码:
# 按客户ID和发票日期排序,保证每个客户的记录时间有序 df = df.sort_values(['customerID', 'InvoiceDate']) # 分组计算每个客户近30天的DaysLate滚动均值 df['CustomerDaysLate_30days'] = df.groupby('customerID').rolling( window='30d', on='InvoiceDate', min_periods=1 # 可选参数:允许窗口最少1条记录就计算均值,避免NaN )['DaysLate'].mean().reset_index(level=0, drop=True)
代码说明:
sort_values(['customerID', 'InvoiceDate']):必须先排序,否则每个客户的时间窗口计算会混乱,Pandas的时间窗口滚动默认要求序列是时间有序的。groupby('customerID'):将数据按客户拆分,每个客户独立计算自己的滚动均值,不会和其他客户的记录混淆。rolling(window='30d', on='InvoiceDate'):指定滚动窗口为30天,基于InvoiceDate列的时间划定窗口范围,每个记录的窗口是该记录日期往前推30天内的所有同客户记录。reset_index(level=0, drop=True):去掉分组产生的customerID索引层,让计算结果的索引和原DataFrame对齐,直接赋值到新列中。min_periods=1:可选设置,如果不需要允许单条记录计算均值,可以去掉这个参数,此时若客户在30天窗口内无记录,结果会是NaN。
内容的提问来源于stack exchange,提问作者Adam Grant
相关产品推荐
相关产品推荐

