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

如何使用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. 循环遍历滞后阶数1到num_lags,通过shift(i)生成对应滞后特征,并用insert保证大阶数的滞后特征列排在前面,最终列顺序与目标一致;
  2. 合并原始数据后,dropna会自动移除因滞后产生的NaN行,得到的有效行数与目标一致;
  3. 仅对最后一列(标签列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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 14:43:26