数据分析笔试练习题

题目1:数据集Retail_Data_Transactions.csv记录了客户ID,交易时间和交易金额三个字段,需求是对客户ID进行汇总统计,计算每一个客户的如下特征变量,并把结果输出为csv文件。

• Last_date: 最后一次交易时间 • Recency: 最后一次交易时间距离今天的间隔天数 • Frequnece: 累计交易次数
• Amount: 累计交易金额
• Intereval: 平均两次交易之间的间隔天数(如果客户只有一次交易字段为空值)

  1. 导入包
import pandas as pd
import numpy as np
from datetime import datetime
from tqdm import tqdm
  1. 数据预处理
  • 读取数据
  • 转换时间格式数据
# 读取数据
def read_data(path):
    data = pd.read_csv(path)
#     print(data.head)
#     print(data.shape)
    return data

数据格式:

customer_idtrans_datetran_amount
CS529511-Feb-1335
CS476815-Mar-1539
# 替换英文月份
def rep_mon(data):
    data['trans_date'] = data['trans_date'].str.replace('Jan','01')
    data['trans_date'] = data['trans_date'].str.replace('Feb','02')
    data['trans_date'] = data['trans_date'].str.replace('Mar','03')
    data['trans_date'] = data['trans_date'].str.replace('Apr','04')
    data['trans_date'] = data['trans_date'].str.replace('May','05')
    data['trans_date'] = data['trans_date'].str.replace('Jun','06')
    data['trans_date'] = data['trans_date'].str.replace('Jul','07')
    data['trans_date'] = data['trans_date'].str.replace('Aug','08')
    data['trans_date'] = data['trans_date'].str.replace('Sep','09')
    data['trans_date'] = data['trans_date'].str.replace('Oct','10')
    data['trans_date'] = data['trans_date'].str.replace('Nov','11')
    data['trans_date'] = data['trans_date'].str.replace('Dec','12')
    return data
# 转换时间格式
def tran_date(data):
    for i in tqdm(range(len(data))):
        data['trans_date'][i] = datetime.strptime(data['trans_date'][i],"%d-%m-%y")
    return data
if __name__ == '__main__':
    data = read_data(path)
    data = rep_mon(data)
    data = tran_date(data)
  1. 计算变量特征
  • Last_date: 最后一次交易时间
# 根据用户id分组获取最后交易时间
def last_date(data):
    result_date = pd.DataFrame(data.groupby('customer_id')['trans_date'].max())
    result_date.columns=['last_date']
    return result_date
result_data = last_date(data)
  • Recency: 最后一次交易时间距离今天的间隔天数
# 用今天的日期减去最后交易日期
def recency(result_data):
    today = datetime.today()
    result_data['recency'] = [0]*len(result_data)
    for i in range(len(result_data)):
        result_data['recency'][i] = (today-result_data['last_date'][i]).days
    return result_data
result_data = recency(result_data)
  • Frequnece: 累计交易次数
# 根据用户id分组统计总次数,并利用id与result表连接
def frequence(data,result):
    fre = data.groupby('customer_id').tran_amount.count()
    result_data = result.merge(fre,how='left',left_on='customer_id',right_on='customer_id')
    result_data = result_data.rename(columns={'tran_amount':'frequence'})
    return result_data
result_data = frequence(data,result_data)
  • Amount: 累计交易金额
# 根据用户id分组统计累计交易金额,并利用id与result表连接
def amount(data_,result_):
    amo = data.groupby('customer_id').tran_amount.sum()
    result_data = result_.merge(amo,how='left',left_on='customer_id',right_on='customer_id')
    result_data = result_data.rename(columns={'tran_amount':'amount'})
    return result_data
result_data = amount(data,result_data)
  • Intereval: 平均两次交易之间的间隔天数(如果客户只有一次交易字段为空值)
# 将原始数据按照用户id分组,将用户id设置为索引
# 计算每个用户两次交易之间的间隔天数,并计算平均值
def inter(data__,result__):
    data_group = data.groupby('customer_id').apply(lambda x:x[:])
    data_group = data_group.drop(axis=1,columns='customer_id')
    data_group = data_group.reset_index('customer_id')
    data_group = data_group.set_index('customer_id')
    
    intereval=dict()
    id_index = data_group.index.unique()
    for i in id_index:
        if len(data_group.loc[i])==1:
            intereval[i]=np.nan
        else:
            intereval[i] = np.mean(data_group.loc[i].sort_values('trans_date')['trans_date'].diff()).days
    intereval = pd.DataFrame(intereval,index=['intereval']).T
    result_data = result__.merge(intereval,how='left',left_on='customer_id',right_on=intereval.index)
    return result_data
result_data = inter(data,result_data)

最后输出格式:

customer_idlast_daterecencyfrequenceamountintereval
CS11122015-01-14259915101293

题目2:在题目1的输出结果基础上,构造三个新的字段,规则如下,结果输出为csv文件。

• 对Recency字段进行分段,分为5段,用1-5编号,每一段内的人数相同,分段后的新字段名Recency_bin
• 对Frequency字段进行分段,分为5段,用1-5编号,每一段内的人数相同,分段后的新字段名Frequency_bin
• 对Amount字段进行分段,按照100为间距分段,即0-100,100-200…
分段编号用1,2,3,…自然数编号,分段后的新字段名Amount_bin

  1. 导入包
import math
  1. 对Recency字段进行分段,分为5段,用1-5编号,每一段内的人数相同,分段后的新字段名Recency_bin
data['Recency_bin'] = pd.cut(data['recency'],5,labels=[1,2,3,4,5])
  1. 对Frequency字段进行分段,分为5段,用1-5编号,每一段内的人数相同,分段后的新字段名Frequency_bin
data['Frequency_bin'] = pd.cut(data['frequence'],5,labels=[1,2,3,4,5])
  1. 对Amount字段进行分段,按照100为间距分段,即0-100,100-200… 分段编号用1,2,3,…自然数编号,分段后的新字段名Amount_bin
# 获得amount列最大值,求其能被100整除的向上整数
# 利用cut分箱,划定分箱标准和label值
def amount_bin(data):
    max_amo = math.ceil(data['amount'].max()/100)*100
    cut_bin = [i for i in range(0,max_amo+100,100)]
    cut_bin[0]=-1
    label = [i for i in range(1,int(max_amo/100)+1)]
    data['Amount_bin'] =pd.cut(data['amount'],cut_bin,labels=label)
    return data
data = amount_bin(data)

最后输出格式:

customer_idlast_daterecencyfrequenceamountinterevalRecency_binFrequency_binAmount_bin
CS11122015-01-142599151012931211

题目3:在题目2的输出结果基础上,对Recency_bin和Frequency_bin进行交叉统计分析,生成如下报表:统计Rececny_bin和Frequency_bin组合对应的客户数。

question3 = pd.DataFrame(data.groupby(by=['Recency_bin','Frequency_bin']).count()['customer_id'])
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值