时间序列模型验证集特定格式滞后项生成实现求助
解决方案:生成验证集时间序列滞后项
问题分析
你需要为验证集生成特定格式的滞后项:首行使用训练集末尾的真实值(按最新到最旧对应lag_q1到lag_qn),后续每行向左空出一列,保留可由真实值推导的部分,空列用于后续填充预测值。之前的代码仅处理了首行,未覆盖后续行的填充逻辑。
实现代码
import pandas as pd # 假设n是你的滞后项数量(示例中n=5) n = 5 # 提取训练集末尾n个quantity值,反转顺序让最新值排在最前 train_last_vals = df_train['quantity'].tail(n).values[::-1] # 构建验证集滞后项数据 val_lag_rows = [] # 这里假设验证集行数等于滞后项数量,可替换为实际验证集行数 for row_num in range(len(train_last_vals)): current_row = [] for col_num in range(n): # 列索引 >= 行索引时,填充对应真实值,否则留空 if col_num >= row_num: current_row.append(train_last_vals[col_num - row_num]) else: current_row.append('') # 若需要用NaN填充,替换为pd.NA或np.nan val_lag_rows.append(current_row) # 转换为DataFrame并设置列名 lag_columns = [f'lag_q{i+1}' for i in range(n)] df_val = pd.DataFrame(val_lag_rows, columns=lag_columns)
代码说明
- 提取并反转训练集末尾值:
df_train['quantity'].tail(n).values[::-1]获取训练集最后n个quantity,反转后让最新的数值(训练集最后一行)对应首行的lag_q1,以此类推。 - 逐行构建滞后项:通过双重循环,对每一行
row_num,仅填充列索引col_num >= row_num的位置,确保每行向左空出对应数量的列,符合你需要的格式。 - 生成验证集DataFrame:将构建好的行数据转换为DataFrame,设置对应的滞后列名。
适配分组场景
如果你的数据是按['strain','sex','genotype']分组处理的(如训练集代码所示),只需在提取训练集末尾值时加入分组逻辑:
# 按分组提取每个组的最后n个quantity值 grouped_train = df_train.groupby(['strain','sex','genotype'], dropna=False)['quantity'] train_group_lags = grouped_train.tail(n) # 后续针对每个组生成对应的验证集滞后项,逻辑与上述一致,需循环处理每个组 for (strain, sex, genotype), group_vals in train_group_lags.groupby(level=[0,1,2]): # 复用前面的行构建逻辑生成当前组的验证集滞后项 group_last_vals = group_vals.values[::-1] # ... 后续代码同基础版
内容的提问来源于stack exchange,提问作者Alejandra
相关产品推荐
相关产品推荐

