"""user_ud 用户ID

order_dt: 购买日期

order_products: 购买产品数

order_amount: 购买金额"""

importpandas as pdimportnumpy as npimportmatplotlib.pyplot as plt

pd.set_option('display.max_columns', None) #显示完整的列

pd.set_option('display.max_rows', None) #显示完整的行

plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签

columns= ['用户ID','购买日期','购买产品数','购买金额']

data= pd.read_table('CDNOW_master.txt',names=columns,sep='\s+') #names设置表头 \s+任意的空字符串

#查看是否存在缺失值#print(data.info())

#order_dt: 购买日期 转换成日期类型

#def time_style(x):#time = str(x)[0:4] + "-" + str(x)[4:6] + "-" + str(x)[6:8]#return time#data['购买日期'] = data['购买日期'].apply(time_style)

data['购买日期'] = pd.to_datetime(data['购买日期'],format="%Y%m%d")#print(data.head(3).dtypes)

#计算每个用户购买商品的平均数量#print(data.groupby('用户ID')['购买产品数'].mean())

#计算所每个用户购买商品的平均花费#print(data.groupby('用户ID')['购买金额'].mean())

#describe是描述统计 # 计算所有用户购买商品的平均数量#print(data.describe())

#M 对月进行统计

data['month'] = data['购买日期'].values.astype('datetime64[M]')print(data.head())#用户每月花费的总金额

use_months_by = data.groupby('month')['购买金额'].sum()#print(use_months_by)#

#plt.figure(figsize=(5,4))#plt.plot(use_months_by.index,use_months_by.values,label="用户每月花费的总金额")#plt.legend(loc=0)#plt.savefig("用户每月花费的总金额.jpg")#plt.show()

#所有用户每月的产品购买量#print(data.groupby('month')['购买产品数'].sum())

#所有用户每月的消费总次数#print(data.groupby('month')['用户ID'].count())

#统计每月的消费人数 # 同一個人可能消費多次,所以 消费人数 只能是唯一的 .nunique() 去重后余下的#print(data.groupby('month')['用户ID'].nunique())

#各个用户消费总金额和消费总次数的统计描述#print("各个用户消费总金额",data.groupby('用户ID')['购买金额'].sum())#print("各个用户消费总次数",data.groupby('用户ID')['购买产品数'].nunique())

#print(data.groupby('用户ID').sum().describe())

#各个用户消费总金额和消费总次数的散点图#plt.scatter(data.groupby('用户ID').sum()['购买产品数'],#data.groupby('用户ID').sum()['购买金额'])#plt.xlabel("购买产品数")#plt.ylabel("购买金额")#plt.show()

#各个用户消费总金额的直方分布图(消费金额在1000之内的分布)#總結:在groupby条件后直接限制条件, 限制条件后的结果取值 作图#data_f = data.groupby('用户ID').sum().query(" 购买金额 < 1000 " )['购买金额']#print(data_f)#plt.hist(data_f,bins=10) # bins柱子的个数#plt.show()

#各个用户消费总次数的直方分布图(消费次数在于100内)#by_number = data.groupby('用户ID').sum().query('购买产品数 < 100')['购买产品数']#print(by_number)#plt.hist(by_number,bins=30)#plt.show()

#消费次数在100以内的 只有8个人消费次数超过100#print((data['用户ID'].value_counts() < 100).value_counts() ) # 每个data['用户ID']出现的次数(出现次数 == 消费的次数)#True 23562#False 8

#用户第一次消费的月的分布,和人数统计 month已经转成时间数据类型#print(data.groupby('用户ID')['month'].min()) # 分组出用户ID,然后选出分组后每个用户ID最小的那个#print(data.groupby('用户ID')['month'].min().value_counts()) # 每个月份的人数统计#data.groupby('用户ID')['month'].min().value_counts().plot() # 首购分布图#plt.show()

#用户最后一次消费的时间分布,人数统计#print(data.groupby('用户ID')['month'].max())#print(data.groupby('用户ID')['month'].max().value_counts())#data.groupby('用户ID')['month'].max().value_counts().plot() # 最后一次购买的时间分布图#plt.show()

#新用户 (只购买一次)

