如何按field_name分组创建无NA值的n年adjusted_price滞后变量
按field_name分组生成严格年份匹配的8期价格滞后变量方案
核心规则落地要求:所有滞后项必须基于年份差值匹配,不能依赖行顺序偏移,避免因年份断档、行排序错误导致值错位。
Python (Pandas) 实现
import pandas as pd # 前置校验:确保同分组下每个年份仅对应一条价格记录,避免匹配冲突 if df.duplicated(subset=['field_name', 'year']).any(): raise ValueError("存在同field_name下同一年份多条记录,请先清洗原始数据") # 批量生成lag1-lag8 for lag_n in range(1, 9): df[f'lag{lag_n}'] = df.apply( lambda x: df.loc[ (df['field_name'] == x['field_name']) & (df['year'] == x['year'] - lag_n), 'adjusted_price' ].iloc[0], axis=1 ) # 结果校验:确认无缺失值 lag_cols = [f'lag{i}' for i in range(1,9)] if df[lag_cols].isna().any().any(): raise ValueError("滞后项存在NA,请检查前置历史价格数据是否补全")
R (dplyr/tidyverse) 实现
library(dplyr) # 前置校验:同分组下无重复年份 if(any(duplicated(df[, c("field_name", "year")]))) { stop("存在同field_name下同一年份多条记录,请先清洗原始数据") } # 批量匹配生成lag1-lag8 for (n in 1:8) { # 构造匹配参照表:分组 + (年份 + n) 对应n年前的价格 ref_table <- df %>% transmute( field_name, match_year = year + n, lag_value = adjusted_price ) # 关联回原表填充对应滞后项 df <- df %>% left_join( ref_table, by = c("field_name" = "field_name", "year" = "match_year") ) %>% rename(!!paste0("lag", n) := lag_value) } # 结果校验:确认无缺失值 lag_cols <- paste0("lag", 1:8) if(any(is.na(df[, lag_cols]))) { stop("滞后项存在NA,请检查前置历史价格数据是否补全") }
注意事项
- 禁止直接使用
pandas.shift()、dplyr::lag()这类按行号偏移的函数生成滞后项:这类函数默认取当前行往上第N行的值,一旦数据行顺序错乱、存在年份断档,就会出现匹配错位,不符合「年份X严格对应X-N年价格」的要求。 - 提前补全的1971年往前8年以上的历史数据会被自动匹配,不需要额外做切片处理,首个观测年份(1971)的8个滞后项会自动关联到1963-1970年的对应价格,不会产生NA。
内容的提问来源于stack exchange,提问作者Wolfstreet23
相关产品推荐
相关产品推荐

