如何用Pandas统计12个月滚动窗口内有交易的客户数量?
计算12个月滚动窗口内至少有一笔交易的客户数量
步骤1:预处理数据
先把字符串格式的purchase_date转为datetime类型,同时去重同一客户同一天的重复交易(只要有一笔就计为活跃,无需重复统计):
import pandas as pd # 示例数据(替换为你的实际DataFrame) df = pd.DataFrame({ 'customer_id': [1, 2, 1, 3], 'purchase_date': ['12-01-2023', '11-24-2022', '03-15-2023', '06-20-2023'], 'purchase_amt': [150.00, 84.23, 90.50, 200.00] }) # 转换日期格式 df['purchase_date'] = pd.to_datetime(df['purchase_date'], format='%m-%d-%Y') # 去重:每个客户每个交易日期仅保留一条记录 unique_cust_dates = df.drop_duplicates(subset=['customer_id', 'purchase_date'])
步骤2:生成连续日期序列(按需选择)
如果需要按每日计算滚动窗口的活跃客户数,先生成覆盖数据全时间范围的连续日期:
min_date = unique_cust_dates['purchase_date'].min() max_date = unique_cust_dates['purchase_date'].max() date_range = pd.date_range(start=min_date, end=max_date, freq='D')
若只需按每月月末计算,把freq改为'M'即可,大幅减少计算量。
步骤3:两种高效计算方法
方法一:滚动窗口+集合去重(适合中小数据集)
先统计每日活跃客户集合,再用12个月窗口合并集合并统计唯一客户数:
# 按日期分组,获取每日活跃客户的集合 daily_active = unique_cust_dates.groupby('purchase_date')['customer_id'].apply(set) # 补全缺失日期的空集合 daily_active = daily_active.reindex(date_range, fill_value=set()) # 定义12个月滚动窗口(用DateOffset保证精确月数,避免闰年/月份天数差异) window = pd.DateOffset(months=12) # 滚动计算窗口内的唯一客户数量 rolling_active = daily_active.rolling(window).apply( lambda x: len(set.union(*x)), raw=False ) # 整理成结果DataFrame result = pd.DataFrame({ 'date': rolling_active.index, 'active_customers': rolling_active.values })
方法二:日期范围匹配(适合大数据集)
先按客户聚合交易日期,再对每个窗口结束日期筛选符合条件的客户:
# 按客户分组,存储每个客户的所有交易日期 cust_trans_dates = unique_cust_dates.groupby('customer_id')['purchase_date'].apply(list) # 定义函数:计算指定结束日期前12个月内的活跃客户数 def count_active(end_date): start_date = end_date - pd.DateOffset(months=12) # 判断客户是否有交易日期落在窗口范围内 active_flag = cust_trans_dates.apply(lambda dates: any(start_date <= d <= end_date for d in dates)) return active_flag.sum() # 批量计算所有日期的活跃客户数 result = pd.DataFrame({ 'date': date_range, 'active_customers': date_range.map(count_active) })
内容的提问来源于stack exchange,提问作者user3490622
相关产品推荐
相关产品推荐

