【问题标题】:How to calculate Cumulative Average Revenue ? Python如何计算累积平均收入? Python
【发布时间】:2021-04-01 07:33:25
【问题描述】:

我想创建一个图表,显示一段时间内每个“入职年份”(首次客户交易)的累积平均收入。但是在对需要的信息进行分组时,我犯了错误。

玩具数据:

dataset = {'ClientId': [1,2,3,1,2,3,1,2,3,1,2,3,4,4,4,4,4,4,4],
           'Year Onboarded': [2018,2019,2020,2018,2019,2020,2018,2019,2020,2018,2019,2020,2016,2016,2016,2016,2016,2016,2016],
           'Year': [2019,2019,2020,2019,2019,2020,2018,2020,2020,2020,2019,2020,2016,2017,2018,2019,2020,2017,2018],
           'Revenue': [100,50,25,30,40,50,60,100,20,40,100,20,5,5,8,4,10,20,8]}
df = pd.DataFrame(data=dataset)

解释:客户有一个指定的“入职年份”,他们在提到的每个“年份”都进行交易。 然后我计算自客户加入以来已经过去的年数,以使我的图表在视觉上更具吸引力。

df['Yearsdiff'] = df['Year']-df['Year Onboarded']

为了计算累积平均收入,我尝试了以下方法:

  • 第一次尝试:
df = df.join(df.groupby(['Year']).expanding().agg({ 'Revenue': 'mean'})
               .reset_index(level=0, drop=True)
               .add_suffix('_roll'))

df.groupby(['Year Onboarded', 'Year']).last().drop(columns=['Revenue'])

输出开始累积,但最后一行不再累积(不知道为什么)。

  • 第二次尝试:
df.groupby(['Year Onboarded','Year']).agg('mean') \
                                     .groupby(level=[1]) \
                                     .agg({'Revenue':np.cumsum})

但是不能正常工作,我也尝试了其他方法,但都没有达到很好的效果。

为了可视化累积平均收入,我只需使用sns.lineplot

我的目标是得到一个类似于下图的图表,但为此我首先需要对我的数据进行正确分组。

预期输出图

我们可以在图表上看到的年份代表“入职年份”而不是“年份”。

有人可以帮我计算一个累积平均收入,以便绘制类似于上面的图表吗?谢谢

此外,玩具数据集中提供的数据肯定不会给出与示例图类似的东西,但应该有这个想法。

【问题讨论】:

    标签: python pandas group-by cumulative-sum


    【解决方案1】:

    我就是这样做的,考虑到玩具数据不一样,可能应该做一些改变,但总而言之:

    import seaborn as sns
    df1 = df.copy() 
    df1['Yearsdiff'] = df1['Year']-df1['Year Onboarded']
    df1['Revenue'] = df.groupby(['Year Onboarded'])['Revenue'].transform('mean') 
    #Find the average revenue per Year Onboarded
    df1['Revenue'] = df1.groupby(['Yearsdiff'])['Revenue'].transform('cumsum')
    #Calculate the cumulative sum of Revenue (Which is now the average per Year Onboarded) per Yearsdiff (because this will be our X-axis in the plot)   
    sns.lineplot(x=df1['Yearsdiff'],y=df1['Revenue'],hue=df1['Year'])
    #Finally plot the data, using the column 'Year' as hue to account for the different years.
    

    【讨论】:

    • 我确实尝试过类似的方法,但它似乎不起作用。此外,图表中的年份应该是“入职年份”,我应该提到的是抱歉
    【解决方案2】:

    你可以像这样创建滚动平均值:

    df['rolling_mean'] = df.groupby(['Year Onboarded'])['Revenue'].apply(lambda x: x.rolling(10, 1).mean())
    
    df
    
    #     ClientId  Year Onboarded  Year  Revenue rolling_mean
    # 0          1            2018  2019      100   100.000000
    # 1          2            2019  2019       50    50.000000
    # 2          3            2020  2020       25    25.000000
    # 3          1            2018  2019       30    65.000000
    # 4          2            2019  2019       40    45.000000
    # 5          3            2020  2020       50    37.500000
    # 6          1            2018  2018       60    63.333333
    # 7          2            2019  2020      100    63.333333
    # 8          3            2020  2020       20    31.666667
    # 9          1            2018  2020       40    57.500000
    # 10         2            2019  2019      100    72.500000
    # 11         3            2020  2020       20    28.750000
    # 12         4            2016  2016        5     5.000000
    # 13         4            2016  2017        5     5.000000
    # 14         4            2016  2018        8     6.000000
    # 15         4            2016  2019        4     5.500000
    # 16         4            2016  2020       10     6.400000
    # 17         4            2016  2017       20     8.666667
    # 18         4            2016  2018        8     8.571429
    

    【讨论】:

    • rolling() 中的 (10,1) 代表什么?
    • 窗口(必填)和最短期间(可选)
    猜你喜欢
    • 2012-06-19
    • 2017-09-28
    • 2011-11-01
    • 2017-11-29
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多