如何用Python复现R语言实现的月度客户留存率(CRR)计算方案
Python复现R语言月度客户留存率(CRR)计算方案
前置依赖
实现基于pandas库,未安装可执行pip install pandas完成安装。
完整实现代码
导入依赖
import pandas as pd
构造示例数据(和原方案样本一致)
year_mon = ["2018 Nov", "2018 Nov", "2018 Nov", "2018 Nov", "2018 Nov", "2018 Dec", "2018 Dec", "2018 Dec", "2019 Jan", "2019 Jan", "2019 Feb", "2019 Feb", "2019 Feb"] customer_id = [1, 2, 3, 4, 5, 2, 3, 4, 3, 4, 1, 2, 3] dat = pd.DataFrame({"customer_id": customer_id, "year_mon": year_mon})
生成中间计算表
# 转换年月为当月1号的日期格式 dat["Date"] = pd.to_datetime(dat["year_mon"] + " 01", format="%Y %b %d") # 丢弃冗余字段、按日期排序 dat2 = dat.drop("year_mon", axis=1).sort_values("Date").reset_index(drop=True) # 按客户ID分组计算标记字段 # stayed:用户是否为上月留存用户 dat2["stayed"] = dat2.groupby("customer_id")["Date"].transform( lambda x: [False] + list(x.dt.to_period("M").diff().dropna() == pd.DateOffset(months=1)) ) # notnew:用户是否不是首次消费 dat2["notnew"] = dat2.groupby("customer_id")["Date"].cumcount() != 0
计算月度CRR结果
crr_result = dat2.groupby("Date").agg( n_customers=("customer_id", "count"), n_stayed=("stayed", "sum"), n_new=("notnew", lambda x: sum(~x)), n_returned=("notnew", "sum") ).reset_index() # 计算上月用户数和CRR值 crr_result["prev_n_customer"] = crr_result["n_customers"].shift(1) crr_result["CRR"] = 100 * crr_result["n_stayed"] / crr_result["prev_n_customer"]
结果说明
输出crr_result即可得到和原R方案完全一致的计算结果,首月无上月用户数据,CRR为空符合业务逻辑。
内容的提问来源于stack exchange,提问作者pdw5
相关产品推荐
相关产品推荐