#获取每个用户的首购 跟尾够#第一种方式(结果是错误的)因为是一次消费的用户,所有只要挑出购买产品数为1的 ) 学到的知识是 判断两数组对比方式#data_left = data.groupby("用户ID")['month'].agg(['min','max']) # 得到min max日期#print((data_left['min'] == data_left['max']).value_counts())

#print( (data.groupby("用户ID")['购买产品数'].sum() == 1).value_counts().values) # 第二种方式[X,X1]

#每个用户的总购买量 总消费金额 and 最近一次消费的表格rfm (每个用户在最近的一次消费)

rfm = data.pivot_table(index='用户ID',aggfunc={'购买产品数':'sum','购买金额':'sum','购买日期':'max',})#每个用户最近一次交易的时间间隔 (购买日期 - 购买日期的最大值) || 去掉days: / np.timedelta64(1,'D')

rfm['R'] = -(rfm['购买日期'] - rfm['购买日期'].max()) / np.timedelta64(1,'D')#修改名字

rfm.rename(columns={'购买金额':'M',"购买产品数":"F"},inplace=True)#print(rfm.head())

## 分层次

defrfm_func(x):

level= x.map(lambda x:'1' if x >= 0 else '0') #如果是负数的就是0,不是就是1

laber = level.R + level.F + level.M #拼接成 d 对应的数值 进行区分客户等级

d ={'111':'重要价值客户','011':'重要保持客户','101':'重要挽留客户','001':'重要发展客户','110':'一般价值客户','010':'一般保持客户','100':'一般挽留客户','000':'一般发展客户',

}

result=d[laber]returnresult

rfm['laber'] =rfm[['R','F','M']].apply(lambda x: x - x.mean()).apply(rfm_func,axis=1)#print(rfm)

#print(rfm.groupby('laber').count())

#

#rfm.loc[rfm.laber == '重要价值客户','color'] = 'g'#rfm.loc[~(rfm.laber == '重要价值客户'),'color'] = 'r'#rfm.plot.scatter("F",'R',c = rfm.color)#plt.show()

#统计每个用户每个月的消费次数

user_order_count_data = data.pivot_table(index='用户ID',values='购买日期',aggfunc='count',columns='month').fillna(0).head()#1 0 0 0 0 0 0#2 0 0 0 0 0 0

#统计每个用户每个月是否消费 消费记录为1 否者记录消费为0#apply 每一行的数据#applymap() 每一个数据都执行一遍

data_purchase = user_order_count_data.applymap(lambda x:1 if x >= 1 else0)#print(data_purchase)

#活跃用户判断

col= ['1997-01-01', '1997-02-01', '1997-03-01', '1997-04-01','1997-05-01', '1997-06-01', '1997-07-01', '1997-08-01','1997-09-01', '1997-10-01', '1997-11-01', '1997-12-01','1998-01-01', '1998-02-01', '1998-03-01', '1998-04-01','1998-05-01', '1998-06-01']defactive_status(data):

status=[]for i in range(18):#若本月没有消费

if data[i] ==0:if len(status) >0:if status[i - 1] == 'unreg': #unreg未注册用户

status.append('unreg')else:

status.append('unactive') #不活跃用户

else:

status.append('unreg')#若本月消费

else:if len(status) ==0:

status.append('new')else:if status[i - 1] == 'unactive':

status.append('return') #回流用户

elif status[i - 1] == 'unreg':

status.append('new') #新用户

else:

status.append('active') #活跃用户

return pd.Series(status, index=col)

p_status= data_purchase.apply(active_status,axis=1) #将每一行数据执行函数一次#print(p_status)

print(p_status.replace('unreg',np.NAN).apply(lambda x:pd.value_counts(x)).T)

