题解 | #牛客网连续练习题目3天及以上的用户#
牛客网连续练习题目3天及以上的用户
https://www.nowcoder.com/practice/4d77709a0ea2482282ee86852fe32f06
本人数据分析方向,完全按照SQL次日留存率的步骤来求解。 看到很多大佬用循环写,再次感叹,数据分析和计算机算法两种类型的思路的不同。
很多小伙伴们问rank的作用,其实就是窗口函数,只不过这里加了一层to_datetime(),便于下面时间类型的两列做差计算。
另外倒数第二句的意思就是先找到每个人的连续天数,然后在此基础上找最大值。
(之前代码有点bug,少写了一个date2(年-月-日,为了计算cha,直接用date应该也可以),现在已纠正。)
import pandas as pd from datetime import timedelta nowcoder = pd.read_csv('nowcoder.csv') # 先转时间 nowcoder['date'] = pd.to_datetime(nowcoder['date']) # 先提取年月 nowcoder['date1'] = nowcoder['date'].dt.strftime("%Y-%m") data = nowcoder[nowcoder['date1'] == '2021-12'] # 再获取年月日 data['date2'] = pd.to_datetime(data['date'].dt.date) # 根据日排序 data['rk'] = pd.to_timedelta(data.groupby(['user_id']).date2.rank(),unit='d') # 作差并获取出现次数最多的值,SQL的思路 data['cha'] = data['date2']-data['rk'] data1 = data.groupby(['user_id','cha']).count().groupby('user_id').rk.max() print(data1[data1>=3])