RFM模型了解和数据实践以及dataframe用sql语句查询
RFM模型基础知识
- R(Recency):客户最近一次交易时间的间隔。R值越大,表示客户交易发生的日期越久,反之则表示客户交易发生的日期越近。
- F(Frequency):客户在最近一段时间内交易的次数。F值越大,表示客户交易越频繁,反之则表示客户交易不够活跃。
- M(Monetary):客户在最近一段时间内交易的金额。M值越大,表示客户价值越高,反之则表示客户价值越低。
数据处理实践
- 博客会上传一个csv文件里面是用户的交易信息,包含了订单id,用户id,时间,价格,商品类别等,编码是gbk。
- 文件比较大所以输出只截取前几个
- 本文是处理这个文件并得出rfm模型(并且都使用jupyter notebook),如果是pycharm输出时加上print即可
读取文件
import pandas as pd
import numpy as np
data = pd.read_csv('RFM_TRAD_FLOW.csv', encoding='gbk')
data
输出(只截了前五个,也可以使用head()方法截取)
transID cumid time amount type_label type
0 9407 10001 14JUN09:17:58:34 199.0 正常 Normal
1 9625 10001 16JUN09:15:09:13 369.0 正常 Normal
2 11837 10001 01JUL09:14:50:36 369.0 正常 Normal
3 26629 10001 14DEC09:18:05:32 359.0 正常 Normal
4 30850 10001 12APR10:13:02:20 399.0 正常 Normal
...
先求R的值
R也就是最近购买的时间,把时间转成时间戳即可
import time
# 转成时间戳
data['time'] = data['time'].map(lambda x:time.mktime(time.strptime(x, '%d%b%y:%H:%M:%S')))
# 分组求出最近时间,也就是时间戳最大的
group_obj = data.groupby(['cumid', 'type_label'])
R = group_obj[['time']].max()
R
输出(截取前几个):
time
cumid type_label
10001 正常 1.284699e+09
特价 1.255316e+09
赠送 1.284197e+09
退货 1.278766e+09
10002 正常 1.276953e+09
赠送 1.278129e+09
退货 1.252047e+09
...
转透视表
- 转透视表以用户id为行索引,商品类别为列索引
- 会发现有很多NaN数据,这时候要进行数据清理
# 转透视表
r_trans = pd.pivot_table(R,index='cumid',columns='type_label',values='time')
# 处理NaN值,只有这两列有空值
r_trans[['特价','退货']] = r_trans[['特价','退货']].apply(lambda x:x.replace(np.nan,min(x)),axis=0)
# 添加一列为三个值最大的也就是最近的时间,这里不查找退货的<