五個(gè)Pandas?實(shí)戰(zhàn)案例帶你分析操作數(shù)據(jù)
大家好,之前分享過(guò)很多關(guān)于 Pandas 的文章,今天我給大家分享5個(gè)小而美的 Pandas 實(shí)戰(zhàn)案例。
內(nèi)容主要分為:
- 如何自行模擬數(shù)據(jù)
- 多種數(shù)據(jù)處理方式
- 數(shù)據(jù)統(tǒng)計(jì)與可視化
- 用戶RFM模型
- 用戶復(fù)購(gòu)周期
構(gòu)建數(shù)據(jù)
本案例中用的數(shù)據(jù)是小編自行模擬的,主要包含兩個(gè)數(shù)據(jù):訂單數(shù)據(jù)和水果信息數(shù)據(jù),并且會(huì)將兩份數(shù)據(jù)合并
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、時(shí)間字段

2、水果和用戶

3、生成訂單數(shù)據(jù)
order = pd.DataFrame({
"time":time_range, # 下單時(shí)間
"fruit":fruit_list, # 水果名稱
"name":name_list, # 顧客名
# 購(gòu)買量
"kilogram":np.random.choice(list(range(50,100)), size=len(time_range),replace=True)
})
order

4、生成水果的信息數(shù)據(jù)
infortmation = pd.DataFrame({
"fruit":fruits,
"price":[3.8, 8.9, 12.8, 6.8, 15.8, 4.9, 5.8, 7],
"region":["華南","華北","西北","華中","西北","華南","華北","華中"]
})
infortmation

5、數(shù)據(jù)合并
將訂單信息和水果信息直接合并成一個(gè)完整的DataFrame,這個(gè)df就是接下來(lái)處理的數(shù)據(jù)

6、生成新的字段:訂單金額

到這里你可以學(xué)到:
- 如何生成時(shí)間相關(guān)的數(shù)據(jù)
- 如何從列表(可迭代對(duì)象)中生成隨機(jī)數(shù)據(jù)
- Pandas的DataFrame自行創(chuàng)建,包含生成新字段
- Pandas數(shù)據(jù)合并
分析維度1:時(shí)間
2019-2021年每月銷量走勢(shì)
1、先把年份和月份提取出來(lái):
df["year"] = df["time"].dt.year
df["month"] = df["time"].dt.month
# 同時(shí)提取年份和月份
df["year_month"] = df["time"].dt.strftime('%Y%m')
df

2、查看字段類型:

3、分年月統(tǒng)計(jì)并展示:
# 分年月統(tǒng)計(jì)銷量 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銷售額走勢(shì)
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"}, # 通過(guò)type來(lái)指定類型
{"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()

各水果年度銷售金額對(duì)比
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:地區(qū)
不同地區(qū)的銷量


不同地區(qū)年度平均銷售額
df7 = df.groupby(["year","region"])["amount"].mean().reset_index()

分析維度4:用戶
用戶訂單量、金額對(duì)比
df8 = df.groupby(["name"]).agg({"time":"count","amount":"sum"}).reset_index().rename(columns={"time":"order_number"})
df8.style.background_gradient(cmap="Spectral_r")
用戶水果喜好
根據(jù)每個(gè)用戶對(duì)每種水果的訂單量和訂單金額來(lái)分析:
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模型是衡量客戶價(jià)值和創(chuàng)利能力的重要工具和手段。
通過(guò)這個(gè)模型能夠反映一個(gè)用戶的交期交易行為、交易的總體頻率和總交易金額3項(xiàng)指標(biāo),通過(guò)3個(gè)指標(biāo)來(lái)描述該客戶的價(jià)值狀況;同時(shí)依據(jù)這三項(xiàng)指標(biāo)將客戶劃分為8類客戶價(jià)值:
- Recency(R)是客戶最近一次購(gòu)買日期距離現(xiàn)在的天數(shù),這個(gè)指標(biāo)與分析的時(shí)間點(diǎn)有關(guān),因此是變動(dòng)的。理論上客戶越是在近期發(fā)生購(gòu)買行為,就越有可能復(fù)購(gòu)
- Frequency(F)指的是客戶發(fā)生購(gòu)買行為的次數(shù)–最常購(gòu)買的消費(fèi)者,忠誠(chéng)度也就較高。增加顧客購(gòu)買的次數(shù)意味著能占有更多的時(shí)長(zhǎng)份額。
- Monetary value(M)是客戶購(gòu)買花費(fèi)的總金額。

下面通過(guò)Pandas的多個(gè)方法來(lái)分別求解這個(gè)3個(gè)指標(biāo),首先是F和M:每位客戶的訂單次數(shù)和總金額

如何求解R指標(biāo)呢?
1、先求解每個(gè)訂單和當(dāng)前時(shí)間的差值

2、根據(jù)每個(gè)用戶的這個(gè)差值R來(lái)進(jìn)行升序排列,排在第一位的那條數(shù)據(jù)就是他最近購(gòu)買記錄:以xiaoming用戶為例,最近一次是12月15號(hào),和當(dāng)前時(shí)間的差值是25天

3、根據(jù)用戶去重,保留第一條數(shù)據(jù),這樣便得到每個(gè)用戶的R指標(biāo):

4、數(shù)據(jù)合并得到3個(gè)指標(biāo):


當(dāng)數(shù)據(jù)量足夠大,用戶足夠多的時(shí)候,就可以只用RFM模型來(lái)將用戶分成8個(gè)類型
用戶復(fù)購(gòu)周期分析
復(fù)購(gòu)周期是用戶每?jī)纱钨?gòu)買之間的時(shí)間間隔:以xiaoming用戶為例,前2次的復(fù)購(gòu)周期分別是4天和22天

