Pandas计算同比环比指标的3种方法

同比和环比:环比和同比用于描述统计数据的变化情况

  • 环比:表示本次统计段与相连的上次统计段之间的比较。

    • 比如2010年中国第一季度GDP为G2010Q1亿元,第二季度GDP为G2010Q2亿元,则第二季度GDP环比增长(G2010Q2-G2010Q1)/G2010Q1;
  • 同比:即同期相比,表示某个特定统计段今年与去年之间的比较。
    • 比如2009年中国第一季度GDP为G2009Q1亿元,则2010年第一季度的GDP同比增长为(G2010Q1-G2009Q1)/G2009Q1。

演示步骤:
0. 读取连续3年的天气数据

  1. 方法1:pandas.Series.pct_change
  2. 方法2:pandas.Series.shift
  3. 方法3:pandas.Series.diff

pct_change、shift、diff,都实现了跨越多行的数据计算

0. 读取连续3年的天气数据

import pandas as pd
%matplotlib inline
fpath = "./datas/beijing_tianqi/beijing_tianqi_2017-2019.csv"
df = pd.read_csv(fpath, index_col="ymd", parse_dates=True)
df.head(3)
bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
ymd
2017-01-01 5℃ -3℃ 霾~晴 南风 1-2级 450 严重污染 6
2017-01-02 7℃ -6℃ 晴~霾 南风 1-2级 246 重度污染 5
2017-01-03 5℃ -5℃ 南风 1-2级 320 严重污染 6
# 替换掉温度的后缀℃
df["bWendu"] = df["bWendu"].str.replace("℃", "").astype('int32')
df.head(3)
bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
ymd
2017-01-01 5 -3℃ 霾~晴 南风 1-2级 450 严重污染 6
2017-01-02 7 -6℃ 晴~霾 南风 1-2级 246 重度污染 5
2017-01-03 5 -5℃ 南风 1-2级 320 严重污染 6
# 新的df,为每个月的平均最高温
df = df[["bWendu"]].resample("M").mean()
# 将索引按照日期升序排列
df.sort_index(ascending=True, inplace=True)
df.head()
bWendu
ymd
2017-01-31 3.322581
2017-02-28 7.642857
2017-03-31 14.129032
2017-04-30 23.700000
2017-05-31 29.774194
df.index
DatetimeIndex(['2017-01-31', '2017-02-28', '2017-03-31', '2017-04-30','2017-05-31', '2017-06-30', '2017-07-31', '2017-08-31','2017-09-30', '2017-10-31', '2017-11-30', '2017-12-31','2018-01-31', '2018-02-28', '2018-03-31', '2018-04-30','2018-05-31', '2018-06-30', '2018-07-31', '2018-08-31','2018-09-30', '2018-10-31', '2018-11-30', '2018-12-31','2019-01-31', '2019-02-28', '2019-03-31', '2019-04-30','2019-05-31', '2019-06-30', '2019-07-31', '2019-08-31','2019-09-30', '2019-10-31', '2019-11-30', '2019-12-31'],dtype='datetime64[ns]', name='ymd', freq='M')
df.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x13d8d77dc48>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NY4NNjz6-1611064082104)(output_11_1.png)]

方法1:pandas.Series.pct_change

pct_change方法直接算好了"(新-旧)/旧"的百分比

官方文档地址:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.pct_change.html

df["bWendu_way1_huanbi"] = df["bWendu"].pct_change(periods=1)
df["bWendu_way1_tongbi"] = df["bWendu"].pct_change(periods=12)
df.head(15)
bWendu bWendu_way1_huanbi bWendu_way1_tongbi
ymd
2017-01-31 3.322581 NaN NaN
2017-02-28 7.642857 1.300277 NaN
2017-03-31 14.129032 0.848658 NaN
2017-04-30 23.700000 0.677397 NaN
2017-05-31 29.774194 0.256295 NaN
2017-06-30 30.966667 0.040051 NaN
2017-07-31 31.612903 0.020869 NaN
2017-08-31 30.129032 -0.046939 NaN
2017-09-30 27.866667 -0.075089 NaN
2017-10-31 17.225806 -0.381849 NaN
2017-11-30 9.566667 -0.444632 NaN
2017-12-31 4.483871 -0.531303 NaN
2018-01-31 1.322581 -0.705036 -0.601942
2018-02-28 4.892857 2.699477 -0.359813
2018-03-31 14.129032 1.887685 0.000000

