牛客网用户练习的平均次日留存率

问题描述:

现有牛客网12月每天练习题目情况的数据集nowcoder.csv。包含如下字段(字段之间用逗号分隔):

  • user_id:用户id
  • question_id:问题编号
  • result:运行结果
  • date:练习日期

现需要查看用户在某天练习后第二天还会再来练习的留存情况,请计算用户练习的平均次日留存率。

输入描述:

数据集可以直接从当前目录下nowcoder.csv读取。

import sys

for line in sys.stdin:
    a = line.split()
    print(int(a[0]) + int(a[1]))

import pandas as pd
from datetime import timedelta
nowcoder = pd.read_csv('nowcoder.csv')
#日期
nowcoder['date']=pd.to_datetime(nowcoder['date']).dt.date

#去重
nowcoder.drop_duplicates(subset=['user_id','date'],inplace=True)

#merge实现左右连
new_nowcoder=pd.merge(nowcoder,nowcoder,on='user_id',how='inner',suffixes=['_a','_b'])
#on和how的参数都是带引号的,还可以指定相同列的下标,不指定默认是_x,_y

new_nowcoder['diff']=new_nowcoder['date_b']-new_nowcoder['date_a']

#两个时间之差数据类型就是timedelta类型
result=new_nowcoder[new_nowcoder['diff']==timedelta(days=1)]['diff'].count()/new_nowcoder[new_nowcoder['diff']==timedelta(days=0)]['diff'].count()
print(round(result,2))

### SQL 次日留存率计算方法及面试题解答 次日留存率是衡量用户在首次登录后的第二天是否继续使用产品的指标。它对于评估产品的吸引力和用户的粘性具有重要意义[^2]。以下是次日留存率的计算方法及相关SQL面试题的解答。 #### 1. 次日留存率的定义 次日留存率是指在某一天新增的用户中,有多少比例的用户在第二天再次登录系统。公式如下: \[ 次日留存率 = \frac{次日再次登录的用户数}{新增用户数} \times 100\% \] #### 2. 计算次日留存率的SQL实现 以下是一个通用的SQL实现方式,用于计算次日留存率: ```sql WITH FirstLogin AS ( -- 找出每个用户的首次登录时间 SELECT user_id, MIN(record_time) AS first_record_time FROM user_log GROUP BY user_id ), RetentionUsers AS ( -- 找出次日登录的用户 SELECT a.user_id, a.record_time FROM user_log a JOIN FirstLogin b ON a.user_id = b.user_id WHERE DATE(a.record_time) = DATE(DATE_ADD(b.first_record_time, INTERVAL 1 DAY)) ) -- 计算次日留存率 SELECT COUNT(DISTINCT RetentionUsers.user_id) AS next_day_retention_users, COUNT(DISTINCT FirstLogin.user_id) AS initial_users, ROUND(COUNT(DISTINCT RetentionUsers.user_id) / COUNT(DISTINCT FirstLogin.user_id) * 100, 2) AS next_day_retention_rate FROM FirstLogin LEFT JOIN RetentionUsers ON FirstLogin.user_id = RetentionUsers.user_id; ``` 上述代码通过两个CTE(Common Table Expressions)分别找出首次登录的用户次日再次登录的用户,然后通过连接操作计算次日留存率[^4]。 #### 3. 面试题示例 **题目:** 给定一张记录用户登录信息的表`user_log`,包含字段`user_id`(用户ID)和`record_time`(登录时间)。请编写SQL查询,计算每天新增用户次日留存率。 **解答:** ```sql WITH DailyNewUsers AS ( -- 找出每天新增的用户 SELECT user_id, record_time AS first_login_date FROM ( SELECT user_id, record_time, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY record_time) AS rn FROM user_log ) t WHERE rn = 1 ), NextDayLogins AS ( -- 找出次日登录的用户 SELECT a.user_id, a.record_time FROM user_log a JOIN DailyNewUsers b ON a.user_id = b.user_id WHERE DATE(a.record_time) = DATE(DATE_ADD(b.first_login_date, INTERVAL 1 DAY)) ) -- 计算每天新增用户次日留存率 SELECT DATE(b.first_login_date) AS login_date, COUNT(DISTINCT a.user_id) AS next_day_retention_users, COUNT(DISTINCT b.user_id) AS new_users, ROUND(COUNT(DISTINCT a.user_id) / COUNT(DISTINCT b.user_id) * 100, 2) AS next_day_retention_rate FROM NextDayLogins a RIGHT JOIN DailyNewUsers b ON a.user_id = b.user_id GROUP BY DATE(b.first_login_date); ``` 此查询首先通过窗口函数`ROW_NUMBER()`找出每天新增的用户,然后计算这些用户次日再次登录的比例[^3]。 --- ### 知识点总结 - **时间函数:** 使用`MIN()`、`DATE()`、`DATE_ADD()`等函数处理日期数据。 - **窗口函数:** 使用`ROW_NUMBER()`标记每个用户的首次登录记录。 - **连接操作:** 使用`JOIN`或`LEFT JOIN`将首次登录用户次日登录用户进行匹配。 - **聚合函数:** 使用`COUNT()`统计用户数量,并结合`ROUND()`函数计算百分比。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值