
本教程详细介绍了如何利用pandas库高效地计算dataframe中指定历史周期的数值,并进一步计算绝对变化量和百分比变化量。通过结合`pd.dateoffset`进行日期偏移和`merge`操作,我们能够精确地获取任意月份前的同期数据,从而克服`pct_change()`等方法的局限性,实现灵活且专业的时序数据分析。
在数据分析领域,比较当前数据与历史同期数据是常见的需求,例如分析月度环比、年度同比等。Pandas库提供了强大的时间序列处理能力,但有时简单的百分比变化(如.pct_change())并不能满足获取精确历史同期值的需求。本教程将详细讲解如何构建一个健壮的Pandas解决方案,以获取指定月份前的历史同期数据,并计算相应的绝对和相对变化。
要获取历史同期数据,我们需要解决两个关键问题:
Pandas的pd.DateOffset和merge操作是解决这两个问题的核心工具。
首先,我们准备一份示例数据集,其中包含URL、关键词、流量和日期信息。
import pandas as pd import io # 示例输入数据 INPUT_CSV = """ URL,Organic Keywords,Organic Traffic,Date https://www.example-url.com/,1315,11345,20231115 https://www.example-url.com/,1183,5646,20231015 https://www.example-url.com/,869,5095,20230915 https://www.example-url.com/,925,4574,20230815 https://www.example-url.com/,899,4580,20230715 https://www.example-url.com/,1382,5720,20230615 https://www.example-url.com/,1171,5544,20230515 https://www.example-url.com/,1079,5041,20230415 https://www.example-url.com/,734,3855,20230315 https://www.example-url.com/,853,3455,20230215 https://www.example-url.com/,840,2343,20230115 https://www.example-url.com/,325,2318,20221215 https://www.example-url.com/,156,1981,20221115 https://www.example-url.com/,166,2059,20221015 https://www.example-url.com/,124,1977,20220915 https://www.example-url.com/,98,1919,20220815 https://www.example-url.com/,167,1796,20220715 https://www.example-url.com/,140,1596,20220615 https://www.example-url.com/,168,1493,20220515 https://www.example-url.com/,171,1058,20220415 https://www.example-url.com/,141,1735,20220315 https://www.example-url.com/,129,1836,20220215 https://www.example-url.com/,141,746,20220115 https://www.example-url.com/,129,1076,20211215 """ # 定义常量 INITIAL_COL_REORDER = ['URL', 'Date', 'Organic Keywords', 'Organic Traffic'] METRIC_COLS = ['Organic Keywords', 'Organic Traffic'] DIMENSION_COLS = ['URL'] DATE_COL = 'Date' PERIODS = [1, 3, 12] # 需要计算的同期月份数 # 读取CSV数据并进行初步处理 df = pd.read_csv(io.StringIO(INPUT_CSV)) df = df[INITIAL_COL_REORDER] # 重新排序列 df[DATE_COL] = pd.to_datetime(df[DATE_COL], format='%Y%m%d') # 转换日期格式 df = df.sort_values(by=DATE_COL, ascending=False) # 按日期降序排序
该函数将负责计算指定月份前的历史日期,并从原始DataFrame中匹配相应的指标值。
def get_last_period_values(df, months_prior, metric_cols, dimension_cols, date_col):
df_copy = df.copy() # 避免修改原始DataFrame
# 1. 计算历史日期
# 使用pd.DateOffset(months=months_prior)从当前日期减去指定月份
df_copy[f'{date_col}_Prior'] = df_copy[date_col] - pd.DateOffset(months=months_prior)
# 2. 合并历史数据
# 将DataFrame自身与自身进行合并,实现历史数据的查找
# left_on: 当前DataFrame中用于匹配的列(计算出的历史日期)
# right_on: 目标DataFrame中用于匹配的列(原始日期)
# suffixes: 用于区分合并后同名列的后缀
df_copy = df_copy.merge(
df_copy[[date_col] + dimension_cols + metric_cols],
left_on=f'{date_col}_Prior',
right_on=date_col,
how='left', # 使用左连接,保留所有当前日期的数据
suffixes=('', f'_{months_prior}mo_Prior') # 为历史数据列添加后缀
)
# 3. 清理辅助列
# 移除临时的历史日期列以及维度列在合并后产生的重复列
df_copy = df_copy.drop(columns=[f'{date_col}_Prior'] + [col + f'_{months_prior}mo_Prior' for col in dimension_cols])
# 4. 计算绝对变化量
for metric in metric_cols:
current_metric_col = metric
prior_metric_col = f'{metric}_{months_prior}mo_Prior'
df_copy[f'{metric}_{months_prior}mo_Abs_Change'] = df_copy[current_metric_col] - df_copy[prior_metric_col]
# 5. 计算百分比变化量
for metric in metric_cols:
current_metric_col = metric
prior_metric_col = f'{metric}_{months_prior}mo_Prior'
# 避免除以零,虽然Pandas会自动处理NaN/Inf
df_copy[f'{metric}_{months_prior}mo_Pct_Change'] = df_copy[current_metric_col] / df_copy[prior_metric_col] - 1
df_copy[f'{metric}_{months_prior}mo_Pct_Change'] = df_copy[f'{metric}_{months_prior}mo_Pct_Change'].round(2)
return df_copy函数详解:
为了方便地计算多个历史周期(例如1个月前、3个月前、12个月前),我们可以再封装一个函数。
def get_period_values(df, periods, metric_cols, dimension_cols, date_col):
df_copy = df.copy()
for period in periods:
df_copy = get_last_period_values(df_copy, period, metric_cols, dimension_cols, date_col)
return df_copy这个函数简单地迭代periods列表,对每个周期调用get_last_period_values函数,并将结果累积到df_copy中。
最后,将所有部分整合到主脚本中运行。
if __name__ == '__main__':
# ... (数据准备部分,已在前面展示) ...
# 假设df已经加载并预处理完毕
df = pd.read_csv(io.StringIO(INPUT_CSV))
df = df[INITIAL_COL_REORDER]
df[DATE_COL] = pd.to_datetime(df[DATE_COL], format='%Y%m%d')
df = df.sort_values(by=DATE_COL, ascending=False)
df_final = get_period_values(df, PERIODS, METRIC_COLS, DIMENSION_COLS, DATE_COL)
# 显示最终的DataFrame
print(df_final.to_string()) # 使用to_string()防止输出被截断运行上述代码,你将得到一个包含原始数据、1个月前、3个月前和12个月前同期数据,以及相应的绝对和百分比变化量的DataFrame。
通过本教程,我们学习了如何利用Pandas的pd.DateOffset和merge功能,构建一个高效且灵活的函数来获取DataFrame中任意指定月份的历史同期数据,并计算其绝对和百分比变化。这种方法比简单的.pct_change()更强大,因为它直接提供了历史同期值本身,为更深入的时序分析奠定了基础。掌握这一技术,将使你在处理复杂的业务数据分析时更加得心应手。
以上就是使用Pandas计算DataFrame中历史同期值的专业教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号