Pandas数据填充(fill)中的那些坑:避免机器学习中的数据泄露

ops/2025/2/13 5:10:16/

1. 问题背景

在处理时间序列数据时,经常会遇到缺失值需要填充。Pandas提供了ffill(forward fill)和bfill(backward fill)两种填充方式,但使用不当可能会导致数据泄露,特别是在进行机器学习预测时。

2. 填充方式解析

2.1 基本概念

  • ffill(forward fill): 用前面的值填充后面的空值
  • bfill(backward fill): 用后面的值填充前面的空值

2.2 实例说明

import pandas as pd# 示例数据
df = pd.DataFrame({'date': ['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04'],'price': [100, None, None, 200]
})# 查看原始数据
print("原始数据:")
print(df)
"""date  price
0  2023-01-01  100.0
1  2023-01-02    NaN
2  2023-01-03    NaN
3  2023-01-04  200.0
"""# 使用ffill
df_ffill = df.copy()
df_ffill['price'] = df_ffill['price'].ffill()
print("\nffill填充结果:")
print(df_ffill)
"""date  price
0  2023-01-01  100.0
1  2023-01-02  100.0  # 使用之前的100
2  2023-01-03  100.0  # 使用之前的100
3  2023-01-04  200.0
"""# 使用bfill
df_bfill = df.copy()
df_bfill['price'] = df_bfill['price'].bfill()
print("\nbfill填充结果:")
print(df_bfill)
"""date  price
0  2023-01-01  100.0
1  2023-01-02  200.0  # 使用了未来的200!
2  2023-01-03  200.0  # 使用了未来的200!
3  2023-01-04  200.0
"""

3. 数据泄露风险

3.1 什么是数据泄露?

在时间序列预测中,数据泄露指模型在训练时看到了未来的数据。这会导致模型性能被过分高估,在实际预测时表现不佳。

3.2 为什么bfill会导致数据泄露?

使用bfill时,我们用未来的值填充了当前的缺失值,这在实际预测场景中是不可能的,因为我们不可能知道未来的价格。

4. 正确的处理方式

4.1 基本步骤

# 1. 确保时间正确排序
df = df.sort_values(['market_code', 'report_time'])# 2. 使用ffill进行填充
df['price'] = df.groupby('market_code')['price'].ffill()

4.2 注意事项

  1. 排序很重要:ffill/bfill是基于数据的物理顺序进行的
  2. 分组处理:如果有多个市场,要按市场分组后再填充
  3. 始终使用ffill:确保只使用历史数据进行填充

5. 实际应用场景示例

# 市场价格数据处理示例
def prepare_market_data(df):"""准备市场数据,避免数据泄露"""# 1. 确保时间格式正确df['report_time'] = pd.to_datetime(df['report_time'])# 2. 按市场和时间排序df = df.sort_values(['market_code', 'report_time'])# 3. 使用ffill填充缺失价格df['price'] = df.groupby('market_code')['price'].ffill()return df

6. 总结

  1. 时间序列数据处理要特别注意避免数据泄露
  2. 始终确保数据按时间正确排序
  3. 使用ffill而不是bfill进行填充
  4. 在分组数据中,要按组进行填充

http://www.ppmy.cn/ops/157963.html

相关文章

objectArx2016使用python3.9.7配置实践

写在前面: 笔者有一些python代码, 需要结合到cad二次开发的项目中,并使用embed版本进行发布.记录一下配置过程,并加些分析,以备后期查用. ObjectArx配置Python 零 着重提醒一 Python安装版本和embed版本1.1 下载1.2 安装版本的设置1)安装参数设置2)安装版本Python内重要文件 1.…

机器学习中过拟合和欠拟合问题处理方法总结

目录 一、背景二、过拟合(Overfitting)2.1 基本概念2.2 过拟合4个最主要的特征2.3 防止过拟合的11个有效方法 三、欠拟合(Underfitting)3.1 基本概念3.2 欠拟合的4个特征3.3 防止欠拟合的11个有效方法 四、总结五、参考资料 一、背景 在机器学习模型训练…

【Elasticsearch】bucket_sort

Elasticsearch 的bucket_sort聚合是一种管道聚合,用于对父多桶聚合(如terms、date_histogram、histogram等)的桶进行排序。以下是关于bucket_sort的详细说明: 1.基本功能 bucket_sort聚合可以对父聚合返回的桶进行排序&#xff…

基于 GEE 利用插值方法填补缺失影像

目录 1 完整代码 2 运行结果 利用GEE合成NDVI时,如果研究区较大,一个月的影像覆盖不了整个研究区,就会有缺失的地方,还有就是去云之后,有云量的地区变成空值。 所以今天来用一种插值的方法来填补缺失的影像&#xf…

企业如何利用DeepSeek提升网络安全管理水平

企业可以通过深度整合DeepSeek的AI能力,构建智能化、动态化的网络安全防御体系,以应对APT(高级持续性威胁)等复杂攻击。以下是具体策略与实践路径: 1. AI驱动的威胁检测与分析 多模态威胁狩猎 DeepSeek的深度学习技术能…

计算机视觉-拟合

一、拟合 拟合的作用主要是给物体有一个更好的描述 根据任务选择对应的方法(最小二乘,全最小二乘,鲁棒最小二乘,RANSAC) 边缘提取只能告诉边,但是给不出来数学描述(应该告诉这个点线是谁的&a…

游戏引擎学习第93天

回顾并推动进展 我们上一期的进展是,我们第一次开始填充可以任意旋转和缩放的固体形状。接下来我们希望继续推进图形功能,能够支持更多的特性,以便拥有一个真正的渲染器。 目前的目标是开始填充这些形状,并能够支持旋转、缩放&a…

传输层协议 UDP 与 TCP

🌈 个人主页:Zfox_ 🔥 系列专栏:Linux 目录 一:🔥 前置复盘🦋 传输层🦋 再谈端口号🦋 端口号范围划分🦋 认识知名端口号 (Well-Know Port Number) 二&#xf…