feat(data): clean.py 四个函数落地;补测试、docstring 与 ruff 清理
src 由用户本人写(决策 25),Codex 只做审查、补测试与文档。 实现(用户): - clean_missing:按行/列删缺失过多的行,threshold 用 math.ceil 算 min_non_na (3 列、阈值 0.5 时必须是 2;写 int() 截断会漏删) - impute_missing / detect_outliers / winsorize(原属 L1,顺手落地) Codex 改的轻度项: - 按 §4.7 给四个函数补 Parameters / Returns / Raises(与 io.py 同一套 numpydoc 格式) - ruff 6 -> 1:导入分组(I001)、elif 链改 if 加末尾无条件 return(RET505/RET503)、 去掉多余 f 前缀(F541)、删掉只会被覆盖的 mask 初始化、去掉行尾空白(W293) - tests/test_data.py:新增 13 条 clean 行为测试 + 7 条 xfail 结果: - pytest 53 passed / 42 skipped / 7 xfailed(此前 40 / 44 / 0) - pyright 0 errors, 0 warnings - ruff 剩 1 条 SIM102,就在 detect_outliers 里那段待修的代码中,删掉即全绿 已知未修(详见 STATUS.md「下一步」): - detect_outliers 三个 bug:threshold 范围校验放错函数(iqr 分支 UnboundLocalError、 zscore 默认 3.0 被 [0,1] 拒掉)、quantile 在含文本列的表上崩、 is_series / is_ld_array 在 data 已转 DataFrame 之后才判断,因此永远为 False - winsorize 同样在含文本列的表上崩 - impute_missing 的 mode 分支就地修改调用方的表
This commit is contained in:
1 parent
97a2f95066
commit
c2595b6d07
4 files changed
+414
-36
No files matched your search
+21
-2
@@ -40,8 +40,19 @@
|
||||
非法类型必须抛 `TypeError`。配套在 `docs/03-roadmap.md` 的开发纪律里加了指针。
|
||||
- `docs/dev/personal-pitfalls.md`:个人易错点清单,**只追加、不通读**
|
||||
|
||||
### Fixed
|
||||
- 编辑器 / pyright 报"无法解析导入 numpy、pandas":分析器会去 PATH 上找 python,
|
||||
### Added
|
||||
- `data.clean`:四个函数落地(**由用户本人实现**)——`clean_missing`(L0 第 4 项)、
|
||||
`impute_missing` / `detect_outliers` / `winsorize`(原属 L1,顺手写了)。
|
||||
- `tests/test_data.py`:新增 13 条 clean 行为测试,覆盖 `clean_missing` 的阈值语义与轴向、
|
||||
`impute_missing` 的 mean/ffill/mode 与全 NaN 列、`winsorize` 的分位点与异常类型。
|
||||
- `tests/test_data.py`:另加 7 条 `xfail`,把**已知但未修的契约**钉在测试报告里(见 Notes)。
|
||||
|
||||
### Changed
|
||||
- `data.clean`:docstring 按 `docs/02-architecture.md` §4.7 补全 Parameters / Returns / Raises
|
||||
(Codex 代写,与 io.py 同一套 numpydoc 格式)。
|
||||
- `data.clean`:ruff 从 6 条清到 1 条——导入分组(I001)、elif 链改 if 加末尾无条件 return
|
||||
(RET505 / RET503)、去掉多余 f 前缀(F541)、删掉只会被覆盖的 mask 初始化(死代码)、
|
||||
去掉行尾空白(W293)。剩下的 1 条 SIM102 就在下面 Notes 那条待修的代码里,删掉它即全绿。:分析器会去 PATH 上找 python,
|
||||
本机 PATH 上只有 Codex 运行时的 3.14 shim(无科学栈),且 pyright 不认
|
||||
`pyvenv.cfg` 的 `include-system-site-packages`。
|
||||
改为 `[tool.pyright]` 指定 `venvPath = "."` / `venv = ".venv"` /
|
||||
@@ -62,6 +73,14 @@
|
||||
已把残骸目录改名禁用(**可逆**,未删除),详见 `docs/04-environment.md` 坑 6。
|
||||
|
||||
### Notes
|
||||
- `detect_outliers` **目前不可用**,三个 bug 已在 `tests/test_data.py` 里用 xfail 标出:
|
||||
threshold 范围校验放错了函数(iqr 分支 UnboundLocalError、zscore 分支默认 3.0 被 0<=t<=1 拒掉)、
|
||||
quantile 在含文本列的表上直接崩、is_series / is_ld_array 在数据已转成 DataFrame 之后才判断
|
||||
因此永远为 False(返回形状仍是 (n,1),与 docstring 承诺的「与原数据同形」不符)。
|
||||
修法与优先级见 `STATUS.md` 的「下一步」。
|
||||
- `winsorize` 与 `detect_outliers` 都还没能在含文本列的赛题表上跑通:分位数必须限制在数值列。
|
||||
- `impute_missing` 的 mode 分支会**就地修改**调用方的 DataFrame,其余四个分支都返回新表。
|
||||
- 已知缺口:
|
||||
- 除 `core.Result`、`core.get_rng`、`core.set_seed`、`data.load_table`、`data.save_table` 外,其余函数体**尚未实现**(统一 `raise NotImplementedError` + `TODO(L0/L1/v0.2)` 标记)。
|
||||
这是刻意的:先定接口,再按 `docs/03-roadmap.md` 的 L0 → L1 顺序填实现。
|
||||
- 已知缺口:`SALib`(Sobol/Morris)、`pymoo`、`pyright` 已装进 conda 环境 `mcm-toolkit`,`.venv` 里没有。
|
||||
|
||||
Reference in new issue
Block a user