日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql复购率_Mysql与Pyhton实现复购率和回购率

發布時間:2024/1/8 数据库 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql复购率_Mysql与Pyhton实现复购率和回购率 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、復購率

復購率:一段時間內,購買2次及以上客戶人數,占該時間段內購買過的總人數的比重。

例如:一個月以內,購買該商品超過兩次的人有50個人,一個月內買過該商品的人有100個人,該月內復購率就是50%。復購率計算是要剔除那些沒有該買一次的客戶。

1) python實現復購率

1.建立pivot_table,index為user_id,columns為月份,value為order_dt(其他只要代表消費的字段都可以),aggfunc='count'。這里的月份是已經轉化成為月的值了,

df['month']=df.order_date.values.astype('datetime64[M]')

pivot_table可以實現兩列不重復的字段繪制成表格,可以對表中的值進行聚合操作。和excel有點像。

關于pivote_table:pivote_table

pivoted_counts=df.pivot_table(index='user_id',columns='month',

values='order_dt',aggfunc='count').fillna(0)

#columns_month=df.month.sort_values().astype('str').unique()

pivoted_counts.head()

結果.png

2、計算購買次數>=2的客戶,這里利用的是applymap,將值進行判斷轉化。

applymap函數沒有elif,所以要用兩次if else。如果是0,則是NaN,這樣在count的時候就不會計算進去了。

pivoted_counts_transf=pivoted_counts.applymap(lambda x:1 if x>1

else np.NaN if x==0

else 0)

'''這里是如果購買次數大于1,則計數1;若沒有購買則為NaN;\

購買一次,計數為0'''

pivoted_counts_transf.head()

結果2.png

3、最后進行計算。按照columns取出當月的sum,除以當月的count。

pivoted_counts_transf.sum()/pivoted_counts_transf.count()

image.png

2) mysql實現復購率

首先加一列為月度數據:

select date_format(order_dt,'%Y-%m-01')

篩選出每個月的order_dt的數量,用月份和order_id去group

select order_id,date_format(order_dt,'%Y-%m-01') ordermonth,count(order_dt) c from mmy.cd

group by order_id,ordermonth;

結果.png

這里面的所有購買都是至少一次,因為我們是從月份去選取,如果為0就不會出現這個值了,所以不需要過濾。

再通過這個子查詢,用條件if來選出符合條件的個數,如果不符合就是null,就不會記錄到count里面,同時將其除以當月的總數。這里不用where是因為where會過濾掉不符合條件的日期,這樣計算的count(c)就不是總數了。

這里cast(column as decimal(4,4))是設置數值的格式。

select ordermonth,count(if(c>1,1,null)),cast(count(if(c>1,1,null))/count(c) as decimal(4,4)) as '復購率' from (

select order_id,date_format(order_dt,'%Y-%m-01') ordermonth,count(order_id) c from mmy.cd

group by order_id,ordermonth) d

group by ordermonth

order by ordermonth;

image.png

結果如上圖所示,發現算出來和python算出來的是一致的。

二、回購率

回購率:在一定時間段內,購買的過的客戶在下一個時間段內還會購買的比例。例如:1月消費用戶1000個,他們中有300個2月依然消費,回購率是30%。與復購率的區別是兩個時間窗口,而復購率是一個時間窗口的多次購買行為。

Mysql實現:

思路:

首先建立一個臨時表,和復購率一樣,將月度數據的格式整理一下date_format,然后按照不同的客戶、不同的月度數據進行分組。

然后我們要兩次用到這張臨時表,需要內部join一次,然后利用DATE_SUB函數找到間隔為1月的數據,其實這個時候用where進行過濾表格,再用count找到每個月的符合回購行為的人數,就可以直接算出每個月的回購人數。代碼如下:

with t0 as (select order_id,date_format(order_dt,'%Y-%m-01') t from mmy.cd

group by order_id,t)

select A.t,count(A.t) as '回購人數'

from t0 A

join t0 B

on A.order_id=B.order_id

where A.t=DATE_SUB(B.t,interval 1 month)

group by A.t

order by A.t;

回購人數

如果要求回購率,直接算出來百分比的話,還是要利用if函數,不能用where過濾,因為過濾之后進行count就不能得到所有當月購物的人數總數了。

這里還是利用count(if(A.t=DATE_SUB(B.t,interval 1 month),1,null))進行條件篩選。

而被除數記得要distinct一下,因為我們join的表格是有多個相同的order_id的行,需要去重。代碼如下:

with t0 as (select order_id,date_format(order_dt,'%Y-%m-01') t from mmy.cd

group by order_id,t)

select A.t,count(if(A.t=DATE_SUB(B.t,interval 1 month),1,null)) as '重復購買的人',

count(if(A.t=DATE_SUB(B.t,interval 1 month),1,null))/count(distinct A.order_id) as '回購率'from t0 A

join t0 B

on A.order_id=B.order_id

group by A.t

order by A.t;

回購率

python實現下次補充,先把結果放在這,與mysql差不多:

python實現回購率的結果

為什么有一點區別,是因為這張表格有些事order_product不為0,但是amount為零,所以我在做python的時候是以amount金額不為零認為該用戶有沒有消費的,而不是order_dt等,所以有一點區別。

amount為0的結果.png

總結

以上是生活随笔為你收集整理的mysql复购率_Mysql与Pyhton实现复购率和回购率的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。