五个Pandas 实战案例带你分析操作数据
作者:Python学习与数据挖掘 发布时间:2021-04-02 18:46:05
大家好,之前分享过很多关于 Pandas 的文章,今天我给大家分享5个小而美的 Pandas 实战案例。
内容主要分为:
如何自行模拟数据
多种数据处理方式
数据统计与可视化
用户RFM模型
用户复购周期
构建数据
本案例中用的数据是小编自行模拟的,主要包含两个数据:订单数据和水果信息数据,并且会将两份数据合并
import pandas as pd
import numpy as np
import random
from datetime import *
import time
import plotly.express as px
import plotly.graph_objects as go
import plotly as py
# 绘制子图
from plotly.subplots import make_subplots
1、时间字段
2、水果和用户
3、生成订单数据
order = pd.DataFrame({
"time":time_range, # 下单时间
"fruit":fruit_list, # 水果名称
"name":name_list, # 顾客名
# 购买量
"kilogram":np.random.choice(list(range(50,100)), size=len(time_range),replace=True)
})
order
4、生成水果的信息数据
infortmation = pd.DataFrame({
"fruit":fruits,
"price":[3.8, 8.9, 12.8, 6.8, 15.8, 4.9, 5.8, 7],
"region":["华南","华北","西北","华中","西北","华南","华北","华中"]
})
infortmation
5、数据合并
将订单信息和水果信息直接合并成一个完整的DataFrame,这个df就是接下来处理的数据
6、生成新的字段:订单金额
到这里你可以学到:
如何生成时间相关的数据
如何从列表(可迭代对象)中生成随机数据
Pandas的DataFrame自行创建,包含生成新字段
Pandas数据合并
分析维度1:时间
2019-2021年每月销量走势
1、先把年份和月份提取出来:
df["year"] = df["time"].dt.year
df["month"] = df["time"].dt.month
# 同时提取年份和月份
df["year_month"] = df["time"].dt.strftime('%Y%m')
df
2、查看字段类型:
3、分年月统计并展示:
# 分年月统计销量
df1 = df.groupby(["year_month"])["kilogram"].sum().reset_index()
fig = px.bar(df1,x="year_month",y="kilogram",color="kilogram")
fig.update_layout(xaxis_tickangle=45) # 倾斜角度
fig.show()
2019-2021销售额走势
df2 = df.groupby(["year_month"])["amount"].sum().reset_index()
df2["amount"] = df2["amount"].apply(lambda x:round(x,2))
fig = go.Figure()
fig.add_trace(go.Scatter( #
x=df2["year_month"],
y=df2["amount"],
mode='lines+markers', # mode模式选择
name='lines')) # 名字
fig.update_layout(xaxis_tickangle=45) # 倾斜角度
fig.show()
年度销量、销售额和平均销售额
分析维度2:商品
水果年度销量占比
df4 = df.groupby(["year","fruit"]).agg({"kilogram":"sum","amount":"sum"}).reset_index()
df4["year"] = df4["year"].astype(str)
df4["amount"] = df4["amount"].apply(lambda x: round(x,2))
from plotly.subplots import make_subplots
import plotly.graph_objects as go
fig = make_subplots(
rows=1,
cols=3,
subplot_titles=["2019年","2020年","2021年"],
specs=[[{"type": "domain"}, # 通过type来指定类型
{"type": "domain"},
{"type": "domain"}]]
)
years = df4["year"].unique().tolist()
for i, year in enumerate(years):
name = df4[df4["year"] == year].fruit
value = df4[df4["year"] == year].kilogram
fig.add_traces(go.Pie(labels=name,
values=value
),
rows=1,cols=i+1
)
fig.update_traces(
textposition='inside', # 'inside','outside','auto','none'
textinfo='percent+label',
insidetextorientation='radial', # horizontal、radial、tangential
hole=.3,
hoverinfo="label+percent+name"
)
fig.show()
各水果年度销售金额对比
years = df4["year"].unique().tolist()
for _, year in enumerate(years):
df5 = df4[df4["year"]==year]
fig = go.Figure(go.Treemap(
labels = df5["fruit"].tolist(),
parents = df5["year"].tolist(),
values = df5["amount"].tolist(),
textinfo = "label+value+percent root"
))
fig.show()
商品月度销量变化
fig = px.bar(df5,x="year_month",y="amount",color="fruit")
fig.update_layout(xaxis_tickangle=45) # 倾斜角度
fig.show()
折线图展示的变化:
分析维度3:地区
不同地区的销量
不同地区年度平均销售额
df7 = df.groupby(["year","region"])["amount"].mean().reset_index()
分析维度4:用户
用户订单量、金额对比
df8 = df.groupby(["name"]).agg({"time":"count","amount":"sum"}).reset_index().rename(columns={"time":"order_number"})
df8.style.background_gradient(cmap="Spectral_r")
用户水果喜好
根据每个用户对每种水果的订单量和订单金额来分析:
df9 = df.groupby(["name","fruit"]).agg({"time":"count","amount":"sum"}).reset_index().rename(columns={"time":"number"})
df10 = df9.sort_values(["name","number","amount"],ascending=[True,False,False])
df10.style.bar(subset=["number","amount"],color="#a97fcf")
px.bar(df10,
x="fruit",
y="amount",
# color="number",
facet_col="name"
)
用户分层—RFM模型
RFM模型是衡量客户价值和创利能力的重要工具和手段。
通过这个模型能够反映一个用户的交期交易行为、交易的总体频率和总交易金额3项指标,通过3个指标来描述该客户的价值状况;同时依据这三项指标将客户划分为8类客户价值:
Recency(R)是客户最近一次购买日期距离现在的天数,这个指标与分析的时间点有关,因此是变动的。理论上客户越是在近期发生购买行为,就越有可能复购
Frequency(F)指的是客户发生购买行为的次数–最常购买的消费者,忠诚度也就较高。增加顾客购买的次数意味着能占有更多的时长份额。
Monetary value(M)是客户购买花费的总金额。
下面通过Pandas的多个方法来分别求解这个3个指标,首先是F和M:每位客户的订单次数和总金额
如何求解R指标呢?
1、先求解每个订单和当前时间的差值
2、根据每个用户的这个差值R来进行升序排列,排在第一位的那条数据就是他最近购买记录:以xiaoming用户为例,最近一次是12月15号,和当前时间的差值是25天
3、根据用户去重,保留第一条数据,这样便得到每个用户的R指标:
4、数据合并得到3个指标:
当数据量足够大,用户足够多的时候,就可以只用RFM模型来将用户分成8个类型
用户复购周期分析
复购周期是用户每两次购买之间的时间间隔:以xiaoming用户为例,前2次的复购周期分别是4天和22天
下面是求解每个用户复购周期的过程:
1、每个用户的购买时间升序
2、将时间移动一个单位:
3、合并后的差值:
出现空值是每个用户的第一条记录之前是没有数据,后面直接删除了空值部分
直接取出天数的数值部分:
5、复购周期对比
px.bar(df16,
x="day",
y="name",
orientation="h",
color="day",
color_continuous_scale="spectral" # purples
)
上图中矩形越窄表示间隔越小;每个用户整个复购周期由整个矩形长度决定。查看每个用户的整体复购周期之和与平均复购周期:
得到一个结论:Michk和Mike两个用户整体的复购周期是比较长的,长期来看是忠诚的用户;而且从平均复购周期来看,相对较低,说明在短时间内复购活跃。
从下面的小提琴中同样可以观察到,Michk和Mike的复购周期分布最为集中。
来源:https://blog.csdn.net/weixin_38037405/article/details/122649061


