如何识别周期性转账客户并生成转账金额与日期推荐
如何识别周期性转账客户并生成转账推荐?
给定包含id_customer(客户标识)、id_receiver(收款方标识)、money(转账金额)、date(转账日期)字段的数据集,我们可以通过以下步骤识别周期性转账的客户,并生成对应的转账金额与日期推荐:
步骤1:数据预处理
首先需要将整数格式的日期转换为可计算的datetime类型,同时清理字段名的冗余空格:
import pandas as pd # 示例数据集 df = pd.DataFrame({ 'id_customer ': ['1', '1', '1'], 'id_receiver ': ['A', 'A', 'B'], 'date': [20230101, 20230201, 20230506], 'money': [10,10,50] }) # 清理字段名末尾空格 df.columns = df.columns.str.strip() # 转换日期格式为datetime df['date'] = pd.to_datetime(df['date'], format='%Y%m%d')
步骤2:筛选有效分组
只有同一客户向同一收款方转账至少2次的分组,才具备判断周期性的基础,先筛选出这类分组:
# 过滤出转账次数≥2的客户-收款方组合 grouped = df.groupby(['id_customer', 'id_receiver']).filter(lambda x: len(x) >= 2) # 重新分组用于后续计算 grouped = grouped.groupby(['id_customer', 'id_receiver'])
步骤3:识别周期性规律并生成推荐
对每个分组,验证两个核心规律:转账金额固定、转账时间间隔稳定(或符合月/周等周期特征),然后生成下一次转账的推荐:
def detect_and_recommend(group): # 按日期排序分组数据 sorted_group = group.sort_values('date').reset_index(drop=True) # 检查转账金额是否完全一致 is_amount_fixed = sorted_group['money'].nunique() == 1 if not is_amount_fixed: return pd.Series({'next_date': pd.NaT, 'amount': None, 'is_periodic': False}) # 计算相邻转账的日期间隔(天数) date_diffs = sorted_group['date'].diff().dropna().dt.days is_periodic = False next_date = pd.NaT # 判断是否为月周期(最常见的周期性转账场景) if all(28 <= diff <= 32 for diff in date_diffs): # 进一步验证每月转账日期是否一致(比如都是每月1号) if sorted_group['date'].dt.day.nunique() == 1: is_periodic = True # 推算下一次转账日期:最后一次转账日期加1个月 next_date = sorted_group['date'].iloc[-1] + pd.DateOffset(months=1) # 判断是否为固定天数周期(比如每周/每15天转账) elif date_diffs.nunique() == 1: is_periodic = True period_days = date_diffs.iloc[0] next_date = sorted_group['date'].iloc[-1] + pd.Timedelta(days=period_days) return pd.Series({ 'next_transfer_date': next_date, 'recommended_amount': sorted_group['money'].iloc[0] if is_periodic else None, 'is_periodic': is_periodic }) # 应用函数到所有分组 recommendations = grouped.apply(detect_and_recommend).reset_index()
步骤4:查看有效推荐
筛选出符合周期性的推荐结果:
valid_recs = recommendations[recommendations['is_periodic']] print(valid_recs)
针对示例数据集,输出结果为:
id_customer id_receiver next_transfer_date recommended_amount is_periodic 0 1 A 2023-03-01 10 True
完全匹配需求:客户1每月1日向收款方A转账10欧元,推荐其2023年3月1日继续转账10欧元。
内容的提问来源于stack exchange,提问作者Maite89
相关产品推荐
相关产品推荐

