题目
领导赵老丝er给淑芬一张表 data,这张表有两个字段,uid(用户id),reg_time(注册时间)。赵老丝er想知道某一天的新增用户数 和 以及该天过去7日内 每天新增用户总数 和平均数。
(欲哭还有泪的淑芬er)
data表如下:
Python代码实现:
方法一:
import pandas as pd,numpy as np
df=pd.read_excel("data.xlsx")
df["reg_time"]=df["reg_time"].astype("datetime64[ns]")
df["reg_time"]=df["reg_time"].dt.date #2021/12/7 12:34:09 转为 2021/12/7
df1=df.groupby("reg_time")
res=pd.DataFrame(columns=["当日注册数","近七日注册数","近七日注册平均人数"])
for i ,j in df1:
m=j["uid"].count() #当日注册总人数
t1=i-pd.Timedelta(6,unit="day") #上周的日期
df2=df.query("reg_time>=@t1 & reg_time<= @i")["uid"] #筛选上周到当日 uid 的数据
unique_day=df.query("reg_time>=@t1 & reg_time<= @i").reg_time.nunique() #这一步主要是为了解决 开始时间2015-01-01 减去7天没有数据情况,直接除以7 不准确
reg_sum=df2.count()
reg_avg=f"{reg_sum/unique_day:.2f}"
res.loc[i]=[m,reg_sum,reg_avg]
res
方法二:窗口计算rolling
import pandas as pd,numpy as np
df=pd.read_excel("data.xlsx")
df=df.groupby("reg_time").count()
df[["近七日注册数","近七日注册平均人数"]]=df.rolling("7D").agg([sum,"mean"])
#数据格式调整
df=df.rename(columns={"uid":"当日注册数"})
df.index=df.index.date
df
欢迎大家留言讨论,多多分享你的思路,淑芬感激不尽。抱拳了铁子