import pandas as pd
import numpy as np
from matplotlib import pyplot as plt """
第一部分:数据类型处理
数据加载
字段含义:
user_id:用户ID
order_dt:购买日期
order_product:购买产品的数量
order_amount:购买金额
观察数据
查看数据的数据类型
数据中是否存储在缺失值
将order_dt转换成时间类型
查看数据的统计描述
计算所有用户购买商品的平均数量
计算所有用户购买商品的平均花费在源数据中添加一列表示月份:astype(datetime64[M])
"""
# 加载数据,定义字段含义
df = pd.read_csv("./CDNOW_master.txt", header=None, sep="\s+",
names=["user_id", "order_dt", "order_product", "order_amount"])
# 将order_dt转换成时间类型,格式化时间
df["order_dt"] = pd.to_datetime(df["order_dt"], format="%Y%m%d")
# 添加month列
df["month"] = df["order_dt"].values.astype(r"datetime64[M]") """
题外
将Datetime类型中的月份提取出来
df["month"] = df["month"].astype("str")
months = df["month"].str.split("-")
print(months.loc[1][1])
for i in range(len(months)):
months.loc[i] = months.loc[i][1]
df["month"] = months
"""
"""
第二部分:按月数据分析
用户每月花费的总金额
绘制曲线图展示
所有用户每月的产品购买量
所有用户每月的消费总次数
统计每月的消费人数
"""
# 用户每月花费的总金额,并绘制折线图
total = df.groupby(by="month")["order_amount"].sum()
# plt.plot(total) # 所有用户每月的产品购买量
scale = df.groupby(by="month")["order_product"].sum()
# plt.plot(scale) # 所有用户每月的消费总次数
count = df.groupby(by="month")["order_amount"].count()
print((count)) # 统计每月的消费人数()
headcount = df.groupby(by="month")["user_id"].nunique()
print(headcount) """
第三部分: 用户个体消费数据分析
用户消费总金额和消费总次数的统计描述
用户消费金额和消费次数的散点图
各个用户消费总金额的直方分布图(消费金额在1000之内的分布)
各个用户消费的总数量的直方分布图(消费商品的数量在100次之内的分布)
"""
# 用户消费总金额
print(df.groupby(by="user_id")["order_amount"].sum())
# 用户消费总次数
print(df.groupby(by="user_id").count()["order_amount"])
# 用户消费金额和消费次数的散点图
# 用户消费金额
user_amount_sum = df.groupby(by="user_id")["order_amount"].sum()
# 用户消费次数
user_product_sum = df.groupby(by="user_id")["order_product"].sum()
# 绘图
plt.figure(figsize=(20, 8), dpi=80)
# plt.scatter(user_product_sum, user_amount_sum) # 各个用户消费总金额的直方分布图(消费金额在1000之内的分布)
user_order_10000 = df.groupby(by="user_id").sum().query(
"order_amount < 1000")["order_amount"]
# plt.hist(user_order_10000) # 各个用户消费的总数量的直方分布图(消费商品的数量在100次之内的分布)
user_product_100 = df.groupby(by="user_id").sum().query(
"order_product < 100")["order_product"]
# plt.hist(user_product_100) """
第四部分: 用户消费行为分析
用户第一次消费的月份分布,和人数统计
绘制线形图
用户最后一次消费的时间分布,和人数统计
绘制线形图
新老客户的占比
消费一次为新用户
消费多次为老用户
分析出每一个用户的第一个消费和最后一次消费的时间
agg(['func1func2]):对分组后的结果进行指定聚合
分析出新老客户的消费比例
用户分层
分析得出每个用户的总购买量和总消费金额and最近一次消费的时间的表格rfm
RFM模型设计
R表示客户最近一次交易时间的间隔
/np.timedelta64(1,"D"):去除days。
F表示客户购买商品的总数量,F值越大,表示客户交易越频繁,反之则表示客户交易不够活跃。
M表示客户交易的金额。M值越大,表示客户价值越高,反之则表示客户价值越低。
将R,F,M作用到rfm表中
根据价值分层,将用户分为:
"重要价值客户"
"重要保持客户"
"重要挽留客户"
"重要发展客户"
"一般价值客户"
"一般保持客户"
"一般挽留客户"
"一般发展客户"
使用已有的分层模型rfm_func
""" # 用户第一次消费的月份统计,和人数统计,绘制折线图
# first_con = df.groupby(by="user_id")["month"].min().value_counts().plot() # 用户最后一次消费的月份统计和人数统计,绘制折线图
# last_con = df.groupby(by="user_id")["month"].max().value_counts().plot() # 新老用户占比
# 消费一次新用户,消费多次老用户
# 如何获知用户是否为第一次消费? 可以根据用户的消费时间进行判定?
# 如果用户的第一次消费时间和最后一次消费时间一样,则该用户只消费了一次为新用户,否则为老用户
new_old_user_df = df.groupby(by="user_id")["order_dt"].agg(["min", "max"])
# True为新用户,False为老用户
new_old = (new_old_user_df["min"] == new_old_user_df["max"]).value_counts() # 分析得出每个用户的总购买量和总消费金额and最近一次消费的时间的表格rfm 用透视表
rfm = df.pivot_table(index="user_id", aggfunc={
"order_product": "sum", "order_amount": "sum", "order_dt": "max"}) # R表示用户最近一次交易时间的间隔
max_dt = df["order_dt"].max() # 今天的日期
# 每个用户最后于一次交易的时间
rfm["R"] = (max_dt - df.groupby(by="user_id")
["order_dt"].max()) / np.timedelta64(1, "D")
# 删除消费时间字段
rfm.drop(labels="order_dt", axis=1, inplace=True)
# 重命名字段名
rfm.columns = ["M", "F", "R"] # RFM模型 def rfm_func(x):
level = x.map(lambda x: "1" if x >= 0 else "0")
label = level.R + level.F + level.M
d = {
"111": "重要价值客户",
"011": "重要保持客户",
"101": "重要挽留客户",
"001": "重要发展客户",
"110": "一般价值客户",
"010": "一般保持客户",
"100": "一般挽留客户",
"000": "一般发展客户"
}
result = d[label]
return result # 将rfm_func计算的结果返回给新建label列 (lambda x: x - x.mean()).rfm_func
rfm["label"] = rfm.apply(lambda x: x - x.mean()).apply(rfm_func, axis=1) """
第五部分: 用户的生命周期
将用户划分为活跃用户和其他用户
统计每个用户每个月的消费次数
统计每个用户每个月是否消费,消费记录为1否则记录为0
知识点: DataFrame的apply和applymap的区别
applymap:返回df
将函数做用于DataFrame中的所有元素(elements)
apply:返回Series
apply()将一个函数作用于DataFrame中的每个行或者列
将用户按照每一个月份分成:
unreg:观望用户(前两月没买,第三个月才第一次买,则用户前两个月为观望用户)。
unactive:首月购买后,后序月份没有购买则在没有购买的月份中该用户的为非活用户。
new:当前月就进行首次购买的用户在当前月为新用户
active:连续月份购买的用户在这些月中为活跃用户
return:购买之后间隔n月再次购买的第一个月份为该月份的回头客
"""
# 统计每个用户每个月的消费次数
user_month_count_df = df.pivot_table(
index="user_id", values="order_dt", aggfunc="count", columns="month").fillna(value=0)
# 统计每个用户每个月是否消费,消费记录为1否则记录为0
df_purchase = user_month_count_df.applymap(lambda x: 1 if x >= 1 else 0) # 将df_purchase中的原始数据0和1修改为new,unactive...返回新的df叫df_purchase_new
# 用户生命周期模型,固定算法 def active_status(data):
status = []
for i in range(18):
# 若本月没有消费
if data[i] == 0:
if len(status) > 0:
if status[i-1] == "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] == "ureg":
status.append("new")
else:
status.append("active")
return status pivoted_status = df_purchase.apply(active_status, axis=1) # 将pivoted_status的values转成list,再将list转成DataFrame
# 将df_purchase的index作为df_pruchase_new的index,columns相同
df_pruchase_new = pd.DataFrame(
data=pivoted_status.values.tolist(), index=df_purchase.index, columns=df_purchase.columns) # 将每月不同活跃用户进行计数
purchase_status_ct = df_pruchase_new.apply(
lambda x: pd.value_counts(x), axis=0).fillna(value=0) # 转置
t_purchase_status_ct = purchase_status_ct.T
print(t_purchase_status_ct.head())

pandas 用户数据分析的更多相关文章

  1. 万字长文,Python数据分析实战,使用Pandas进行数据分析

    文章目录 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人,我给大家 ...

  2. python requests抓取NBA球员数据,pandas进行数据分析,echarts进行可视化 (前言)

    python requests抓取NBA球员数据,pandas进行数据分析,echarts进行可视化 (前言) 感觉要总结总结了,希望这次能写个系列文章分享分享心得,和大神们交流交流,提升提升. 因为 ...

  3. 基于 Python 和 Pandas 的数据分析(4) --- 建立数据集

    这一节我想对使用 Python 和 Pandas 的数据分析做一些扩展. 假设我们是亿万富翁, 我们会想要多元化地进行投资, 比如股票, 分红, 金融市场等, 那么现在我们要聚焦房地产市场, 做一些这 ...

  4. 基于 Python 和 Pandas 的数据分析(2) --- Pandas 基础

    在这个用 Python 和 Pandas 实现数据分析的教程中, 我们将明确一些 Pandas 基础知识. 加载到 Pandas Dataframe 的数据形式可以很多, 但是通常需要能形成行和列的数 ...

  5. 基于 Python 和 Pandas 的数据分析(1)

    基于 Python 和 Pandas 的数据分析(1) Pandas 是 Python 的一个模块(module), 我们将用 Python 完成接下来的数据分析的学习. Pandas 模块是一个高性 ...

  6. Python 数据分析:让你像写 Sql 语句一样,使用 Pandas 做数据分析

    Python 数据分析:让你像写 Sql 语句一样,使用 Pandas 做数据分析 一.加载数据 import pandas as pd import numpy as np url = ('http ...

  7. 手把手教你快速使用数据可视化BI软件创建互联网用户数据分析大屏

    灯果数据可视化BI软件是新一代人工智能数据可视化大屏软件,内置丰富的大屏模板,可视化编辑操作,无需任何经验就可以创建属于你自己的大屏.大家可以在他们的官网下载软件.   本文以互联网用户数据分析大屏为 ...

  8. python 抓取金融数据,pandas进行数据分析并可视化系列 (一)

    终于盼来了不是前言部分的前言,相当于杂谈,算得上闲扯,我觉得很多东西都是在闲扯中感悟的,比如需求这东西,一个人只有跟自己沟通好了,总结出某些东西了,才能更好的和别人去聊,去说. 今天这篇写的是明白需求 ...

  9. 基于 Python 和 Pandas 的数据分析(6) --- Joining and Merging

    这一节我们将看一下如何通过 join 和 merge 来合并 dataframe. import pandas as pd df1 = pd.DataFrame({'HPI':[80,85,88,85 ...

  10. 基于 Python 和 Pandas 的数据分析(3) --- 输入/输出 基础

    这一节, 我们要讨论 Pandas 的输入与输出, 并且应用在现实的实际例子中. 为了得到大量的数据, 向大家推荐一个网站 Quandl. Quandl 有很多免费和付费的资源. 这个网站最大的优势在 ...

随机推荐

  1. SV OOP-2

    静态变量 继承性(Inheritance) 抽象类和虚方法virtual methods 多态(Ploymorphism) 通过基类的变量可以使用子类的对象 基类中定义的virtual functio ...

  2. 【FreeRTOS】任务调度

    启动调度器接口,主要是创建空闲任务和定时器任务以及执行特定架构的启动调度器接口 // FreeRTOS\Source\tasks.c void vTaskStartScheduler( void ) ...

  3. JMS微服务开发示例(九)相同的微服务,按用户所在城市来分配微服务器

    虽然,默认情况下,多个相同的微服务,网关是自动根据微服务的压力情况,把用户请求分配到压力较轻的微服务器上. 但是,在某些业务情景下,我们可能希望人为去控制微服务的请求分配. 举个例子,我在北京.上海. ...

  4. mongo-基本操作

    mogo基本操作 mongo对命令大小写敏感,SQL对大小写不敏感 存放 json数据,一条json数据是一个文档 数据库 查看数据库 show databases 切换数据库 use db db 不 ...

  5. Chrome显示和更改显示网页字符集的方法

    Chrome显示和更改显示网页字符集的方法 背景 前段时间学习和总结了unicode和utf8的一些知识. 当时想到应该学习和整理一下网站网页的编码格式字符集相关的内容 想着既然给自己立了flag, ...

  6. [转帖]【jmeter】BeanShell用法详细汇总

    一.什么是Bean Shell BeanShell是用Java写成的,一个小型的.免费的.可以下载的.嵌入式的Java源代码解释器,具有对象脚本语言特性,非常精简的解释器jar文件大小为175k. B ...

  7. [转帖]Kafka 性能优化与问题深究

    Kafka 性能优化与问题深究 一.Kafka深入探究 1.1 kafka整体介绍 1. 1.1 Kafka 如何做到高吞吐.低延迟的呢? Kafka是一个分布式高吞吐量的消息系统,这里提下 Kafk ...

  8. [转帖]kill 参数表

    https://www.cnblogs.com/alix-1988/p/14331898.html kill命令格式:kill -Signal pidpid是进程号,可以用 ps 命令查出 signa ...

  9. [转帖]Linux如何查看网关地址

      转至:https://baijiahao.baidu.com/s?id=1733537078943023051&wfr=spider&for=pc 服务器之间的通信是通过ip地址来 ...

  10. 最小化安装的CentOS7 上面安装Oracle12C的简单过程

    首先声明自己对静默安装不熟,也害怕初问题,所以不使用静默安装的方式. 因为是最小化安装,所以必须安装GUI界面才可以,以下是过程(早上回忆的,全文字,无截图) 1. 安装GUI界面 yum group ...