【问题标题】:How to calculate percent change of each month, from median of previous months如何从前几个月的中位数计算每个月的百分比变化
【发布时间】:2021-07-12 18:26:08
【问题描述】:

我的数据如下所示:

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,而 groupb b 有 202002 作为第一次观察)它将是 NA
  2. A 组上个月的中位数
    将只有 202001,因此网页浏览量的百分比差异 与 202001 年相比,202002 年将是 20%,用户将是 -10%
  3. 与 202003 年类似,前几个月的中位数为 110 ( 100+120 by 2 = 110) 202001 和 202002 合并的中位数,因此 pageview median 和 user 是 9.5,因此 202003 年的百分比差异将为 -19% 用户的浏览量和 +5% 等等。

如何使用 python 找到它?任何帮助,将不胜感激。谢谢。

【问题讨论】:

    标签: python sql pandas dataframe numpy


    【解决方案1】:

    您可以使用expanding 方法获取之前所有值的中位数,并使用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
    

    【讨论】:

      【解决方案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)
      

      【讨论】:

      • apply(lambda x: (x.shift(1))) 可以替换为shift()
      猜你喜欢
      • 2021-06-02
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      • 2021-06-01
      • 2019-03-27
      • 2021-12-22
      • 2016-05-14
      • 1970-01-01
      相关资源
      最近更新 更多