如何从前几个月的中位数计算每个月的百分比变化

2024-05-14 16:15:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有如下数据:

Group  YearMonth  PageViews  Users
A        202001      100        10
A        202002      120        9
B        202002      150        12
A        202003       90        10
B        202003      120        15
C        202001      130        10

我想找出每个新月份与前一个月使用量中值的百分比差异,例如,在每个组下

  1. 对于第一行(每组可能有不同的第一个日期,例如,A组有202001,b组有202002作为第一次观察),它将是NA
  2. 对于A组上个月的中位数
    将仅为202001,因此 与202001相比,202002为20%,用户为-10%
  3. 同样,对于202003年,前几个月的中位数为110(100+120乘以2=110) 中位数为202001和202002,因此页面浏览中位数和用户 为9.5,因此202003年的百分比差异将为-19% 页面浏览量和用户的+5%等

如何使用python找到它?任何帮助都将不胜感激。多谢各位


Tags: 数据用户group页面差异users百分比使用量
2条回答

通过控制“组”列,您可能需要移动页面视图

  1. 将数据转换为降序,因此最后一个将是第一个
df=df.sort_index(ascending=False)
  1. 通过控制组来移动视图
df["PageViews_1"] = df.groupby("Group")['PageViews'].apply(lambda x: (x.shift(1)))

这样,在每一行中,您都会有接下来几个月的记录。 最后,您可以简单地将平均值计算为

 df['mean']=(df["PageViews_1"]+df['PageViews'])/2

对于中位数,假设您将在A组旁边计算所有移位值,则可以计算每行的值

 df['median']=df.median(axis=1)

您可以使用^{}方法获取之前所有值的中位数,并shift将结果与下一个YearMonth对齐,每个组使用groupby进行此操作

# get expanding median of the two columns and shift
median_prev = (
    df.sort_values('YearMonth')
      .groupby('Group')
      [['PageViews','Users']]
      .apply(lambda x: x.expanding().mean().shift())
)
print(median_prev.sort_index())
#    PageViews  Users
# 0        NaN    NaN
# 1      100.0   10.0
# 2        NaN    NaN
# 3      110.0    9.5
# 4      150.0   12.0
# 5        NaN    NaN

然后,根据需要计算百分比差异。我想你想要:

# create the two columns, no need of sort_index, 
# will do it automatically index and column alignment
df[[f'%change_{col}' for col in ['PageViews','Users']]] = \
    ((df[['PageViews','Users']]/median_prev-1)*100).round(1)

print(df)
   Group  YearMonth  PageViews  Users  %change_PageViews  %change_Users
0     A     202001        100     10                NaN            NaN
1     A     202002        120      9               20.0          -10.0
2     B     202002        150     12                NaN            NaN
3     A     202003         90     10              -18.2            5.3
4     B     202003        120     15              -20.0           25.0
5     C     202001        130     10                NaN            NaN

相关问题 更多 >

    热门问题