猜你喜欢
- 一、概述PIL:Python Imaging Library,已经是Python平台事实上的图像处理标准库了。PIL功能非常强大,但API却
- 本文实例讲述了Python实现PS滤镜中马赛克效果。分享给大家供大家参考,具体如下:这里利用 Python 实现PS 滤镜中的马赛克效果,具
- 1、准备html文件首先我们需要准备一个鼠标滑动的html文件,用来演示鼠标滑动的效果,注意需要将我们的html文件放在自己的服务器上,这样
- 最近面试遇到了一道面试题,顿时有点迷糊,只说出了思路,后来百度了一下,整理了一下思路,于是记录下来,方便以后学习。(面试题请参见附件) 相关
- JS提供两个截取字符串的方法,分别是:slice()和substring()slice和substring都可以接受一个或两个参数,第1个参
- 由于工作中涉及到生日编辑资料编辑,然后自己改了一下代码:<html><head> <meta charset=
- 引言vcf文件的全称是variant call file,即突变识别文件,它是基因组工作流程中产生的一种文件,保存的是基因组上的突变信息。通
- 最近写了一个软件屡屡打包不能正常运行,而直接在cmd命令行窗口运行却都能正常输出,没有任何报错,一开始怀疑程序里面sys.args[1]使用
- python的dict用起来很方便,可以自定义key值,并通过下标访问,示例如下:>>> d = {'key1
- 本博客演示使用OpenCV和PIL读取和显示图像的差异。首先来看一下原始的bgr图像 src.jpg1. 使用cv2读取src.jpg并转为
- 深底色风格的页面设计很受欢迎,它可以创造出别致优雅、极富创造力的效果。深底色设计适用于许多网站类型,但并非所有。这种风格应该在恰当的条件下使
- 本文实例讲述了Python多继承原理与用法。分享给大家供大家参考,具体如下:python中使用多继承,会涉及到查找顺序(MRO)、重复调用(
- 使用场景当需要进行vuex进行数据状态管理的时候,会使用到mapGetters,mapState,还有自身的计算属性的时候,这个时候就会用到
- 简述和GNU一样,YAML是一个递归着说“不”的名字。不同的是,GNU对UNIX说不,YAML说不的对象是XML。YAML不是XML。为什么
- windows删除jupyter notebook 没办法的办法pip uninstall jupyter -ypip uninstall
- 1、编写TCP服务器程序。2、获取浏览器发送的http请求消息数据。3、读取固定的页面数据,将页面数据组装成HTTP响应消息数据并发送给浏览
- 本文实例讲述了MySQL 事务概念与用法。分享给大家供大家参考,具体如下:事务的概念MySQL事务是一个或者多个的数据库操作,要么全部执行成
- 1. 前言相信参与使用Oracle数据库进行项目开发、运维的同学常常被Oracle JDBC驱动的Maven依赖折磨。现在这一情况在今年二月
- 前言:在使用pycharm学习python的时候,经常需要第三方库,没有第三方库程序就会报错,pycharm也会提醒你要安装所需要的库,安装
- 在本文中,小编将与大家重点探讨SQL执行进展优化的方法。聚集索引扫描SELECT * FROM C_SY_Ownedstorm 聚集索引扫描