You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 03:09:42