基础入门
围绕收益率列首行空值这一最典型场景,练习缺失值统计、识别和最小清理动作,建立先看清问题再处理数据的基础习惯。
第 4 讲只解决一个非常现实的问题:表里出现空值以后,先怎么处理,才不会让后面的计算一路连锁出错。到第 3 讲为止,你手上的 work_df 已经有了 return 列,而它的第一行天然就会是空值。这正好是学习缺失值处理的最好入口。
学完这一讲后,你可以直接完成下面几件事:
金融数据里空值并不稀奇。它可能来自原始数据缺失,也可能来自你自己新增列之后的自然结果。比如第 3 讲的收益率列第一行为空,就是一个最典型的例子。真正的问题不是“空值能不能完全消失”,而是:你知不知道这些空值从哪里来,以及现在该怎么处理它们。
如果这一步跳过,后面的排序、均线和月份统计,很容易在你没注意的时候继续带着空值往下传,最后让结果变得难解释。
print(work_df[['date', 'close', 'volume', 'return']].head())
现在最关键的是,你已经能在 return 列里看到至少一个非常典型的空值。第 4 讲就从这个最容易解释的例子开始。
第 4 讲最好不要跳步骤。先统计、再识别、后处理、最后复查,这样每一次删行都知道自己为什么删。
print(work_df.isna().sum())
这是第 4 讲最先要养成的动作。不要一看到空值就立刻删,先数一遍每列到底有多少,问题才会变得具体。
对当前这一讲来说,最常见的预期内空值,就是 return 第一行为空。你可以专门看它:
print(work_df[['date', 'return']].head())
这一步的意义在于,它能帮你区分“收益率首行为空”这种正常情况,和“中间大量缺失”这种更值得追问的情况。
当前最朴素也最合适的做法,是直接把 return 为空的行先删掉:
clean_df = work_df.dropna(subset=['return']).copy()
print(clean_df.head())
对第 4 讲来说,这一步足够了。因为你现在最关心的是“后面还要继续用收益率列”,所以把 return 为空的行先去掉,是最容易解释的处理方式。
print(clean_df.isna().sum())
处理完以后再数一遍,是为了确认你做的动作确实起了作用,而不是以为删掉了,实际上问题还在。
处理完缺失值以后,至少要能回答两个问题:空值是不是少了,以及删掉的到底是哪一类行。下面这几条检查就是围绕这两点展开的。
assert work_df.isna().sum().sum() >= 1
assert clean_df['return'].notna().all()
assert len(clean_df) > 0
print(work_df.shape)
print(clean_df.shape)
你应该能清楚说明:减少的那几行为什么会被删掉。
第一次处理空值时,最容易走向两个极端:全部删掉,或者一股脑全部填上。更稳的办法,是先分清空值来源,再决定动作。
不一定。像 pct_change() 生成的首行空值,本来就是计算逻辑的一部分。
因为第 4 讲要先建立最朴素、最容易解释的处理方式。对收益率首行这种情况,直接删掉通常比硬填成 0 更稳。
先分别统计、分别判断,不要把所有空值一股脑处理成同一种情况。第 4 讲最想训练的就是这种分层意识。
建议保留。和前几讲一样,原表更像输入,中间清理后的 clean_df 才是接下来要继续用的工作表。
return 为空的那一行,也完全可以。clean_df 作为后面几讲的新起点。import pandas as pd
def drop_empty_returns(df: pd.DataFrame) -> pd.DataFrame:
out = df.copy()
return out.dropna(subset=['return'])
clean_df = drop_empty_returns(work_df)
print(clean_df.head())
第 4 讲还有一个很值得保留的小习惯,就是在真正删除前,先把问题样本看一眼。哪怕只多写两行代码,也能让你的处理动作更可解释:
bad_rows = work_df[work_df['return'].isna()]
print(bad_rows)
这样做的好处是,你不会只知道“我删过数据”,而是能明确知道“我删掉的是哪几行、为什么删”。对入门者来说,这比一开始就追求更复杂的填充策略更重要。
缺失值处理最容易犯的错,就是还没看清问题就先下手。第 4 讲要你先统计、再判断、最后处理,目的就是把这个顺序固定下来。以后你面对更复杂的空值场景,也还是沿着这条路径走,而不是凭感觉删。
如果你现在已经能先统计空值、明确 return 首行为空是正常结果、再把这类行干净地处理掉,那第 4 讲就算完成。
本讲是《pandas金融数据入门短课》的第 4/8 讲,当前主题是《处理缺失值》。
上一讲:第 3 讲《新增收益率列》。
下一讲:第 5 讲《排序并重置索引》。
后续安排:第 6 讲《计算5日和10日均线》;第 7 讲《按月份统计平均收益》。
风险揭示与免责声明
本页面内容仅用于量化研究与技术交流,旨在展示研究方法与流程,不构成对任何金融产品、证券或衍生品的要约、招揽、推荐或保证。
本文所涉历史数据、回测结果与示例参数不代表未来表现,也不应作为投资决策依据。
市场存在波动、流动性与执行偏差等不确定性,任何策略均可能出现收益波动或阶段性失效。
读者应结合自身风险承受能力进行独立判断,并在必要时咨询持牌专业机构意见。