阶段4Python 基础进阶●●●●●

缺失值处理:dropna/ffill/fillna的决策树

我的掌握程度:
q-316精讲

先掌握这个答案

决策树三问:①NaN的成因?(停牌/未披露/计算窗口不足/真实缺失)②它将进入什么计算?(分组/回归/树模型对NaN容忍度不同)③处理后是否引入偏差?处理映射:行情价格类停牌→标记suspended+ffill(分析用)+禁交易(回测用);财务未披露→保持NaN让下游显式处理(或ffill自上次公告——含义="沿用旧值");因子计算窗不足→保留NaN(新股票本就没有20日历史);横截面标准化缺失→填横截面中位数(中性,不制造假信号)。绝对禁止:无脑dropna(破坏面板结构)、fillna(0)用于可正可负的因子(0往往有含义)。

先读结论,再核对下方使用边界;数字例题为教学情景,涉及实际行情与规则时请核对原始来源。

从理解到使用

填充前先解释为什么缺失

停牌、未披露、窗口不足、接口失败应分别标记。沿用上一值不等于当日可交易;bfill可能把未来信息带回过去。中位数填充也会改变分布,需在训练范围内估计并做敏感性比较。

先赢过一个简单基线

固定数据与验证,比较等权、线性模型或朴素预测,再评估复杂模型的边际收益。记录重训练频率、预测延迟、漂移和费用;更高拟合分数不等于更高净收益。

本阶段实战方法 · 一条能复现的数据流水线

把接口返回的数据变成可用于因子研究的面板时,先处理时点、主键与单位。

  1. 建立数据字典:字段、单位、时区、交易日历、数据源、抓取时间、原始价与复权因子。
  2. 用(date, code)查重,区分停牌、未上市、窗口不足和真实缺失;不要用向后填充把未来值带回过去。
  3. 保存原始快照与清洗日志,固定随机种子和环境版本;接口字段变化时先核对官方文档。

使用边界

  • 报告期不等于公告可用日,盘后公告通常不能用于当天收盘前决策。
  • API输出名为“动态市盈率”时不能直接改名TTM;浏览器练习不支持任意原生库或行情抓取接口。
背景 · 从一个困惑说起
rolling开了NaN、停牌留了NaN、财务没公告是NaN、rank掉出NaN——数据工作里你永远在和NaN打交道。新手一把dropna()了事,老手先问:这个NaN是"没有"、"还没"、还是"不该有"?三种含义对应三种处理。
由此产生的问题
缺失值处理的决策树是什么?ffill的危险边界(q-317的预防针)?fillna(0/中位数)各自的适用场景?
核心概念
决策树三问:①NaN的成因?(停牌/未披露/计算窗口不足/真实缺失)②它将进入什么计算?(分组/回归/树模型对NaN容忍度不同)③处理后是否引入偏差?处理映射:行情价格类停牌→标记suspended+ffill(分析用)+禁交易(回测用);财务未披露→保持NaN让下游显式处理(或ffill自上次公告——含义="沿用旧值");因子计算窗不足→保留NaN(新股票本就没有20日历史);横截面标准化缺失→填横截面中位数(中性,不制造假信号)。绝对禁止:无脑dropna(破坏面板结构)、fillna(0)用于可正可负的因子(0往往有含义)。
为什么需要它
①缺失处理=隐含假设:ffill假设"不变"、填中位数假设"平庸"、drop假设"不存在"——每种假设都在悄悄改变研究结论;②面板完整性:dropna删掉某股某天后,该股的rolling全部错位——修复成本远大于当初省的脑子;③树模型的宽容:LightGBM原生处理NaN(学出"缺失走哪边")——ML场景可以少填,统计回归场景必须处理——工具决定策略。
实际应用场景
标准流程:先统计NaN分布(df.isna().mean()按列/按时间)→按成因分类→按映射表处理→处理日志记录(哪列用了什么策略、影响多少行)——与清洗日志(q-065)同卷归档。
与之前知识的联系
q-065/066(阶段1脏数据/停牌处理)的方法论落地为代码决策;q-317(ffill的危险)是本题的一个分支专讲;q-351(缺失因子值)的横截面填充是因子场景的标准答案。
⚠ 常见误解
  • dropna最干净:面板里它=随机删除时间片+错位后续窗口;只有"整行确实无效"(如非交易日行)才配drop
  • fillna(0)万能:因子值0常是"中不溜"或有特殊含义的位置——填0等于伪造观点;中位数/NaN保留通常更诚实
  • 模型会自己处理NaN:只有部分树模型会;回归/标准化/聚类会报错或传播NaN——先弄清下游的脾气再决定

🤖 AI导师

导师会先检查你的前置知识(缺失的成因、rolling的NaN),再用案例、公式和代码帮助理解。此功能需要先启用服务。