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

布尔索引:数据筛选的"条件语句"艺术

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

先掌握这个答案

核心语法:mask=df['pe']>0(得到True/False列)→df[mask](只留True行)。组合逻辑:&与、|或、~非(必须加括号:df[(a>0)&(b<10)]——and/or会报错)。兄弟工具:isin(多值匹配:df[df['code'].isin(pool)])、query(字符串条件:df.query('pe>0 and mktcap<1e10'),大数据时更快)、where(保留形状、不满足处置NaN——适合因子加工而非筛选行)。相比循环:一次生成整个掩码(向量化),既快又不会漏边界。

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

从理解到使用

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

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

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

使用边界

  • 报告期不等于公告可用日,盘后公告通常不能用于当天收盘前决策。
  • API输出名为“动态市盈率”时不能直接改名TTM;浏览器练习不支持任意原生库或行情抓取接口。
背景 · 从一个困惑说起
数据工作的日常一半是筛选:剔除ST、只要市值前500、找换手率异常的日子……SQL用WHERE,Excel用筛选器,pandas用布尔索引——一个True/False的掩码直接放在方括号里。
由此产生的问题
布尔索引的语法与组合逻辑?isin/query/where各自的适用场景?与循环筛选相比的本质优势?
核心概念
核心语法:mask=df['pe']>0(得到True/False列)→df[mask](只留True行)。组合逻辑:&与、|或、~非(必须加括号:df[(a>0)&(b<10)]——and/or会报错)。兄弟工具:isin(多值匹配:df[df['code'].isin(pool)])、query(字符串条件:df.query('pe>0 and mktcap<1e10'),大数据时更快)、where(保留形状、不满足处置NaN——适合因子加工而非筛选行)。相比循环:一次生成整个掩码(向量化),既快又不会漏边界。
为什么需要它
①股票池构造的全部语法:三件套过滤(剔ST/新股/停牌)每一条都是一个布尔条件——阶段4最常用的五行代码;②掩码思维的可组合性:条件是值(可存储、可复用、可统计——过滤了多少只?mask.mean()即知);③可读性:布尔表达式就是研究意图的直接书写("pe>0且非ST且上市超半年"),比循环收集可审计得多。
实际应用场景
标准过滤链:mask = (~name.str.contains('ST')) & (~name.str.contains('退')) & (list_days>120) & (volume>0) → pool = df[mask];每步打印mask.mean()监控过滤强度(一次剔掉80%就要警惕逻辑错误)。
与之前知识的联系
q-341-344(选股池系列)的语法基础;q-070/065的清洗动作全部以布尔索引实现;速度对比呼应q-304。
⚠ 常见误解
  • 用and/or连接条件:pandas要求&/|/~且每个条件加括号——and会直接报错(这是设计:防止整列的模糊布尔)
  • 筛选后原表也变了:布尔索引返回副本(副本警告见q-375)——要保留结果请赋值给新变量
  • query只是语法糖:大数据时它比布尔索引快(numexpr引擎)——千万行级别值得切换

🤖 AI导师

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