Python操作RFM模型 代码整理

#复制数据
data_3 = data.copy()
data_3

#设置索引
data_3.set_index('CustomerID',drop=True,inplace = True)
data_3

#增加一列,计算订单数量
data_3['Orders']=1
data_3

#做透视表
data_group = pd.pivot_table(data_3,
                            index ='CustomerID',
                            values = ['Orders','OrderDate','Sales'],
                            aggfunc={'Orders':sum,
                                     'OrderDate':max,
                                    'Sales':sum})
data_group
#计算R
import datetime 
data_group['R']=(data_group['OrderDate'].max()-data_group['OrderDate']).dt.days
  # 也可写成 data_group['R']=(data_group.OrderDate.max()-data_group.OrderDate).dt.days
data_group

#对RFM数据分组,打分
list_R = [-1,32,93,186,277,365] 
data_group['R_S'] =pd.cut(data_group.R,bins = list_R,labels=[5,4,3,2,1])  #间隔越大,得分越低,间隔根据实际情况更改
data_group

list_F = [0,5,10,20,50,100] 
data_group['F_S'] =pd.cut(data_group['Orders'],bins = list_F,labels=[1,2,3,4,5])  #次数越多,分值越大,间隔根据实际情况更改
data_group

list_M = [0,500,1000,10000,50000,100000] 
data_group['M_S'] =pd.cut(data_group['Sales'],bins = list_M,labels=[1,2,3,4,5])  #金额越多,分值越大,间隔根据实际情况更改
data_group

#根据分数评定不同的级别,这里分数和分数的平均数对比
#定义函数
def RFM_func(x):
    level = x.apply(lambda x:""if x>0 else "")
    label = level.R_S + level.F_S + level.M_S
    A ={
        '低高高':'重要保持客户',
        '高高高':'重要价值客户',
        '低低高':'重要挽留客户',
        '高低高':'重要发展客户',
        '低高低':'一般保持客户',
        '高高低':'一般价值客户',
        '低低低':'一般挽留用户',
        '高低低':'一般发展客户'
    }
    return A[label]


#调用函数
#先将数据转换成int型
data_group['R_S']=data_group['R_S'].values.astype('int') 
data_group['F_S']=data_group['F_S'].values.astype('int')
data_group['M_S']=data_group['M_S'].values.astype('int')
data_group['RFM'] = data_group[['R_S','F_S','M_S']].apply(lambda x:x-x.mean()).apply(RFM_func,axis = 1)
data_group

#对贴上标签之后的客户简单分析
data_group_RFM = data_group.groupby(by='RFM')['RFM'].count()
#1、绘图看分布
data_group_RFM.plot.bar()
data_group_RFM = data_group_RFM.to_frame()
data_group_RFM
#2、计算百分比
data_group_RFM['pct%']=round(data_group_RFM['RFM']/data_group_RFM['RFM'].sum()*100,2)
data_group_RFM

 出现的问题:

1、【错误】'categorical cannot perform the operation mean', 'occurred at index

                     因为数据类型有问题,转换成int计算即可——.value.astype(int’)

2、【错误】 'numpy.ndarray' object has no attribute 'apply'

                     因为apply()前面写了.value.astype(‘int’),所以提示错误没有合适的属性

 

posted @ 2021-08-10 17:15  午时  阅读(381)  评论(0编辑  收藏  举报