如何使用Pandas基于滞后值创建特征?代码正确性与优化咨询
代码正确性验证与优化建议
需求回顾
原始CSV数据:
f1, f2, f3, t a1, b1, c1, t1 a2, b2, c2, t2 a3, b3, c3, t3 a4, b4, c4, t4 a5, b5, c5, t5 a6, b6, c6, t6 a7, b7, c7, t7 a8, b8, c8, t8
目标生成的数据集:
f1_lag_2, f2_lag_2, f3_lag_2, f1_lag_1, f2_lag_1, f3_lag_1, f1, f2, f3, t a1, b1, c1, a2, b2, c2, a3, b3, c3, t3 a2, b2, c2, a3, b3, c3, a4, b4, c4, t4 a3, b3, c3, a4, b4, c4, a5, b5, c5, t5 a4, b4, c4, a5, b5, c5, a6, b6, c6, t6 a5, b5, c5, a6, b6, c6, a7, b7, c7, t7 a6, b6, c6, a7, b7, c7, a8, b8, c8, t8
代码正确性分析
你编写的函数是正确的,当调用lag_variables_to_features(df, num_lags=2)时,能够生成符合要求的数据集:
- 循环遍历滞后阶数1到num_lags,通过
shift(i)生成对应滞后特征,并用insert保证大阶数的滞后特征列排在前面,最终列顺序与目标一致; - 合并原始数据后,
dropna会自动移除因滞后产生的NaN行,得到的有效行数与目标一致; - 仅对最后一列(标签列
t)以外的特征生成滞后,符合需求。
优化实现方式
原代码的循环insert操作在数据量较大、列数较多时效率较低,且代码可以更简洁。推荐以下优化方案:
import pandas as pd def lag_variables_to_features(df, num_lags=1): # 按滞后阶数从大到小生成特征,保证列顺序符合要求 lagged_features = [] for lag in range(num_lags, 0, -1): # 对特征列生成滞后,并批量重命名列名 lagged_df = df.iloc[:, :-1].shift(lag).rename( columns=lambda col: f"{col}_lag_{lag}" ) lagged_features.append(lagged_df) # 合并所有滞后特征与原始数据,删除含NaN的行 result_df = pd.concat(lagged_features + [df], axis=1).dropna() return result_df
优化点说明
- 避免频繁
insert操作:直接生成完整的滞后特征DataFrame再合并,比循环插入列的效率更高; - 代码更简洁:用
rename批量处理列名,减少嵌套循环的复杂度; - 逻辑更清晰:按从大到小的顺序生成滞后特征,直观保证列顺序符合需求。
内容的提问来源于stack exchange,提问作者Irshad
相关产品推荐
相关产品推荐

