Python每日一记107>>>会员数据分析之RFM模型实现

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)
在这里插入图片描述
在这里插入图片描述
最终结果
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值