pandas计算同比、环比指标的几种方法

  • 同比:是指与 去年同期 相比的数据变化情况。例如,今年第一季度与去年第一季度相比。
    计算公式:
同比变化率=(本期值−去年同期值)/去年同期值 * 100%
  • 环比:环比是指与 上一期 相比的数据变化情况。例如,今年第2季度和第1季度相比。
    计算公式:
环比变化率=(本期值−上期值)/上期值 * 100%

用pandas来计算,有下面几种方法:

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

示例:用天气数据计算环比和同比

采用的是成都2022-2024连续3年的天气数据,计算最高温每月平均值的环比、同比。

公共步骤:数据准备

导入包:

import pandas as pd
import matplotlib.pyplot as plt
# 画图的时候可以显示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

读取成都连续3年的天气数据:

file_path = './data/成都几年的天气数据(2022-2024).xlsx'
df = pd.read_excel(file_path)

查看读取的数据:
在这里插入图片描述

将日期中的值只保留日期部分:

# 将日期中的值只保留日期部分,去掉 周的部分
df['日期'] = df['日期'].str[0:10]

查看现在的数据:
在这里插入图片描述

将日期列转为日期格式:

# 将日期列转为日期格式
df['日期'] = pd.to_datetime(df['日期'])

查看现在的数据类型:
在这里插入图片描述

将日期列设置为索引:

# 将日期列设置为索引
df.set_index('日期', inplace=True)

在这里插入图片描述

查看索引:
在这里插入图片描述

转换 最高温 列:

# 将最高温中的°去掉,并将该列转换为int类型
df['最高温'] = df['最高温'].str.replace('°', '').astype(int)

在这里插入图片描述

在这里插入图片描述

按月进行采样,计算每个月最高温的平均值:

# 按月进行采样,计算每个月最高温的平均值
df = df[['最高温']].resample('ME').mean()

查看前几条数据:
在这里插入图片描述

查看索引:
在这里插入图片描述

画图:
在这里插入图片描述

方法1:pandas.Series.pct_change

注意:虽然这个方法的名字听起来像是计算百分比变化,但实际上它计算的是分数变化(也称为每单位变化或相对变化)。如果你需要百分比变化,请将这些值乘以100。

# 计算同比、环比方法1
df['最高温平均_环比_方法1'] = df['最高温'].pct_change(periods=1)
df['最高温平均_同比_方法1'] = df['最高温'].pct_change(periods=12)

在这里插入图片描述

方法2:pandas.Series.shift

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

先看shift有什么效果:

# 观察shift有什么作用
pd.concat([df['最高温'], 
           df['最高温'].shift(periods=1), 
           df['最高温'].shift(periods=12)], 
          axis=1).head(15)

结果:
在这里插入图片描述

下面计算环比和同比:

# 计算环比
series_shift1 = df['最高温'].shift(periods=1)
df['最高温平均_环比_方法2'] = (df['最高温'] - series_shift1) / series_shift1

# 计算同比
series_shift12 = df['最高温'].shift(periods=12)
df['最高温平均_同比_方法2'] = (df['最高温'] - series_shift12) / series_shift12

看结果的前几行:
在这里插入图片描述

方法3:pandas.Series.diff

pandas.Series.diff的作用是计算pandas.Series对象中元素与前一个元素(或指定周期的元素)之间的差值。

先直观地感觉下pandas.Series.diff做了什么事情:

# 看看pandas.Series.diff的作用
pd.concat([
    df['最高温'],
    df['最高温'].diff(periods=1),
    df['最高温'].diff(periods=12)
], axis=1).head(15)

在这里插入图片描述

计算环比和同比:

# 计算环比
series_diff1 = df['最高温'].diff(periods=1)
df['最高温平均_环比_方法3'] = series_diff1 / (df['最高温'] - series_diff1)

# 计算同比
series_diff12 = df['最高温'].diff(periods=12)
df['最高温平均_同比_方法3'] = series_diff12 / (df['最高温'] - series_diff12)

查看结果的前几行:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值