【Python】电商用户复购数据实战:图解Pandas的移动函数shift
公眾號:尤而小屋
作者:Peter
編輯:Peter
本文主要介紹的是pandas中的一個移動函數:shift。最后結合一個具體的電商領域中用戶的復購案例來說明如何使用shift函數。
這個案例綜合性很強,除了需要掌握shift函數,你還會復習到以下pandas中的多個函數使用技巧,建議認真閱讀、理解并收藏,歡迎點贊呀~
分組統計:groupby
過濾篩選數據:query
排序函數:sort_values
合并函數:concat
字段重命名:rename
缺失值刪除:dropna
寶藏函數:apply
Pandas連載
Pandas文章連載系列已經到了第20篇,主要分為3類:
基礎部分:1-16篇,主要是介紹Pandas中基礎和常用操作,比如數據創建、檢索查詢、排名排序、缺失值/重復值處理等
進階部分:第17篇開始講解Pandas中的高級操作方法;后續主要是以時間序列相關為主
對比SQL,學習Pandas:將SQL和Pandas的操作對比起來進行學習
14種方式,34個案例:對比SQL,學習Pandas操作
參數說明
DataFrame.shift(periods=1,?freq=None,?axis=0,?fill_value=<no_default>)periods:表示移動的幅度,可正可負;默認值是1,1就表示移動一次。注意這里移動的都是數據,而索引是不移動的,移動之后沒有對應值的,就賦值為NaN。
freq:DateOffset, timedelta, or time rule string,可選參數,默認值為None,只適用于時間序列。如果這個參數存在,那么會按照參數值移動時間索引,而數據值沒有發生變化。
axis:表示按照哪個軸移動。axis=0表示index,橫軸;axis=1表示columns,縱軸
fill_value:表示當我們數據發生了移動之后,產生的缺失值用什么數據填充。如果是數值型的缺失值,用np.nan;如果是時間類型的缺失值,用NaT(not a time)
模擬數據
模擬了兩份數據,其中一份和時間相關。
import?pandas?as?pd import?numpy?as?np另一份是和時間相關的:
參數periods
表示每次移動的幅度
可以看到默認情況下,shift函數是在行方向上移動一個單位
參數axis
用來表示在哪個方向上進行移動,上面的例子默認是在axis=0,或者表示成:axis="index"
如果我們想在列方向上移動,可以使用axis=1或者axis="columns"
同時移動的幅度是可正可負的:
參數fill_value
移動之后缺失值的填充數據
參數freq
表示移動的頻率,專門用于時間序列的移動中
頻率
時間序列變化頻率有間隔相同的,也有不同的。許多字符串別名被賦予有用的普通時間序列頻率。我們將這些別名稱為偏移別名。上面的shift函數中使用的就是這些別名,具體如下表所示:
| B | 工作日頻率 |
| C | 自定義工作日頻率 |
| D | 日歷日頻率 |
| W | 每周頻率 |
| M | 每月最后一個日歷日 |
| SM | 每半個月最后一個日歷日(15日和月末) |
| BM | 每月最后一個工作日 |
| CBM | 自定義每月最后一個工作日 |
| MS | 每月第一個日歷日 |
| SMS | 每半月第一個日歷日(第1和第15) |
| BMS | 每月第一個工作日 |
| CBMS | 自定義每月第一個工作日 |
| Q | 每季度最后一個月的最后一個日歷日 |
| BQ | 每季度最后一個月的最后一個工作日 |
| QS | 每季度最后一個月的第一個日歷日 |
| BQS | 每季度最后一個月的第一個工作日 |
| A, Y | 每年的最后一個日歷日 |
| BA, BY | 每年的最后一個工作日 |
| AS, YS | 每年的第一個日歷日 |
| BAS, BYS | 每年的第一個工作日 |
| BH | 工作日按“時”計算頻率 |
| H | 每小時頻率 |
| T, min | 每分鐘頻率 |
| S | 每秒頻率 |
| L, ms | 毫秒頻率 |
| U, us | 微秒頻率 |
| N | 納秒頻率 |
電商用戶復購數據實戰
什么是用戶的復購周期
在這里我們結合一個電商銷售數據來感受下shift函數的使用。我們有一份客戶和購買時間的數據,現在想統計每位用戶在今年的平均復購周期和全部用戶的平均復購周期。
每位用戶的平均復購周期:每兩個復購時間之間的天數之和 / 用戶總復購次數
全部用戶的平均復購周期:全部用戶的平均復購周期之和 / 總復購用戶數
通過一個例子來解釋用戶的平均復購周期,假設某位用戶購買情況如下:
張三用戶的復購間隔分別為:6(1號和7號的間隔),3(7號和10號),10,8;也就是相鄰兩次購買時間之間的間隔。
那么張三的平均復購周期:(6+3+8+10)/ 4 = 6.75
模擬數據
模擬了一份電商數據,多位用戶購買了一次或者多次:
下面通過Pandas來求解每位用戶的平均復購周期和全部的平均復購周期
確定哪些用戶存在復購行為
復購的用戶指的是:在統計時間范圍內,存在多次購買的用戶。所以我們首先找到那些至少購買兩次的用戶
統計發現:小王同學只購買了一次,沒有復購行為
篩選出復購用戶:
從原始數據中提取出復購用戶的數據
根據每位用戶的購買時間來升序排列
#?姓名的升序或者降序不重要,重要的是第二個字段-時間,一定要是升序 df3?=?df2.sort_values(["姓名","時間"],ascending=[True,True]).reset_index(drop=True)?df3根據每位復購用戶的數據移動一個單位
在行方向上移動一個單位:
df4?=?df3.groupby("姓名").shift(1).rename(columns={"時間":"時間1"})??#?改下名字,避免重復 df4拼接數據
將排序后的df3和我們根據df3平移后的數據在列方向上拼接起來:
字段時間1相當于每個購買時間的前一個購買時間點
df5?=?pd.concat([df3,df4],axis=1) df5.head(10)??#?查看前10行上面的數據框中:
時間: 可以看做是我們的本次購買時間
時間1:上次購買時間。每個用戶的第一次購買時間是不存在上次購買時間,所以顯示為NaT
將NaT數據刪除
使用dropna函數來刪除缺失值的數據
求出復購時間間隔
兩個字段:時間和時間1的差值,就是每位用戶的復購時間間隔,可能存在多個
查看數據的字段類型,我們發現間隔這個字段是一個timedelta64[ns]的類型
我們直接通過apply函數來獲取timedelta64[ns]的days屬性,也就是對一個的天數
統計每個復購用戶的復購總天數和總次數
df7?=?df6.groupby("姓名").agg({"天":"sum","間隔":"count"}).reset_index().rename(columns={"間隔":"復購次數"}) df7求出每位用戶平均復購周期
全部用戶的平均復購周期
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯黃海廣老師《機器學習課程》課件合集 本站qq群851320808,加入微信群請掃碼:總結
以上是生活随笔為你收集整理的【Python】电商用户复购数据实战:图解Pandas的移动函数shift的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaScript 的 Date 方法
- 下一篇: 【NLP】一行Python代码中自动化文