RFM模型:
R:最近一次消费时间,常用时间基准减上次消费时间的间隔表示
F:消费频次
M:消费金额
计算得到三个指标后,进行整合计算,可以直接相加,或者加权的方式,但是首要的任务是计算RFM的三个指标
源数据如下:
因为时间不是日期,但是交易次数要按天数计算,因此要转化数据,变成一个卡号对应日期和金额,也就是说要汇总。好了直接上代码了
import pandas as pd
import numpy as np
import time
s=time.time()
# data_2016=pd.read_excel('C:\\Users\\02180085\\Desktop\\回店会员特征\\16年消费明细.xlsx')
# data_2017=pd.read_excel('C:\\Users\\02180085\\Desktop\\回店会员特征\\17年消费明细.xlsx')
# data_2018=pd.read_excel('C:\\Users\\02180085\\Desktop\\回店会员特征\\18年消费明细.xlsx')
data_2019=pd.read_excel('C:\\Users\\02180085\\Desktop\\回店会员特征\\19年-6.30.xlsx')
# data=pd.concat([data_2016,data_2017,data_2018,data_2019],axis=0,join='inner')
data=data_2019
#让卡号对应日期,一个卡号可对应对多个日期
data['日期'] = pd.to_datetime(list(map(lambda x: x.date(), data.loc[:, '交易时间'])))
data = data.loc[:, ['卡号', '日期', '销售金额']].groupby(by=['卡号', '日期'], as_index=False).agg({'销售金额': np.sum})
data=data[['卡号','日期','销售金额']]
dq=pd.read_excel('C:\\Users\\02180085\\Desktop\\回店会员特征\\日期星期档期.xlsx')
dq=dq[['日期','是否档期']]
#循环运行函数
def fun2():
df = pd.DataFrame([], columns=['上次交易间隔', '交易次数', '交易金额','卡号','日期'])
for day in data.loc[data['日期']>pd.to_datetime('2019/6/25'),'日期'].sort_values().drop_duplicates():
# for day in data['日期'].drop_duplicates():
#仅仅对指定日期的卡号追踪上一次交易日期
kh=data.loc[data['日期']==day,'卡号']
data1=data.loc[(data['日期']<day) & (data['卡号'].isin(kh)),:]
result=data1.groupby('卡号').agg({'日期':[lambda x:day-max(x),len],'销售金额':np.sum})
result=pd.DataFrame(result)#将series对象转化为DF对象
result['卡号']=result.index.tolist()
result.index.name='索引'
result.columns=['上次交易间隔','交易次数','交易金额','卡号']
result['日期']=day
result['上次交易间隔得分']=pd.cut(result['上次交易间隔'],5,labels=[5,4,3,2,1])
result['交易次数得分'] = pd.cut(result['交易次数'], 5,labels=[1,2,3,4,5])
result['交易金额得分'] = pd.cut(result['交易金额'], 5,labels=[1,2,3,4,5])
result[['上次交易间隔得分','交易次数得分','交易金额得分']]=result[['上次交易间隔得分','交易次数得分','交易金额得分']].astype(dtype='int')
result['总得分']=result['上次交易间隔得分']*0.5+result['交易次数得分']*0.25+result['交易金额得分']*0.25
result['总类别']=pd.cut(result['总得分'], 5,labels=[1,2,3,4,5])
print(result)
df=pd.concat([df,result],axis=0,join='outer')
df.index=np.arange(0,df.shape[0])
df1=pd.merge(df,dq,how='left',on='日期')
print(df1)
df1.to_excel('C:\\Users\\02180085\\Desktop\\回店会员特征\\结果.xlsx')
return df1
#运行函数
fun2()
e=time.time()
print(e-s)
整体思路就是,转化源数据,将卡号,日期,金额对应(gruopby+agg)-----计算RFM(groupby+agg)----计算各自得分(cut)----计算总得分(pandas运算)—将总得分再分类计算得分(cut)
括号内为主要的方法,注意我们不是计算一天的会员RFM,我们循环计算每一天的RFM。
1、转化源数据,将卡号,日期,金额对应(gruopby+agg)
2、计算RFM(groupby+agg)
3、计算各自得分(cut)----计算各自得分(cut)----计算总得分(pandas运算)—将总得分再分类计算得分(cut)
最终结果