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’),所以提示错误没有合适的属性