Pandas常用累计、同比、环比等统计方法实践案例

统计表中常常以本年累计、上年同期(累计)、当期(例如当月)完成、上月完成为统计数据,并进行同比、环比分析。如下月报统计表所示样例,本文将使用Python Pandas工具进行统计。
在这里插入图片描述
其中:

  • (本年)累计:是指本年1月到截止月份的合计数
  • (上年)同期(累计):是指去年1月到与本年累计所对应截止月份的合计数
  • 同比(增长率)=(本期数-同期数)/同期数*100%
  • 环比(增长率)=(本期数-上期数)/上期数*100%

注:这里的本期是指本月完成或当月完成,上期数是指上月完成。

示例数据:
在这里插入图片描述

注:为了演示方便,本案例数据源仅使用2年,且每年5个月的数据。

1. (本年)累计

在做统计分析开发中,按年度、按月累计某些统计数据,是比较常见的需求。对于数据来说,就是按规则逐行累加数据。

Pandas中的cumsum()函数可以实现按某时间维度累计需求。


# 取本年累计值
import pandas as pd

df = pd.read_csv('data2021.csv')
cum_columns_name = ['cum_churncount','cum_newcount']
df[cum_columns_name] = df[['years','churncount','newcount']].groupby(['years']).cumsum()

注:其中分组‘years’是指年度时间维度累计。

计算结果如下:
在这里插入图片描述

2. (上年)同期累计

对于(上年)同期累计,将直接取上一年度累计值的同月份数据。pandas DataFrame.shift()函数可以把数据移动指定的行数。
在这里插入图片描述
接续上列,读取同期数据。首先是把‘yearmonth’上移五行,如上图所示得到新的DataFrame,通过‘yearmonth’进行两表数据关联(左关联:左侧为原表,右侧为移动后的新表),实现去同期数据效果。

cum_columns_dict = {'cum_churncount':'cum_same_period_churncount',
                        'cum_newcount':'cum_same_period_newcount'}
df_cum_same_period = df[['cum_churncount','cum_newcount','yearmonth']].copy()
df_cum_same_period = df_cum_same_period.rename(columns=cum_columns_dict)
#df_cum_same_period.loc[:,'yearmonth'] = df_cum_same_period['yearmonth'].shift(-12) # 一年12个月
df_cum_same_period.loc[:,'yearmonth'] = df_cum_same_period['yearmonth'].shift(-5)   # 由于只取5个月数据的原因

df = pd.merge(left=df,right=df_cum_same_period,on='yearmonth',how='left')

3. 上月(完成)

取上月的数据,使用pandas DataFrame.shift()函数把数据移动指定的行数。

接续上列,读取上期数据。(与取同期原理一样,略)

last_mnoth_columns_dict = {'churncount':'last_month_churncount',
                        'newcount':'last_month_newcount'}
df_last_month = df[['churncount','newcount','yearmonth']].copy()
df_last_month = df_last_month.rename(columns=last_mnoth_columns_dict)

df_last_month.loc[:,'yearmonth'] = df_last_month['yearmonth'].shift(-1)  # 移动一行
df = pd.merge(left=df,right=df_last_month,on='yearmonth',how='left')

4. 同比(增长率)

计算同比涉及到除法,需要剔除除数为零的数据。

df.fillna(0,inplace=True) # 空值填充为0 
# 计算同比
df.loc[df['cum_same_period_churncount']!=0,'cum_churncount_rat'] = (df['cum_churncount']-df['cum_same_period_churncount'])/df['cum_same_period_churncount'] # 除数不能为零
df.loc[df['cum_same_period_newcount']!=0,'cum_newcount_rat'] =  (df['cum_newcount']-df['cum_same_period_newcount'])/df['cum_same_period_newcount'] # 除数不能为零
df[['yearmonth','cum_churncount','cum_newcount','cum_same_period_churncount','cum_same_period_newcount','cum_churncount_rat','cum_newcount_rat']]

在这里插入图片描述

5. 环比(增长率)

# 计算环比
df.loc[df['last_month_churncount']!=0,'churncount_rat'] = (df['churncount']-df['last_month_churncount'])/df['last_month_churncount'] # 除数不能为零
df.loc[df['last_month_newcount']!=0,'newcount_rat'] =  (df['newcount']-df['last_month_newcount'])/df['last_month_newcount'] # 除数不能为零
df[['yearmonth','churncount','newcount','last_month_churncount','last_month_newcount','churncount_rat','newcount_rat']]

在这里插入图片描述

6. 总结

pandas做统计计算功能方法比较多,这里总结用到的技术有累计cumsum()函数、移动数据shift()函数、表合并关联merge()函数,以及通过loc条件修改数据。

在Python中,可以使用pandas和numpy库来实现对同比环比、占比、贡献率、拉动率、移动均值等的计算。 同比计算: 同比指的是与上一年相比的增长率。可以通过pandas库的groupby和shift方法来实现,具体步骤如下: 1. 使用groupby方法,按照年份对数据进行分组。 2. 使用shift方法,将当前年份的数据移动一年,得到上一年的数据。 3. 计算同比增长率((当前年份数据 - 上一年数据)/ 上一年数据)* 100 环比计算: 环比指的是与前一个时间点相比的增长率。可以通过pandas库的shift方法和计算公式来实现,具体步骤如下: 1. 使用shift方法,将当前时间点的数据移动一个时间单位,得到前一个时间点的数据。 2. 计算环比增长率((当前时间点数据 - 前一个时间点数据)/ 前一个时间点数据)* 100 占比计算: 占比指的是某个变量在总体中的比例。可以通过pandas库的sum方法和计算公式来实现,具体步骤如下: 1. 使用sum方法,计算出总体中某个变量的总和。 2. 使用该变量的数值除以总体的总和,并乘以100,即为占比值。 贡献率计算: 贡献率指的是某个变量对整体变化的贡献。可以通过pandas库的sum方法和计算公式来实现,具体步骤如下: 1. 使用sum方法,计算出总体中某个变量的总和。 2. 使用该变量的总和除以整体的总和,并乘以100,即为贡献率值。 拉动率计算: 拉动率指的是某个变量对整体变化的拉动效应。可以通过pandas库的sum方法和计算公式来实现,具体步骤如下: 1. 使用sum方法,计算出总体中某个变量的总和。 2. 使用该变量的总和除以整体的总和,乘以100,即为拉动率值。 移动均值计算: 移动均值指的是在一个移动窗口内的数据均值。可以通过pandas库的rolling方法和mean方法来实现,具体步骤如下: 1. 使用rolling方法,指定移动窗口的大小。 2. 使用mean方法,计算移动窗口内的数据均值。 以上就是Python实现对同比环比、占比、贡献率、拉动率、移动均值等的计算的详细代码。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肖永威

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值