sql 计算差值_Python Pandas教程 如何计算用户留存率?

1.前言

Hi大家好,因为工作的原因最近更新有些慢,在此借这篇文章也给大家梳理一下后续的一些更新规划,整体来说主要规划了以下三个方向:

  • 工具侧:主要是Python、SQL的一些技巧,在工作中有时候会感觉自己对这方面的使用还是有一些粗糙,效率还不够高,最近也在进行一些自我复盘,所以说这里的话会结合我在工作中遇到的一些问题去给大家分享一些技巧。

  • 知识侧:主要是统计学、机器学习相关

  • 分析侧:A/B Test、一些分析方法等等

以上主要的规划三个方向(三个大坑,以后慢慢填坑..),除了这些之外,大家有感兴趣的话题,欢迎在后台留言。


2. 留存率计算

下面我们进入正题,首先看一下数据的格式,数据一共3列,字段分别是用户编码,激活日期和活跃日期,目标是要求根据这3个字段计算出每个用户的1-7日留存的明细情况和最终1-7日的留存率。

data = pd.read_excel('data留存率数据.xlsx')data.head(5)

cf3551eb5e90ae0c4bc6266bbb07c1f2.png

要计算1-7日的留存率,首先我们需要知道用户在激活后的第n天是否活跃,所以对于上面的数据,我们可以计算用户活跃日期和激活日期的天数的差值来判断用户活跃日期是激活后的第几天。

#因为之前的日期是string格式,转换成日期格式def time_function(x):    return datetime.strptime(str(x),'%Y-%m-%d')data['活跃日期'] =data['活跃日期'].apply(time_function)data['激活日期'] =data['激活日期'].apply(time_function)data['第n天活跃'] = data['活跃日期']-data['激活日期']data['第n天活跃'] =data['第n天活跃'].apply(lambda x:x.days)data.head(10)

0aea047a79889d983eea88449c3d5558.png

通过上面的计算,我们就知道了用户活跃的日期是在激活后的第几天,下面就是计算整体的留存率了,怎么计算呢?有些同学可能会想到可以直接对第n天活跃做groupby求当天活跃的用户数是多少来计算,这个思路是可以的,不过会有局限性并且不能得到每个用户的明细留存情况。

那么该怎么算呢?在学会pivot函数之前,我的思路是这样的:

方法一:Left Join循环

筛选出第0天活跃的用户(相当于是筛选全量用户),以这部分用户作为底表,用循环去left join 第1、2、3....n天活跃的用户,如果能匹配到,说明这个用户在当天有活跃,代码如下:

ret_fm = data[data.第n天活跃==0]for i in range(1,8):    ret_fz = data[data.第n天活跃==i][['用户编码']]    ret_fz[str(i)] = 1    ret_fm = pd.merge(ret_fm,ret_fz,on='用户编码',how='left')ret_fm = ret_fm.fillna(0) #没有匹配到的就是空值,用0填补代表没有活跃ret_fm.head(10)

最终结果如下所示,可以得到一张每个用户在1-7天是否活跃的明细表

54b62fff7234d383ff8c8ecac9209759.png

通过这张明细表,就可以轻松的计算出1-7日的留存率

f=ret_fm.iloc[:,1:].mean().reset_index()f

812adaccc67e1fe3cd760437d3c86543.png

方法二:Pivot函数

上面这种方法虽然可行,但比较麻烦,并且需要通过循环去解决,数据量大时效率会比较低,下面我们来看一种更简单的办法-pivot函数,这个函数的效果大家可以看一下下面这张图,应该比较清楚了,如果不清楚的话,我们来看一下下面的应用。

c989a4c745b444e8bbe98df94654862f.png

首先再来回顾一下数据的格式,在这里我们给数据添加新的一列ret,赋值为1

data['ret']=1data.head(10)

12ee77910ff2b366be6fc0f65394354e.png

之后我们来应用一下pivot函数,函数中有3个参数

  • index:指定一列作为新的index(每一行的唯一标识),因为我们想要的是一张用户维度的留存表,所以每一行应该代表一个用户,这里的index我们选“用户编码”

  • column:指定一列并将里面的取值展开作为不同的列,选择“第n天活跃”

  • value:数据表里面的取值选哪一列,这里我们选“ret“

df_new = data.pivot(index = '用户编码',columns='第n天活跃', values='ret')df_new

结果如下图所示,可以看到,我们通过一个函数就达到了上面依靠循环才能达到的结果!

8210757cbba9c746942f621a68592c70.png

#数据中有缺失值,代表用户在当天没有活跃,用0填充df_new=df_new.fillna(0) df_new

f51dad4e0e269ee755789813e4657235.png

#计算均值df_new.mean().reset_index()

99f7c6add18b7fb4a05115b3da1574f9.png

这样我们通过一个pivot函数就完成了之前要靠循环才能完成的步骤,可以说是非常方便了,pandas中还有很多很好用的函数,以后再和大家分享。

ps:文档中用到的数据和代码,大家可以后台回复 “pivot案例”下载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值