方法2:pandas.Series.shift

shift用于移动数据,但是保持索引不变

官方文档地址:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.shift.html

# 见识一下shift做了什么事情
# 使用pd.concat合并Series列表变成一个大的df
pd.concat([df["bWendu"], df["bWendu"].shift(periods=1), df["bWendu"].shift(periods=12)],axis=1
).head(15)
bWendu bWendu bWendu
ymd
2017-01-31 3.322581 NaN NaN
2017-02-28 7.642857 3.322581 NaN
2017-03-31 14.129032 7.642857 NaN
2017-04-30 23.700000 14.129032 NaN
2017-05-31 29.774194 23.700000 NaN
2017-06-30 30.966667 29.774194 NaN
2017-07-31 31.612903 30.966667 NaN
2017-08-31 30.129032 31.612903 NaN
2017-09-30 27.866667 30.129032 NaN
2017-10-31 17.225806 27.866667 NaN
2017-11-30 9.566667 17.225806 NaN
2017-12-31 4.483871 9.566667 NaN
2018-01-31 1.322581 4.483871 3.322581
2018-02-28 4.892857 1.322581 7.642857
2018-03-31 14.129032 4.892857 14.129032
# 环比
series_shift1 = df["bWendu"].shift(periods=1)
df["bWendu_way2_huanbi"] = (df["bWendu"]-series_shift1)/series_shift1# 同比
series_shift2 = df["bWendu"].shift(periods=12)
df["bWendu_way2_tongbi"] = (df["bWendu"]-series_shift2)/series_shift2
df.head(15)
bWendu bWendu_way1_huanbi bWendu_way1_tongbi bWendu_way2_huanbi bWendu_way2_tongbi
ymd
2017-01-31 3.322581 NaN NaN NaN NaN
2017-02-28 7.642857 1.300277 NaN 1.300277 NaN
2017-03-31 14.129032 0.848658 NaN 0.848658 NaN
2017-04-30 23.700000 0.677397 NaN 0.677397 NaN
2017-05-31 29.774194 0.256295 NaN 0.256295 NaN
2017-06-30 30.966667 0.040051 NaN 0.040051 NaN
2017-07-31 31.612903 0.020869 NaN 0.020869 NaN
2017-08-31 30.129032 -0.046939 NaN -0.046939 NaN
2017-09-30 27.866667 -0.075089 NaN -0.075089 NaN
2017-10-31 17.225806 -0.381849 NaN -0.381849 NaN
2017-11-30 9.566667 -0.444632 NaN -0.444632 NaN
2017-12-31 4.483871 -0.531303 NaN -0.531303 NaN
2018-01-31 1.322581 -0.705036 -0.601942 -0.705036 -0.601942
2018-02-28 4.892857 2.699477 -0.359813 2.699477 -0.359813
2018-03-31 14.129032 1.887685 0.000000 1.887685 0.000000

方法3. pandas.Series.diff

pandas.Series.diff用于新值减去旧值

官方文档:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.diff.html

