如何计算DataFrame中股票当年值与前一年同期值的差值并新增列存储
实现思路与代码
原代码存在的问题
df.loc()写法错误,pandas的loc索引需使用方括号,正确写法为df.loc[i, j]- relativedelta不是datetime对象的内置方法,需要从dateutil库导入后单独调用,正确写法为
relativedelta(df.index[i], years=-1) - 双重循环遍历效率极低,pandas内置的向量化操作可更简洁高效实现需求
正确实现步骤
第一步:预处理数据
首先确保DataFrame的日期索引为datetime类型,避免后续时间操作报错:
import pandas as pd # 转换索引为datetime类型 df.index = pd.to_datetime(df.index)
第二步:计算同期差值
按日期的月、日分组后偏移1年,自动匹配去年同期的数值,直接计算差值后生成新增列即可:
# 匹配去年同期数值,自动适配闰年等特殊日期问题 last_year_data = df.groupby([df.index.month, df.index.day]).shift(1) # 生成差值新增列,列名规则为原股票名+_同比差值 df[[f"{col}_同比差值" for col in df.columns]] = df - last_year_data
如果你的数据是每年固定频次统计(比如每年只有1月1日的数据),可以用更简化的写法:
df[[f"{col}_同比差值" for col in df.columns]] = df - df.shift(1, freq='YS')
效果验证
以你给出的示例数据测试,输出结果如下:
| 日期 | A | B | A_同比差值 | B_同比差值 |
|---|---|---|---|---|
| 1990-01-01 | 3.678 | 2.11 | NaN | NaN |
| 1991-01-01 | 3.81 | 2.35 | 0.132 | 0.24 |
| 1992-01-01 | 4.02 | 2.59 | 0.21 | 0.24 |
1991-01-01的A列差值0.132和你举例的计算结果完全一致。
内容的提问来源于stack exchange,提问作者Mariana Maya
相关产品推荐
相关产品推荐

