使用Pandas计算客户首购及流失回流后的新增获取次数
客户新增获取次数统计实现方案
核心逻辑说明
我们需要统计的「新增获取次数」本质是每个客户独立有效消费周期的数量,满足以下任意一个条件的有效消费(Amt>0)记为一次新增获取:
- 该记录是对应客户的第一条有效消费记录
- 该记录与客户上一次有效消费记录之间,存在至少1个周期的无消费间隔(本案例中周期为1个月,可根据实际业务规则调整)
完整实现代码
第一步:数据预处理
先完成日期格式转换和排序,保证时间序列顺序正确:
import pandas as pd # 原始DataFrame df = pd.DataFrame({ 'Customer': ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B','B','B','B','B','B'], 'Date': ['1/1/2021', '2/1/2021','3/1/2021', '4/1/2021','5/1/2021', '6/1/2021','7/1/2021', '1/1/2021', '2/1/2021','3/1/2021', '4/1/2021','5/1/2021', '6/1/2021','7/1/2021'], 'Amt': [0, 10, 0, 10, 0, 0, 0, 0, 0, 10, 10, 0, 10, 10] }) # 转换日期格式,按客户+日期升序排序 df['Date'] = pd.to_datetime(df['Date'], format='%d/%m/%Y') # 若日期格式为月/日/年可改为 format='%m/%d/%Y' df = df.sort_values(['Customer', 'Date']).reset_index(drop=True)
第二步:标记新增获取记录
筛选有效消费记录后,通过偏移窗口计算上一次有效消费时间,判断是否为新的消费周期起点:
# 筛选所有有效消费记录 valid_consume_df = df[df['Amt'] > 0].copy() # 按客户分组,获取上一条有效消费的日期 valid_consume_df['last_consume_date'] = valid_consume_df.groupby('Customer')['Date'].shift(1) # 计算两次有效消费的月份间隔 valid_consume_df['month_gap'] = (valid_consume_df['Date'].dt.year - valid_consume_df['last_consume_date'].dt.year) * 12 \ + (valid_consume_df['Date'].dt.month - valid_consume_df['last_consume_date'].dt.month) # 标记新增获取:首次消费 或 间隔大于1个月的回流消费 valid_consume_df['is_new_acquisition'] = valid_consume_df['last_consume_date'].isna() | (valid_consume_df['month_gap'] > 1)
第三步:统计结果
统计每个客户的新增获取总次数
acquisition_count = valid_consume_df.groupby('Customer')['is_new_acquisition'].sum().reset_index() acquisition_count.columns = ['Customer', 'new_acquisition_count'] print(acquisition_count)
输出结果:
Customer new_acquisition_count 0 A 2 1 B 2
完全符合示例要求。
提取每次新增获取的明细日期
acquisition_details = valid_consume_df[valid_consume_df['is_new_acquisition']][['Customer', 'Date']].reset_index(drop=True) print(acquisition_details)
输出结果:
Customer Date 0 A 2021-01-02 1 A 2021-01-04 2 B 2021-01-03 3 B 2021-01-06
规则调整说明
如果业务中的流失判定周期不是1个月,比如是连续30天无消费就算流失,只需要将月份间隔的判断替换为天数间隔判断即可:
# 计算两次消费的天数间隔 valid_consume_df['day_gap'] = (valid_consume_df['Date'] - valid_consume_df['last_consume_date']).dt.days # 间隔超过30天就算回流新增 valid_consume_df['is_new_acquisition'] = valid_consume_df['last_consume_date'].isna() | (valid_consume_df['day_gap'] > 30)
内容的提问来源于stack exchange,提问作者Ryan Erwin
相关产品推荐
相关产品推荐

