1. Python计算产品复购率
需求:
给出数据商品购买数据,数据格式.csv,包含:购买月份、手机号,根据该数据计算产品的复购率。
复购率算法:
- 算法一:单位时间内(按每月):R = 复购人数/总购买人数
- 算法二:单位时间内(按每月):R = 复购交易次数/总交易次数
部分数据样式如下:
2.参考代码
# coding = utf-8
import pandas as pd
import time
class RepurchaseRate(object):
"""1.普通配置电脑百万条数据运行时间在20min左右;
2.此版本版本包含 2 种计算方法;
"""
def cal_repurchase_rate(self, method):
"""复购率计算"""
if method == 1:
# 算法一:单位时间内(按每月):R = 复购人数/总购买人数
total_transactions_dict, data_dict = self.data_processing(1)
elif method == 2:
# 算法二:单位时间内:R = 复购交易次数/总交易次数
total_transactions_dict, data_dict = self.data_processing(2)
# 复购交易总数表:字典
repurchase_transactions_dict = {}
# 对应月份表
month_list = []
# 对每月总交易数进行遍历并进行比较,得出每月复购交易数
for month1 in data_dict.keys():
repurchase_transactions_list = [] # 每月复购交易数列表
# 计算每个月在所有月份的复购交易数
for month2 in data_dict.keys():
month_list.append(month2)
# 判断month2对month1是否为后一个月,如果是,则进入复购数计算
if month2 > month1:
i = 0
# 对month1来说,计算month2里有多少交易复购的
for num in data_dict[month2]:
# 该交易数据(手机号)在month1中出现,则认为是复购的,计数器+1
if num in data_dict[month1]:
i += 1
# 将month2中复购数据添加到复购交易列表
repurchase_transactions_list.append(i)
# 如果month2对month1是前一个月,则复购数计为 0,并添加到复购交易列表进行占位,方便后续计算
else:
repurchase_transactions_list.append(0)
# 将对应月份列表加入到复购交易数据中,方便后续计算或查看
repurchase_transactions_dict['month'] = month_list
# 将每月复购交易数列表加入到复购交易数总表中
repurchase_transactions_dict[month1] = repurchase_transactions_list
# 计算复购率:R
repurchase_rate_dict = {} # 复购率总表
month_list = [] # 对应月份
# 对每月总交易数进行遍历
for key1, value1 in total_transactions_dict.items():
month_list.append(key1)
repurchase_rate_list = [] # 每月复购率列表
# 对每月复购交易数进行遍历
for key2, value2 in repurchase_transactions_dict.items():
if key1 == key2:
for num in value2:
# 计算每月复购率,格式化输出,按百分比保存,保留小数点后2位
repurchase_rate = format(num/value1, '.2%')
repurchase_rate_list.append(repurchase_rate)
# 加入相对应的月份列表,方便后续计算或查看
repurchase_rate_dict['month'] = month_list
# 将每月复购率加入到复购率总表
repurchase_rate_dict[key1] = repurchase_rate_list
return repurchase_rate_dict
def data_processing(self, x):
"""数据处理:删除缺失值、对数据进行去重、按月对数据进行分组等"""
# 读取文件
raw_data = pd.read_csv('./repurchase_data')
# 判断缺失值是否存在,存在就删除该条(行)数据
i = 0
while i < raw_data.shape[0]:
if pd.isnull(raw_data['收货手机'][i]):
# 根据行索引来删除该条数据,axis=0 代表行
raw_data = raw_data.drop(i, axis=0)
i += 1
# 通过对订货年月分组得出所有月份和每月总交易数、每月购买人数
# 每月总交易数:不去重数据
total_transactions = raw_data.groupby(['订货年月']).count()
# 将Dateframe数据转化为字典
total_transactions_dict = total_transactions.to_dict()
total_transactions_dict = total_transactions_dict['收货手机']
# 每月购买人数:去重数据
total_buyers = raw_data.groupby(['订货年月']).收货手机.nunique()
# 将Dataframe数据转化为字典
total_buyers_dict = total_buyers.to_dict()
# 按月对数据进行分组,交易次数为不去重数据,购买人数为去重数据
# 将raw_data转化成字典
raw_data_dict = raw_data.to_dict()
# 这里一个手机号即代表一个交易订单,即按月筛选手机号,存入字典
data_dict = {} # 不去重数据:交易次数
uniq_data_dict = {} # 去重数据:购买人数
month_list = [x for x in total_transactions_dict.keys()]
# 按月遍历添加交易数据
for month in month_list:
num_list = [] # 不去重列表
uniq_num_list = [] # 去重列表
for key,value in raw_data_dict['订货年月'].items():
# 如果是这个月的交易数据,则加入列表
if value == month:
num_list.append(raw_data_dict['收货手机'][key]) # 不去重:交易数
if raw_data_dict['收货手机'][key] not in uniq_num_list:
uniq_num_list.append(raw_data_dict['收货手机'][key]) # 去重:购买人数
data_dict[month] = num_list
uniq_data_dict[month] = uniq_num_list
# 测试程序用
print('数据处理完成!')
if x == 1:
return total_buyers_dict, uniq_data_dict
elif x == 2:
return total_transactions_dict, data_dict
else:
print('请输入数字1或者2')
def main():
# 开始计时
time_start = time.time()
print('开始计时。。。')
repurchase_rate = RepurchaseRate()
result = repurchase_rate.cal_repurchase_rate(1)
print('计时结束!!!')
time_end = time.time()
# 运行所花的时间
time_c = time_end - time_start
print(result)
print('本次计算耗时:%d 秒' % time_c)
if __name__ == "__main__":
main()