Pandas常用累计、同比、环比等统计方法实践过程
作者:肖永威 发布时间:2021-03-13 01:48:36
统计表中常常以本年累计、上年同期(累计)、当期(例如当月)完成、上月完成为统计数据,并进行同比、环比分析。
如下月报统计表所示样例,本文将使用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条件修改数据。
来源:https://xiaoyw.blog.csdn.net/article/details/122979421


猜你喜欢
- 如下所示:'''Created on 2018-4-20例子:每天凌晨3点执行func方法''
- 区别IE6与FF:background:orange;*background:blue;区别IE6与IE7:background:green
- 目录前言1 异常类型1.1 Python内置异常1.2 requests模块的相关异常1.3 用户自定义异常2. 异常捕获2.1&
- 注意:第三种方法要在 XSell 中使用,在 finalsell 中使用不了方式一:临时使用自动补全功能mysql -u root -p -
- 前言:处理图片需要,需把图片都转换成1920*1280的大小, python实现很方便,需要导入图片处理的Image包和匹配的glob包,很
- 我们都有过函数调用的经历,那么call调用类实例的过程就跟函数很相似。类的用法很多人都知道了,类实例又是什么呢?可以把类看成一个设计图,类实
- 以下面这个例子作为教程,实现功能是element-wise add;(pytorch中想调用cuda模块,还是用另外使用C编写接口脚本)第一
- pipenv 是Kenneth Reitz大神的作品,能够有效管理Python多个环境,各种包。过去我们一般用virtualenv搭建虚拟环
- 常用配置以下配置能使用File -> New Projects Settings -> Settings for New Pro
- 这段程序的方法是利用XMLHTTP来读取腾讯网站的相应HTML代码获取QQ的头像,根据这个想法,我们还
- 一、异步解决方案的进化史JavaScript的异步操作一直是个麻烦事,所以不断有人提出它的各种解决方案。可以追溯到最早的回调函数(ajax老
- 1. 自己用python写了一个签到脚本经过测试已经可以成功打卡,于是研究了一下windows定时运行程序2. 创建定时任务2.1 打开“控
- Doing INTERSECT and MINUS in MySQL Doing an INTERSECT An INTERSECT is
- <%@ Page Language="C#" AutoEventWireup="true" C
- 用了腾讯QQ也有将近十年了,今天心血来潮想模仿腾讯QQ的登陆面板做一个web版的登陆面板,然后参考了一些代码,自己模仿,学写了一个。&nbs
- 本文实例讲述了Python实现多线程的两种方式。分享给大家供大家参考,具体如下:目前python 提供了几种多线程实现方式 thread,t
- 1.虚拟环境它是一个虚拟化的概念,从电脑独立开辟出来的环境。通俗的来讲,虚拟环境就是借助虚拟机来把一部分内容独立出来,我们把这部分独立出来的
- 通常情况下:from threading import Threadglobal_num = 0def func1(): global gl
- CocosCreator版本:2.3.4cocos没有List组件,所以要自己写。从cocos的example项目中找到assets/cas
- 数据库对象表时存储和操作数据的逻辑结构,而数据库对象存储过程和函数,则是用来实现将一组关于表操作的sql语句当作一个整体来执行。在数据库系统