问题描述
我想创建一个图表,显示一段时间内每个“入职年”(首次客户交易)的累积平均收入。但是我在对我需要的信息进行分组时犯了错误。
玩具数据:
dataset = {'ClientId': [1,2,3,1,4,4],'Year Onboarded': [2018,2019,2020,2018,2016,2016],'Year': [2019,2017,2018],'Revenue': [100,50,25,30,40,60,100,20,5,8,10,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
我的目标是得到一个类似于下图的图表,但为此我首先需要正确地对我的数据进行分组。
预期输出图
我们在图表上看到的年份代表的是“入职年份”,而不是“年份”。
有人可以帮我计算一个有效的累积平均收入,以便绘制与上面类似的图表吗?谢谢
此外,玩具数据集中提供的数据肯定不会给出与示例图类似的东西,但应该有这个想法。
解决方法
这就是我的做法,考虑到玩具数据不一样,可能应该做一些更改,但总而言之:
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.
,
您可以像这样创建滚动均值:
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