需要先安装pandas,我安装的是2.0+的版本
pip install pandas
1、文件读取,
我这里有两个文件,一个文件时用户第一次消费时间,另外一个文件时用户登录应用的时间
这边需求是,需要统计每天第一次消费的用户在未来n天登录应用的的留存数据,就是每一天对第一次消费的用户进行跟踪30天,并且生成统计图,我使用的代码示例只是一个月的
代码:
import pandas as pd
login_df = pd.read_excel("登陆时间.xlsx")
register_df=pd.read_excel("第一次消费时间.xlsx",usecols=['userId','createTime','packageName'])
# 时间格式化,并且设置时间格式
login_df["OnlineDate"] = pd.to_datetime(login_df["OnlineDate"]).apply(lambda x: x.strftime("%Y-%m-%d"))
register_df["createTime"] = pd.to_datetime(register_df["createTime"]).apply(lambda x: x.strftime("%Y-%m-%d"))
# 将登录表根据登录日期进行去重,防止同一天登录多次
register_df.drop_duplicates(inplace=True)
# 获取第一次消费时间大于5月1号的
register_df = register_df[register_df["createTime"] > "2023-05-01"]
login_df = login_df[login_df["OnlineDate"] > "2023-05-01"]
print(login_df)
print(register_df)
运行截图:OnlineDate是在线日期,createTime:第一次消费时间
2、将两张表合并
# 合并表,根据用户id
merge_df = pd.merge(login_df,register_df,on="userId",how="inner")
merge_df["createTime"] = pd.to_datetime(merge_df["createTime"],format="%Y-%m-%d")
merge_df["OnlineDate"] = pd.to_datetime(merge_df["OnlineDate"],format="%Y-%m-%d")
# 计算是第几天登录
merge_df["OnlineDay"] = (merge_df["OnlineDate"] - merge_df["createTime"]).dt.days
# 将packageName设置为int64
merge_df["packageName"] = merge_df["packageName"].astype("int64")
# 获取天数大于0的,跟踪的数据是第一次消费后,可以有一些用户是以前使用过现在才消费的
merge_df = merge_df[merge_df["OnlineDay"] >= 0]
print(merge_df,merge_df.info())
运行截图:
我这里将数据处理成pyecharts中热力图需要的数据,然后进行显示:
# y轴是createTime,x轴是创建时间后第1,2,3,5,7,15,30天在线,值在在线数
from datetime import date,datetime
import copy
y_data = [date(year=2023,month=5,day=i).strftime("%Y-%m-%d") for i in range(1,31)]
x_data = [0,1,2,3,5,7,15,30]
# 计算每一天新增加的用户在未来每一天在线的人数
value_data = []
for y,d in enumerate(y_data):
# 获取当前日期在线数据
online_df = merge_df[merge_df["createTime"] == d]
# 获取在线创建人数
# online_num = online_df["userId"].nunique()
# print(d,online_num,online_df.head(5))
# 获取在未来几天登录的人数
for x,days in enumerate(x_data):
online_every = online_df[online_df["OnlineDay"] == days]
# print(d,days,online_every.head(5))
# print("第:"+str(days),online_every.head(5))
online_num_days = online_every["userId"].nunique()
value_data.append([x,y,online_num_days])
print(value_data)
print(x_data)
print(y_data)
运行截图,只有部分,数据太多了:
下面是生成热力图的代码,需要安装pyecharts:
pip install pyecharts==2.0.3
# 使用pyecharts绘制热力图
from pyecharts import options as opts
from pyecharts.charts import HeatMap
c = (
HeatMap(init_opts=opts.InitOpts(width="1400px", height="800px"))
.add_xaxis(x_data)
.add_yaxis(
"留存图",
y_data,
value_data,
label_opts=opts.LabelOpts(is_show=True, position="inside"),
)
.set_global_opts(
title_opts=opts.TitleOpts(title="HeatMap-Label 显示"),
visualmap_opts=opts.VisualMapOpts(),
)
)
c.render_notebook()
运行截图:
可以从上面的热力图看出,用户留存情况