下面是求解每個(gè)用戶復(fù)購(gòu)周期的過(guò)程:
1、每個(gè)用戶的購(gòu)買時(shí)間升序

2、將時(shí)間移動(dòng)一個(gè)單位:

3、合并后的差值:
出現(xiàn)空值是每個(gè)用戶的第一條記錄之前是沒(méi)有數(shù)據(jù),后面直接刪除了空值部分


直接取出天數(shù)的數(shù)值部分:

5、復(fù)購(gòu)周期對(duì)比
px.bar(df16,
x="day",
y="name",
orientation="h",
color="day",
color_continuous_scale="spectral" # purples
)

上圖中矩形越窄表示間隔越小;每個(gè)用戶整個(gè)復(fù)購(gòu)周期由整個(gè)矩形長(zhǎng)度決定。查看每個(gè)用戶的整體復(fù)購(gòu)周期之和與平均復(fù)購(gòu)周期:

得到一個(gè)結(jié)論:Michk和Mike兩個(gè)用戶整體的復(fù)購(gòu)周期是比較長(zhǎng)的,長(zhǎng)期來(lái)看是忠誠(chéng)的用戶;而且從平均復(fù)購(gòu)周期來(lái)看,相對(duì)較低,說(shuō)明在短時(shí)間內(nèi)復(fù)購(gòu)活躍。
從下面的小提琴中同樣可以觀察到,Michk和Mike的復(fù)購(gòu)周期分布最為集中。

到此這篇關(guān)于五個(gè)Pandas 實(shí)戰(zhàn)案例帶你分析操作數(shù)據(jù)的文章就介紹到這了,更多相關(guān)Pandas 分析數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python數(shù)據(jù)分析?Pandas?Series對(duì)象操作
- Python數(shù)據(jù)分析之?Pandas?Dataframe修改和刪除及查詢操作
- Python數(shù)據(jù)分析之?Pandas?Dataframe合并和去重操作
- Python數(shù)據(jù)分析23種Pandas核心操作方法總結(jié)
- Python數(shù)據(jù)分析Pandas?Dataframe排序操作
- Python數(shù)據(jù)分析之pandas比較操作
- Python數(shù)據(jù)分析庫(kù)pandas基本操作方法
- Pandas數(shù)據(jù)操作及數(shù)據(jù)分析常用技術(shù)介紹
相關(guān)文章
Python編程實(shí)現(xiàn)控制cmd命令行顯示顏色的方法示例
這篇文章主要介紹了Python編程實(shí)現(xiàn)控制cmd命令行顯示顏色的方法,結(jié)合實(shí)例形式分析了Python針對(duì)命令行字符串顯示顏色屬性相關(guān)操作技巧,需要的朋友可以參考下2017-08-08
python編程webpy框架模板之def with學(xué)習(xí)
這篇文章主要為大家介紹了python編程web.py框架模板之def with的學(xué)習(xí)有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11
PyTorch加載數(shù)據(jù)集梯度下降優(yōu)化
這篇文章主要介紹了PyTorch加載數(shù)據(jù)集梯度下降優(yōu)化,使用DataLoader方法,并繼承DataSet抽象類,可實(shí)現(xiàn)對(duì)數(shù)據(jù)集進(jìn)行mini_batch梯度下降優(yōu)化,需要的小伙伴可以參考一下2022-03-03
詳解Python的Django框架中的模版相關(guān)知識(shí)
這篇文章主要介紹了Python的Django框架中的模版相關(guān)知識(shí),模版的存在大大簡(jiǎn)化了創(chuàng)作頁(yè)面時(shí)HTML的相關(guān)工作,需要的朋友可以參考下2015-07-07
Python的for和break循環(huán)結(jié)構(gòu)中使用else語(yǔ)句的技巧
平時(shí)我們把在if結(jié)構(gòu)中使用else語(yǔ)句當(dāng)作理所當(dāng)然,然而,Python強(qiáng)大的語(yǔ)法糖可以讓else語(yǔ)句在for和while循環(huán)中使用!下面我們就通過(guò)例子來(lái)看一下Python的for和break循環(huán)結(jié)構(gòu)中使用else語(yǔ)句的技巧2016-05-05
完美解決python3.7 pip升級(jí) 拒絕訪問(wèn)問(wèn)題
這篇文章主要介紹了python3.7 pip升級(jí) 拒絕訪問(wèn) 解決方案,文中給大家提到了python中for循環(huán)問(wèn)題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-07-07
python操作數(shù)據(jù)庫(kù)獲取結(jié)果之fetchone和fetchall的區(qū)別說(shuō)明
這篇文章主要介紹了python操作數(shù)據(jù)庫(kù)獲取結(jié)果之fetchone和fetchall的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04

