33. Pandas计算同比环比指标的3种方法
Pandas计算同比环比指标的3种方法
同比和环比:环比和同比用于描述统计数据的变化情况
- 环比:表示本次统计段与相连的上次统计段之间的比较。
- 比如2010年中国第一季度GDP为G2010Q1亿元,第二季度GDP为G2010Q2亿元,则第二季度GDP环比增长(G2010Q2-G2010Q1)/G2010Q1;
- 同比:即同期相比,表示某个特定统计段今年与去年之间的比较。
- 比如2009年中国第一季度GDP为G2009Q1亿元,则2010年第一季度的GDP同比增长为(G2010Q1-G2009Q1)/G2009Q1。
演示步骤:
0. 读取连续3年的天气数据
- 方法1:pandas.Series.pct_change
- 方法2:pandas.Series.shift
- 方法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种方法相关推荐
- 【Mysql实战】使用存储过程和计算同比环比
背景 同环比,是基本的数据分析方法.在各类调研表中屡见不鲜,如果人工向前追溯统计数据,可想而知工作量是非常大的. 标题复制10行,并且每行大于10个字符[源码解析]SpringBoot接口参数[Mys ...
- html+input改变图标,JS Input里添加小图标的两种方法
我们在做网页的时候,经常需要在input里面添加小图标,那么这里就介绍比较常见的两种方法. 将小图标当做input的背景来插入,直接上代码吧: Box{ height: 50px; backgroun ...
- 注册表桌面显示计算机,电脑开机后不显示桌面图标怎么办?修改注册表解决开机后不显示桌面图标的3种方法...
解决方法一: 1.按Win+R打开运行,输入regedit并回车: 2.在注册表展开:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersi ...
- html密码框怎么添加小图标,JS Input里添加小图标的两种方法
我们在做网页的时候,经常需要在input里面添加小图标,那么这里就介绍比较常见的两种方法. 方法一 将小图标当做input的背景来插入,直接上代码吧: *{ margin: 0; padding: 0 ...
- input 单击 图标_JS Input里添加小图标的两种方法
我们在做网页的时候,经常需要在input里面添加小图标,那么这里就介绍比较常见的两种方法. 方法一 将小图标当做input的背景来插入,直接上代码吧: *{ margin: 0; padding: 0 ...
- PCL点云处理之计算点到空间直线距离的四种方法(二十三)
PCL点云处理之计算点到空间直线距离的四种方法(二十三) 问题表述 方法1 方法2 方法3 方法4 全部代码(四个函数) 问题表述 给定空间一条直线的两个点或者给定直线上一点和直线方向向量 求直线外一 ...
- 【Markdown】 实现上角标和下角标的两种方法(详细讲解!!!)
作者:MiTu_-_ 本帖内容著作权归作者所有,转载请务必保留本文链接 Markdown实现上下角标的两种方法 第一种 使用Markdown自带的代码格式: 下标: ~ (内容) ~ 例:H2O H~ ...
- Oracle如何根据一个日期计算同比环比的日期
iamlaosong文 在写统计查询的SQL语句时,经常会碰到根据一个查询日期推演其它日期的问题,如同比.环比等. 1.字符串转换成日期:to_date('2016-6-16', 'yyyy-mm-d ...
- java时间计算同比环比周的问题
问题描述: 在业务中会有传不同日期格式, 1.有天(2020-02-29),周(2020-03第三周),月(2020-02二月份), 2.同时需要计算对应的去年同比时间和环比(就是上一个时间段,周的2 ...
- python计算今年第几天_Python三种方法计算指定日期是今年的第几天
今天早上和腾讯面试官进行了视频面试,由于音量和网络以及我的垃圾电脑的原因,个人感觉黄了... 最后面试官给了我一道简单的计算题:指定日期是今年的第几年 由于电脑卡到打字都打不动,我勉勉强强写了一点,虽 ...
最新文章
- TensorFlow数据归一化
- HTML和CSS在IE7中常见的兼容性问题
- oracle adg切换原理,oracle11g ADG主备切换
- PHP debug_backtrace() 函数
- 最新卡巴斯基密码管理器:注重便利性和强化密码控制
- 微信小程序 人脸识别登陆模块
- MacBooster CleanMyMac CCleaner三款Mac清理工具该如何选择
- 基于stc15f2k60s2芯片单片机编程(计算器,不完美)
- mini_c编译器的简单代码逻辑
- 用DOI号批量爬取开源数据库文献数据(含文献 下载)
- 北京的哪些地方开的发票可参与国家税务局的摇奖
- 币优网区块链原理浅析
- 无限分类---重新排序+生成树型
- js颜色加深或者减淡
- C 语言课程设计 最终答辩版 学生通讯录管理系统
- 阿里云服务器安装mongodb
- python--数据清洗
- ibm r40的内存品牌_在IBM Business Process Manager中品牌化和定制教练主题
- windows与linux中,ping大数据包的命令格式
- visdom API 方便使用查阅
热门文章
- 阿里云香港服务器速度快吗?
- Cannot mix different versions of joi schemas解决方案
- vue和ele结合使用form表单时:rules=“formValidate“的使用(ele的表单校验)
- [SageMath] 关于SageMath本地环境的搭建与基本使用
- 笔记本触摸屏\板使用小技巧,没有鼠标也能轻松使用电脑
- php怎么添加extension,php中没有extension怎么办_后端开发
- 刚读博士想退学?如何避免博士毕业不了?
- 语音社交聊天app受欢迎的特点有哪些?
- 图文教你选择和区别A卡和N卡
- 嵌入式的苦逼从何而来