pd.concat([df["bWendu"], df["bWendu"].diff(periods=1), df["bWendu"].diff(periods=12)],axis=1
).head(15)
bWendu bWendu bWendu
ymd
2017-01-31 3.322581 NaN NaN
2017-02-28 7.642857 4.320276 NaN
2017-03-31 14.129032 6.486175 NaN
2017-04-30 23.700000 9.570968 NaN
2017-05-31 29.774194 6.074194 NaN
2017-06-30 30.966667 1.192473 NaN
2017-07-31 31.612903 0.646237 NaN
2017-08-31 30.129032 -1.483871 NaN
2017-09-30 27.866667 -2.262366 NaN
2017-10-31 17.225806 -10.640860 NaN
2017-11-30 9.566667 -7.659140 NaN
2017-12-31 4.483871 -5.082796 NaN
2018-01-31 1.322581 -3.161290 -2.00
2018-02-28 4.892857 3.570276 -2.75
2018-03-31 14.129032 9.236175 0.00
# 环比
series_diff1 = df["bWendu"].diff(periods=1)
df["bWendu_way3_huanbi"] = series_diff1/(df["bWendu"]-series_diff1)# 同比
series_diff2 = df["bWendu"].diff(periods=12)
df["bWendu_way3_tongbi"] = series_diff2/(df["bWendu"]-series_diff2)
df.head(15)
bWendu bWendu_way1_huanbi bWendu_way1_tongbi bWendu_way2_huanbi bWendu_way2_tongbi bWendu_way3_huanbi bWendu_way3_tongbi
ymd
2017-01-31 3.322581 NaN NaN NaN NaN NaN NaN
2017-02-28 7.642857 1.300277 NaN 1.300277 NaN 1.300277 NaN
2017-03-31 14.129032 0.848658 NaN 0.848658 NaN 0.848658 NaN
2017-04-30 23.700000 0.677397 NaN 0.677397 NaN 0.677397 NaN
2017-05-31 29.774194 0.256295 NaN 0.256295 NaN 0.256295 NaN
2017-06-30 30.966667 0.040051 NaN 0.040051 NaN 0.040051 NaN
2017-07-31 31.612903 0.020869 NaN 0.020869 NaN 0.020869 NaN
2017-08-31 30.129032 -0.046939 NaN -0.046939 NaN -0.046939 NaN
2017-09-30 27.866667 -0.075089 NaN -0.075089 NaN -0.075089 NaN
2017-10-31 17.225806 -0.381849 NaN -0.381849 NaN -0.381849 NaN
2017-11-30 9.566667 -0.444632 NaN -0.444632 NaN -0.444632 NaN
2017-12-31 4.483871 -0.531303 NaN -0.531303 NaN -0.531303 NaN
2018-01-31 1.322581 -0.705036 -0.601942 -0.705036 -0.601942 -0.705036 -0.601942
2018-02-28 4.892857 2.699477 -0.359813 2.699477 -0.359813 2.699477 -0.359813
2018-03-31 14.129032 1.887685 0.000000 1.887685 0.000000 1.887685 0.000000