python计算消费总额_【数据分析案例】用户消费行为相关推荐

  1. python计算消费总额_Python在校园数据分析中的应用——以一卡通消费为例

    Python 在校园数据分析中的应用--以一卡通消费为例 王全胜 [期刊名称] <电脑知识与技术> [年 ( 卷 ), 期] 2017(013)009 [摘要] 随着大数据时代的到来 ,P ...

  2. 数据分析项目:用户消费行为分析

    用户消费行为分析实战 利用pandas进行数据处理,分析用户消费行为. 数据来源CDNow网站的用户购买明细,一共有用户ID,购买日期,购买数量,购买金额四个字段. 1.导入常用需要的库 # 导入常用 ...

  3. 利用python进行数据分析——第十四章_数据分析案例

    文章目录 本章中的数据文件可从下面的github仓库中下载 利用python进行数据分析(第二版) 一.从Bitli获取 1.USA.gov数据 1.1纯python时区计数 1.2使用pandas进 ...

  4. python计算线段长度_实现显示线段长度

    此课程与<清华编程高手.尹成.带你实战python入门>大体相同,只需购买其中的一门课程. 本课程由清华大学尹成老师录制,课程的特色在于讲解原理的同时引入了每个程序员都热衷的黑客技术.py ...

  5. 用Python计算MovieLens 100k数据集中男性女性用户评分的标准差

    这是<用Python玩转数据>4.2的编程练习. 要求: 计算MovieLens 100k数据集中男性女性用户评分的标准差并输出. 数据集下载 其中u.data 表示100k条评分记录,每 ...

  6. python计算现场得分_浅谈用 Python 计算文本 BLEU 分数

    浅谈用 Python 计算文本 BLEU 分数 BLEU, 全称为 Bilingual Evaluation Understudy(双语评估替换), 是一个比较候选文本翻译与其他一个或多个参考翻译的评 ...

  7. python计算圆柱体积_如何用PYTHON计算体积公式

    用PYTHON计算体积公式 工具/原料 PYTHON 方法/步骤 1 打开PYTHON,新建一个空白的PY文档. 2 import math dir() 首先我们要引入模块,然后查看目录是否已经引入成 ...

  8. python计算召回率_分词结果准确率、召回率计算-python

    原博文 2016-06-19 13:01 − 使用python计算crf根据模型的分词结果的准确率,召回率和F值 测试文件output.txt,第一列是字,第二列是人工标注的分词结果,第三列是根据模型 ...

  9. python计算连续复利_复利的Python程序

    python计算连续复利 Given principle amount, rate and time and we have to find the compound interest in Pyth ...

最新文章

  1. linux at shell,shell 用at命令来计划执行作业
  2. python工程师-我是如何转行成为了一名Python工程师
  3. 手动抽油机_察雅县抽油机钢丝绳橡胶皮带生产厂家
  4. 手机存储不足怎么办?用好这份清理指南你的手机还能再战三年
  5. linux 查看磁盘分区,文件系统,使用情况的命令和相关工具介绍,新型linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍.doc...
  6. python3.7.1安装
  7. 限时免费《敏捷个人-认识自我,管理自我 v0.6.pdf》
  8. 银行核心系统是什么?
  9. php 字典树,关于PHP字典树的定义与实现方法
  10. Bulletproof零知识证明
  11. C语言 模拟按键操作
  12. 第五天学习--存储结构与磁盘划分
  13. Java并发编程 - 第三章 Java内存模型
  14. MySQL无效的月份_ORACLE 插入时间时显示'无效的月份'的问题
  15. SMPL模型及源码解读
  16. 深度:养老康复器械龙头即将上市,美的、新松进军养老康复机器人,老龄化加速千亿康复市场到来!
  17. 搭建日志服务器 rsyslog
  18. spss基本总结——因子分析
  19. MacBook Pro 16寸 i9-9880H对比 桌面级CPU i7-8700
  20. 【初入前端】第一课 课前预习

热门文章

  1. 【Linux】13.linux内核切换
  2. EasyJWeb-Velocity脚本简明教程
  3. Java程序员从笨鸟到菜鸟之(八十一)细谈Spring(十)深入源码分析Spring之HibernateTemplate 和HibernateDaoSupport
  4. 从零开始学习jQuery (九) jQuery工具函数
  5. 如何写一个完善的c++异常处理类
  6. 深度学习-LeCun、Bengio和Hinton的联合综述-Deep Learning一篇nature综述论文
  7. Hadoop Distributed File System 简介
  8. Coursera课程Python for everyone:Quiz: eXtensible Markup Language
  9. IIS7 授权配置错误
  10. 使用BootStrap制作用户登录UI