来源:尤而小屋
写过很多关于Pandas的文章,本文开展了一个简单的综合使用,主要分为:
如何自行模拟数据
多种数据处理方式
数据统计与可视化
用户RFM模型
用户复购周期
![c1f304bc454b939a13dc0a38bdf97854.png](https://i-blog.csdnimg.cn/blog_migrate/eec5a8150071494b0046d5b8e10b25d0.png)
构建数据
本案例中用的数据是小编自行模拟的,主要包含两个数据:订单数据和水果信息数据,并且会将两份数据合并
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、时间字段
![063a19596af209037de8f4cf1357ebfd.png](https://i-blog.csdnimg.cn/blog_migrate/36628890a462cc68bb0e5a0f3898ec43.png)
2、水果和用户
![482c351f017561e6c912812a161214e2.png](https://i-blog.csdnimg.cn/blog_migrate/ce02432b32a9a52566b057bdcb135daf.png)
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
![55dd18692d0b3d03a4bbf8b6dd5b9dc5.png](https://i-blog.csdnimg.cn/blog_migrate/c0160176cc2c4ebe2a8e1feff252b1c7.png)
4、生成水果的信息数据
infortmation = pd.DataFrame({
"fruit":fruits,
"price":[3.8, 8.9, 12.8, 6.8, 15.8, 4.9, 5.8, 7],
"region":["华南","华北","西北","华中","西北","华南","华北","华中"]
})
infortmation
![b87686da8c79caec45a9b3289770ad2e.png](https://i-blog.csdnimg.cn/blog_migrate/e025b712b2b7ac38f92a148fde6d7e5c.png)
5、数据合并
将订单信息和水果信息直接合并成一个完整的DataFrame,这个df就是接下来处理的数据
![754ca464c5aa99b14a87d0aed3ef11e7.png](https://i-blog.csdnimg.cn/blog_migrate/574e56d4d9442e79166086c2f9abb228.png)
6、生成新的字段:订单金额
![399edfd7e158bc1d01f7f6398c95e4cf.png](https://i-blog.csdnimg.cn/blog_migrate/4db58489755e308c2c90e566e01c0154.png)
到这里你可以学到:
如何生成时间相关的数据
如何从列表(可迭代对象)中生成随机数据
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
![df0a204a651b55d71ee6a6dbedad7b45.png](https://i-blog.csdnimg.cn/blog_migrate/b7bdb2592a5bfd086aeef01bb836e197.png)
2、查看字段类型:
![914d3f31444a65ec3929eab812a9f760.png](https://i-blog.csdnimg.cn/blog_migrate/68b99165740bfe1891c050069bd810b3.png)
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()
![37656eac591adbe0a3e914203e17f000.png](https://i-blog.csdnimg.cn/blog_migrate/16b7e8705bb523cbae6ae796c4c87d6a.png)
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()
![09038b9bc8465172cc315fa7eaf80b93.png](https://i-blog.csdnimg.cn/blog_migrate/515ccfa771088b6f6909c1d70f4de89b.png)
年度销量、销售额和平均销售额
![92bb419be48c76864e0e64317aee7fc6.png](https://i-blog.csdnimg.cn/blog_migrate/8390391b9a0856b3b0560b88d941fbf7.png)
分析维度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()
![2df96a32f583fa5400f647458b057364.png](https://i-blog.csdnimg.cn/blog_migrate/005706e01c41911924dbb9a61d8e2825.png)
各水果年度销售金额对比
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()
![8eeb4d5ae0bb95febcb6cf6dde27978b.png](https://i-blog.csdnimg.cn/blog_migrate/8c6b38abbf1621d6fd625281f6e7560a.png)
![f86fcc5aafaeb1af843ad5276237ea92.png](https://i-blog.csdnimg.cn/blog_migrate/897e8c237169f9c388cee96a63288fce.png)
![2bd11e0b21728fba284db2af65ae5bd6.png](https://i-blog.csdnimg.cn/blog_migrate/453cb4cacfe9df2a93f97db366251bcd.png)
商品月度销量变化
![0b02c5d0e435ed95d0170eb36e24892a.png](https://i-blog.csdnimg.cn/blog_migrate/a003cafc78a4ec0594707caebe2e11b0.png)
fig = px.bar(df5,x="year_month",y="amount",color="fruit")
fig.update_layout(xaxis_tickangle=45) # 倾斜角度
fig.show()
![dd2badf366e4f64586c75d5fd5db0c29.png](https://i-blog.csdnimg.cn/blog_migrate/1acb4c1ed24ac18d77cc95783660c07d.png)
折线图展示的变化:
![6008da3e1d570b001f39420b6f91ec7b.png](https://i-blog.csdnimg.cn/blog_migrate/40f222c647deeb00192b4eebaeb173b0.png)
分析维度3:地区
不同地区的销量
![47e39a118627fdf5a77c2a1f466c63cc.png](https://i-blog.csdnimg.cn/blog_migrate/610aaa6fb6234d97fb5ffe7b60630044.png)
![3597007f223666bad573f6ba64ab22ae.png](https://i-blog.csdnimg.cn/blog_migrate/254febba76cef325a8f88f2a8a18dabb.png)
不同地区年度平均销售额
df7 = df.groupby(["year","region"])["amount"].mean().reset_index()
![98156528c00b2124ae87b431b4be9a09.png](https://i-blog.csdnimg.cn/blog_migrate/536fc75280a6ae4432c8ef9baeb88e7c.png)
分析维度4:用户
用户订单量、金额对比
df8 = df.groupby(["name"]).agg({"time":"count","amount":"sum"}).reset_index().rename(columns={"time":"order_number"})
df8.style.background_gradient(cmap="Spectral_r")
![eab13247fd2dbe7a604589b37ce8629a.png](https://i-blog.csdnimg.cn/blog_migrate/ea3bccff94df8e9b30501a0bbc11bbbf.png)
用户水果喜好
根据每个用户对每种水果的订单量和订单金额来分析:
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")
![14eb4186a9f3ba2b7f6441bc479ed28f.png](https://i-blog.csdnimg.cn/blog_migrate/a3b4e2f4e52005b6efe7470e5536b887.png)
px.bar(df10,
x="fruit",
y="amount",
# color="number",
facet_col="name"
)
![0272a140c9fd21bcf63165abb1c15b8c.png](https://i-blog.csdnimg.cn/blog_migrate/f3b86c3c9cfcd31d96b8a561edf8b495.png)
用户分层—RFM模型
RFM模型是衡量客户价值和创利能力的重要工具和手段。
通过这个模型能够反映一个用户的交期交易行为、交易的总体频率和总交易金额3项指标,通过3个指标来描述该客户的价值状况;同时依据这三项指标将客户划分为8类客户价值:
Recency(R)是客户最近一次购买日期距离现在的天数,这个指标与分析的时间点有关,因此是变动的。理论上客户越是在近期发生购买行为,就越有可能复购
Frequency(F)指的是客户发生购买行为的次数--最常购买的消费者,忠诚度也就较高。增加顾客购买的次数意味着能占有更多的时长份额。
Monetary value(M)是客户购买花费的总金额。
下面通过Pandas的多个方法来分别求解这个3个指标,首先是F和M:每位客户的订单次数和总金额
![b3abec3fd4a3426680e820b590055a4e.png](https://i-blog.csdnimg.cn/blog_migrate/8c46f66f801dd2a42c644021b347b166.png)
如何求解R指标呢?
1、先求解每个订单和当前时间的差值
![5cdb831258ef51b419e25b37acb79dff.png](https://i-blog.csdnimg.cn/blog_migrate/ceb1dff26e9d7e668092cc2cd66f593c.png)
2、根据每个用户的这个差值R来进行升序排列,排在第一位的那条数据就是他最近购买记录:以xiaoming用户为例,最近一次是12月15号,和当前时间的差值是25天
![6ea07472ecc37457d5fcaed24de7f27e.png](https://i-blog.csdnimg.cn/blog_migrate/5bc7b89a95acd0ae47f2d3a3b4959b17.png)
3、根据用户去重,保留第一条数据,这样便得到每个用户的R指标:
![10195a5099d229ddc85d0d4a4d01413c.png](https://i-blog.csdnimg.cn/blog_migrate/fa39725e9e06e460d776424c89badaac.png)
4、数据合并得到3个指标:
![ff833246bdaed6faa5dd9dbc1b51e2c8.png](https://i-blog.csdnimg.cn/blog_migrate/43c5eddcfcd5309635637fcea57b000f.png)
![c4da15f0d789aa4754a195b4e8e1b2f9.png](https://i-blog.csdnimg.cn/blog_migrate/fdbc3adfc1639c48e1d91c26d24b132d.png)
当数据量足够大,用户足够多的时候,就可以只用RFM模型来将用户分成8个类型
用户复购周期分析
复购周期是用户每两次购买之间的时间间隔:以xiaoming用户为例,前2次的复购周期分别是4天和22天
![4afaad1a831376a4615a626d48b7b2fd.png](https://i-blog.csdnimg.cn/blog_migrate/a1f4aa3f2c857881c1a2f169a9950c68.png)
下面是求解每个用户复购周期的过程:
1、每个用户的购买时间升序
![b717f803d410fe358da137859b01f319.png](https://i-blog.csdnimg.cn/blog_migrate/513edba2092735e8a7a3458b734aa4e7.png)
2、将时间移动一个单位:
![5b5fe846d44af868df259b241408f58b.png](https://i-blog.csdnimg.cn/blog_migrate/7744e48d700d95418739dcd61055fe04.png)
3、合并后的差值:
出现空值是每个用户的第一条记录之前是没有数据,后面直接删除了空值部分
![855c2072558b07205c910a705b20cb8e.png](https://i-blog.csdnimg.cn/blog_migrate/113d72f0f6085935156ced9c0c39d3e6.png)
![c41f2f7f0f5a972c14cab8e50a482d7a.png](https://i-blog.csdnimg.cn/blog_migrate/d842e3c77ec1efbaff34df8d6b0e6631.png)
直接取出天数的数值部分:
![0c23dd41e303dedbc2fc5eef31b50196.png](https://i-blog.csdnimg.cn/blog_migrate/3d8d2b9701d9c8306d97bf36e8eecc98.png)
5、复购周期对比
px.bar(df16,
x="day",
y="name",
orientation="h",
color="day",
color_continuous_scale="spectral" # purples
)
![b1c14e869c1f52554501b66facf444ae.png](https://i-blog.csdnimg.cn/blog_migrate/e888c46a2abfa363cd35e4d7393d606a.png)
上图中矩形越窄表示间隔越小;每个用户整个复购周期由整个矩形长度决定。查看每个用户的整体复购周期之和与平均复购周期:
![1bbab9a217bb7bbacbe5ec7493ac4aea.png](https://i-blog.csdnimg.cn/blog_migrate/c3f46a96f703b0bb11a004dfab485ec1.png)
得到一个结论:Michk和Mike两个用户整体的复购周期是比较长的,长期来看是忠诚的用户;而且从平均复购周期来看,相对较低,说明在短时间内复购活跃。
从下面的小提琴中同样可以观察到,Michk和Mike的复购周期分布最为集中。
![9b4976439fec487e2683d988276955ae.png](https://i-blog.csdnimg.cn/blog_migrate/accf7304eef791de2560588f0ff1b4d5.png)
-------- End --------
![08fcbc4c06ab2a8d40b04d5b13c50b90.png](https://i-blog.csdnimg.cn/blog_migrate/8b33d7991f40e76dde49f5dfc02afc0d.png)
精选资料
回复关键词,获取对应的资料:
关键词 | 资料名称 |
---|---|
600 | 《Python知识手册》 |
md | 《Markdown速查表》 |
time | 《Python时间使用指南》 |
str | 《Python字符串速查表》 |
pip | 《Python:Pip速查表》 |
style | 《Pandas表格样式配置指南》 |
mat | 《Matplotlib入门100个案例》 |
px | 《Plotly Express可视化指南》 |
精选内容
数据科学: VS Code 中 Python配置使用指南 | 财经工具 Tushare | Matplotlib 最有价值的 50 个图表
书籍阅读: 如何阅读一本书 | 巴菲特之道 | 价值 | 原则 | 投资最重要的事 | 戴维斯王朝 | 客户的游艇在哪里 | 刻意练习 | 林肯传 | 金字塔原理
投资小结: 2021Q4 | 2021Q3 | 2021Q2 | 2021Q1 | 2020Q4
精选视频
可视化: Plotly Express
财经: Plotly在投资领域的应用 | 绘制K线图表
排序算法: 汇总 | 冒泡排序 | 选择排序 | 快速排序 | 归并排序 | 堆排序 | 插入排序 | 希尔排序 | 计数排序 | 桶排序 | 基数排序
![5d9d09a89afaeeb19d8ae7810c10e2dd.png](https://i-blog.csdnimg.cn/blog_migrate/9f35e1128b8b0f5be46b61ff4c873432.png)