- 同比:是指与 去年同期 相比的数据变化情况。例如,今年第一季度与去年第一季度相比。
计算公式:
同比变化率=(本期值−去年同期值)/去年同期值 * 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)
查看结果的前几行: