如何使用Pandas高效计算历史同期数据及变化率

来源:图像处理网作者:下班再修头衔:程序员
导读:本期聚焦于小伙伴创作的《如何使用Pandas高效计算历史同期数据及变化率》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何使用Pandas高效计算历史同期数据及变化率》有用,将其分享出去将是对创作者最好的鼓励。

在业务数据分析中,经常需要对比当前周期与历史同期的数据差异,比如计算月度销售额的同比变化、周度活跃用户的环比变化等,这类需求可以通过Pandas的相关功能高效实现。Pandas内置了时间序列处理工具,配合分组、偏移操作,能够快速完成历史同期数据匹配和变化率计算。

如何使用Pandas高效计算历史同期数据及变化率

基础数据准备

首先构造一份带时间维度的示例数据集,包含日期、类别和数值三个字段,后续的计算都基于这份数据展开。

import pandas as pd
import numpy as np

# 构造示例数据,时间范围为2023年1月到2024年6月,每月一条记录,两个类别
date_rng = pd.date_range(start='2023-01-01', end='2024-06-30', freq='MS')
data = {
    'date': np.tile(date_rng, 2),
    'category': ['A'] * len(date_rng) + ['B'] * len(date_rng),
    'value': np.random.randint(100, 500, size=len(date_rng)*2)
}
df = pd.DataFrame(data)
# 将date列设置为 datetime 类型
df['date'] = pd.to_datetime(df['date'])
print(df.head(10))

计算历史同期数据的核心方法

同比历史同期计算

同比通常指与上年同一时期的数据对比,比如2024年3月的同比是2023年3月的数据。可以通过pd.DateOffset实现时间偏移,匹配对应的历史同期记录。

# 计算同比历史同期数据,偏移一年
df['last_year_same_period'] = df['date'] - pd.DateOffset(years=1)
# 通过merge匹配历史同期的数值,先构造历史数据的映射表
history_df = df[['date', 'category', 'value']].copy()
history_df = history_df.rename(columns={'date': 'last_year_same_period', 'value': 'last_year_value'})
# 关联获取历史同期数值
df = pd.merge(df, history_df, on=['last_year_same_period', 'category'], how='left')
print(df[df['date'] >= '2024-01-01'].head(5))

环比历史同期计算

环比通常指与上一个相邻周期的数据对比,比如月度环比是上月数据,周度环比是上周数据。这里以月度环比为例,偏移一个月即可。

# 计算环比历史同期数据,偏移一个月
df['last_month_same_period'] = df['date'] - pd.DateOffset(months=1)
history_month_df = df[['date', 'category', 'value']].copy()
history_month_df = history_month_df.rename(columns={'date': 'last_month_same_period', 'value': 'last_month_value'})
df = pd.merge(df, history_month_df, on=['last_month_same_period', 'category'], how='left')
print(df[df['date'] >= '2023-02-01'].head(5))

变化率计算逻辑

变化率的计算公式为:(当前值 - 历史同期值) / 历史同期值 * 100%,如果历史同期值为0,变化率可以设置为空值或者自定义标识。

# 计算同比变化率
df['yoy_change_rate'] = np.where(
    df['last_year_value'].notna() & (df['last_year_value'] != 0),
    (df['value'] - df['last_year_value']) / df['last_year_value'] * 100,
    np.nan
)
# 计算环比变化率
df['mom_change_rate'] = np.where(
    df['last_month_value'].notna() & (df['last_month_value'] != 0),
    (df['value'] - df['last_month_value']) / df['last_month_value'] * 100,
    np.nan
)
# 查看最终结果
print(df[['date', 'category', 'value', 'last_year_value', 'yoy_change_rate', 'last_month_value', 'mom_change_rate']].tail(10))

分组场景下的高效计算

如果数据存在多个分组维度,比如上面的category字段,也可以直接通过分组后使用shift方法实现偏移,避免多次merge,提升计算效率。

# 按类别分组,计算同比偏移(每年12个月,偏移12位就是上年同期)
df_sorted = df.sort_values(['category', 'date']).reset_index(drop=True)
df_sorted['group_last_year_value'] = df_sorted.groupby('category')['value'].shift(12)
df_sorted['group_yoy_change_rate'] = np.where(
    df_sorted['group_last_year_value'].notna() & (df_sorted['group_last_year_value'] != 0),
    (df_sorted['value'] - df_sorted['group_last_year_value']) / df_sorted['group_last_year_value'] * 100,
    np.nan
)
print(df_sorted[['date', 'category', 'value', 'group_last_year_value', 'group_yoy_change_rate']].tail(10))

注意事项

  • 时间偏移前需要确保日期列是datetime类型,否则会报错。
  • 如果数据存在缺失周期,比如某个月没有记录,shift方法会匹配到空值,需要根据业务场景补充缺失数据或者过滤空值。
  • 变化率计算时要处理历史同期值为0或者空值的情况,避免除零错误。
  • 大批量数据计算时,优先使用分组shift的方式,比多次merge的效率更高。

Pandas历史同期数据计算变化率计算数据分组时间序列处理修改时间:2026-07-20 13:00:29

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。