写过很多关于Pandas的文章,本文开展了一个简单的综合使用,主要分为:

  • 如何自行模拟数据

  • 多种数据处理方式

  • 数据统计与可视化

  • 用户RFM模型

  • 用户复购周期

构建数据

本案例中用的数据是小编自行模拟的,主要包含两个数据:订单数据和水果信息数据,并且会将两份数据合并

import pandas as pd
import numpy as np
import random
from datetime import *
import timeimport 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 gofig = 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].fruitvalue = df4[df4["year"] == year].kilogramfig.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、tangentialhole=.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的复购周期分布最为集中。

点击下方卡片进行关注,获取更多内容

点分享

点收藏

点点赞

点在看

小而全的Pandas使用案例相关推荐

  1. 小而全的Pandas数据分析案例

    公众号:尤而小屋 作者:Peter 编辑:Peter 大家好,我是Peter~ 写过很多关于Pandas的文章,本文开展了一个简单的综合使用,主要分为: 如何自行模拟数据 多种数据处理方式 数据统计与 ...

  2. python画k线图 自定周期_【量化小讲堂- Python、pandas技巧系列】极简方法将日线数据转为周线、月线或其他周期...

    引言: 本系列帖子"量化小讲堂",通过实际案例教初学者使用python.pandas进行金融数据处理,希望能对大家有帮助. 想要快速.系统的学习量化知识,可以参与我与论坛合作开设的 ...

  3. 福利继续:赠书《Spring Cloud微服务-全栈技术与案例解析》

    <Spring Cloud微服务-全栈技术与案例解析> 在互联网时代,互联网产品的最大特点就是需要快速发布新功能,支持高并发和大数据.传统的架构已经慢慢不能支撑互联网业务的发展,这时候微服 ...

  4. 《微信小程序:开发入门及案例详解》—— 3.4 小结

    本节书摘来自华章出版社<微信小程序:开发入门及案例详解>一 书中的第3章,第3.4节,作者李骏 边思,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 3.4 小 ...

  5. angularjs全栈开发知乎_1-4【微信小程序全栈开发课程】原生小程序框架介绍

    1.打开小程序目录 打开微信开发者工具,我们上一节新建的项目,我圈出来的这个地方就是小程序的目录结构(如果你那里没有显示,可以点击左上方的编辑器来显示) 2.原生小程序框架介绍 给大家画了一张图,重要 ...

  6. 活久见!月薪30k的小程序全栈开发到底有多难?

    10年前,公司的标配是门户网站,造就了一批网站工作室.随着移动互联网大潮兴起,App又成了企业标配,IOS和Android开发赚的盆满钵满.然而App导致的手机内存告急,无止尽的信息推送,让微信小程序 ...

  7. 为啥我的页面模板的from提交不了数据_4-9【微信小程序全栈开发课程】意见反馈(四)--提交反馈信息

    1.创建后端操作文件 先在后端server/controllers文件夹中创建操作文件createopinion.js,用来将从前端页面提交的数据,插入到opinions表中,创建完之后,页面目录如下 ...

  8. 上拉加载更多后台数据_6-7【微信小程序全栈开发课程】记录页面(七)--分页加载记录数据...

    现在是一次性加载所有的记录数据,数据多的时候,会加载比较慢,所以我们改成分页加载,一次最多加载15条数据 每次拉倒底部都会自动加载下一页的数据,知道所有的数据加载完成 1.添加data变量 编辑rec ...

  9. eslint不报错 vue_2-2【微信小程序全栈开发课程】index页面搭建--ESlint格式错误

    1.修改入口文件 也就是src/pages/index/main.js文件 main.js是入口文件,通过main.js来加载index.vue文件.每个页面文件夹中都要有main.js文件 //加载 ...

最新文章

  1. 解决MySql 数据库 提示:1045 access denied for user 'root'@'localhost' using password yes
  2. 学生成绩管理系统测试用例C语言,学生成绩管理系统测试用例.doc
  3. AC-DC电源模块设计原理及10个常见疑问
  4. 怎么获取服务器接口文档,服务器接口获取数据
  5. Spring Boot学习总结(19)——使用Redisson实现分布式锁
  6. iOS 修改webView字体
  7. The “data“ option should be a function that returns a per-instance value in component definitions.
  8. vs code 开发企业级python_怎样在vs code上搭建python环境?
  9. 使用Mac打开mht格式文件
  10. 无线路由器服务器关闭后 如何重新打开,无线路由器怎么重启?
  11. MAME打开ROM报错解决办法
  12. 如何用php 图片合成一张图片,PHP 文字生成图片并与两张图片合成一张图片
  13. A2SHB规格书,A2SHB如何测试好坏
  14. 《你好,数智新世界》系列访谈 对话数睿数据总裁刘超|企业级无代码赋能软件产业变革...
  15. AndroidStudio运行app,会装上多个app
  16. BERT-Whole Word Masked(WWM)
  17. 大国隐痛:做一个操作系统有多难?
  18. 构建学习tensorflow
  19. 2021中国各省区块链政策竞争力指数TOP10(3月)|链塔月榜
  20. js文件中发送ajax请求,ulr路径不起作用的解决办法

热门文章

  1. java线程太多卡顿_性能优化之卡顿延迟
  2. 使用django创建一个单表查询的图书管理系统
  3. Qt网络编程之实例一GET方式
  4. linux基础入门概念
  5. 企业级系统架构设计技术与互联网应用技术结合主题一 大规模并发性能问题探讨...
  6. Tornado 使用手册(一)---------- 简单的tornado配置
  7. 几种Lucene.Net打开IndexReader的方式
  8. ATEN—第九章OSPF多区域的配置
  9. 九个月可以做成什么事?
  10. 10个可以简化开发过程的MySQL工具