import pandas as pd
from datetime import timedelta

nowcoder = pd.read_csv("nowcoder.csv")
# 总数
total_id = nowcoder["user_id"].count()
b = pd.merge(nowcoder, nowcoder, on="user_id")
# merge之后的列名:user_id,question_id_x,result_x,date_x,question_id_y,result_y,date_y
# 是自动区分xy的
b["date_x"] = pd.to_datetime(b.date_x).dt.date
# to_datetime默认有时间精度,.dt.date去掉分钟,得到日期列表2021-12-1
b["date_y"] = pd.to_datetime(b.date_y).dt.date
b["differ"] = b.date_y - b.date_x
sum_diff = b[b.differ == "1 days"].differ.count()
res = round(sum_diff / total_id, 2)
print(res)

利用笛卡尔积获取用户留存行为记录。把所有用户的每次次日留存行为的总和记作总留存数(为分子),总用户行为数量记作分母,不考虑重复情况。

但是这道题如果连续登录7天就会有6次留存行为,这个算法有点怪