33. Pandas计算同比环比指标的3种方法相关推荐

  1. 【Mysql实战】使用存储过程和计算同比环比

    背景 同环比,是基本的数据分析方法.在各类调研表中屡见不鲜,如果人工向前追溯统计数据,可想而知工作量是非常大的. 标题复制10行,并且每行大于10个字符[源码解析]SpringBoot接口参数[Mys ...

  2. html+input改变图标,JS Input里添加小图标的两种方法

    我们在做网页的时候,经常需要在input里面添加小图标,那么这里就介绍比较常见的两种方法. 将小图标当做input的背景来插入,直接上代码吧: Box{ height: 50px; backgroun ...

  3. 注册表桌面显示计算机,电脑开机后不显示桌面图标怎么办?修改注册表解决开机后不显示桌面图标的3种方法...

    解决方法一: 1.按Win+R打开运行,输入regedit并回车: 2.在注册表展开:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersi ...

  4. html密码框怎么添加小图标,JS Input里添加小图标的两种方法

    我们在做网页的时候,经常需要在input里面添加小图标,那么这里就介绍比较常见的两种方法. 方法一 将小图标当做input的背景来插入,直接上代码吧: *{ margin: 0; padding: 0 ...

  5. input 单击 图标_JS Input里添加小图标的两种方法

    我们在做网页的时候,经常需要在input里面添加小图标,那么这里就介绍比较常见的两种方法. 方法一 将小图标当做input的背景来插入,直接上代码吧: *{ margin: 0; padding: 0 ...

  6. PCL点云处理之计算点到空间直线距离的四种方法(二十三)

    PCL点云处理之计算点到空间直线距离的四种方法(二十三) 问题表述 方法1 方法2 方法3 方法4 全部代码(四个函数) 问题表述 给定空间一条直线的两个点或者给定直线上一点和直线方向向量 求直线外一 ...

  7. 【Markdown】 实现上角标和下角标的两种方法(详细讲解!!!)

    作者:MiTu_-_ 本帖内容著作权归作者所有,转载请务必保留本文链接 Markdown实现上下角标的两种方法 第一种 使用Markdown自带的代码格式: 下标: ~ (内容) ~ 例:H2O H~ ...

  8. Oracle如何根据一个日期计算同比环比的日期

    iamlaosong文 在写统计查询的SQL语句时,经常会碰到根据一个查询日期推演其它日期的问题,如同比.环比等. 1.字符串转换成日期:to_date('2016-6-16', 'yyyy-mm-d ...

  9. java时间计算同比环比周的问题

    问题描述: 在业务中会有传不同日期格式, 1.有天(2020-02-29),周(2020-03第三周),月(2020-02二月份), 2.同时需要计算对应的去年同比时间和环比(就是上一个时间段,周的2 ...

  10. python计算今年第几天_Python三种方法计算指定日期是今年的第几天

    今天早上和腾讯面试官进行了视频面试,由于音量和网络以及我的垃圾电脑的原因,个人感觉黄了... 最后面试官给了我一道简单的计算题:指定日期是今年的第几年 由于电脑卡到打字都打不动,我勉勉强强写了一点,虽 ...

最新文章

  1. TensorFlow数据归一化
  2. HTML和CSS在IE7中常见的兼容性问题
  3. oracle adg切换原理,oracle11g ADG主备切换
  4. PHP debug_backtrace() 函数
  5. 最新卡巴斯基密码管理器:注重便利性和强化密码控制
  6. 微信小程序 人脸识别登陆模块
  7. MacBooster CleanMyMac CCleaner三款Mac清理工具该如何选择
  8. 基于stc15f2k60s2芯片单片机编程(计算器,不完美)
  9. mini_c编译器的简单代码逻辑
  10. 用DOI号批量爬取开源数据库文献数据(含文献 下载)
  11. 北京的哪些地方开的发票可参与国家税务局的摇奖
  12. 币优网区块链原理浅析
  13. 无限分类---重新排序+生成树型
  14. js颜色加深或者减淡
  15. C 语言课程设计 最终答辩版 学生通讯录管理系统
  16. 阿里云服务器安装mongodb
  17. python--数据清洗
  18. ibm r40的内存品牌_在IBM Business Process Manager中品牌化和定制教练主题
  19. windows与linux中,ping大数据包的命令格式
  20. visdom API 方便使用查阅

热门文章

  1. 阿里云香港服务器速度快吗?
  2. Cannot mix different versions of joi schemas解决方案
  3. vue和ele结合使用form表单时:rules=“formValidate“的使用(ele的表单校验)
  4. [SageMath] 关于SageMath本地环境的搭建与基本使用
  5. 笔记本触摸屏\板使用小技巧,没有鼠标也能轻松使用电脑
  6. php怎么添加extension,php中没有extension怎么办_后端开发
  7. 刚读博士想退学?如何避免博士毕业不了?
  8. 语音社交聊天app受欢迎的特点有哪些?
  9. 图文教你选择和区别A卡和N卡
  10. 嵌入式的苦逼从何而来