feat(data): detect_outliers 收尾(文本列恒 False)+ 补测试与文档
实现(用户本人写 + Codex 轻度收尾): - 统计量(quantile / mean / std)与掩码写入都收窄到数值列,含文本列的赛题表不再崩 - 非数值列在掩码里恒 False(用户定的语义),docstring Notes 补上这条 - 删掉死代码 data=data.copy():下面的 to_frame()/pd.DataFrame() 本就返回新对象, 函数全程只读 data,白复制一份;且它排在类型分派之前,会把错误入参的报错 从 ValueError 变成 AttributeError - 删掉那行死代码后 pyright 反而暴露 1 个真错:df[Index] 被类型存根当成 Series, .std() 于是被判成标量、std.replace(...) 非法。在取列子表处 cast 成 DataFrame 按运行时真值收窄(详见 docs/04-environment.md 坑 8) 测试: - test_detect_outliers_survives_text_columns 摘掉 xfail 并加强断言(文本列必须恒 False) - 新增 test_detect_outliers_all_text_frame_returns_all_false,钉住"整表无数值列"边界 - 58 passed / 2 xfailed -> 60 passed / 1 xfailed;ruff 0;pyright 0 - 仅剩 1 条 xfail:impute_missing 的 mode 分支就地改调用方的表(要选语义,留给用户) 文档: - STATUS.md:L0 5/12、验证结果表、下一步重写、新增决策 32(非数值列恒 False) - docs/04-environment.md:新增坑 8(pandas 存根让 df[Index] 退化成 Series,及三种无效修法) - docs/dev/personal-pitfalls.md:只追加第 8 条(限制掩码 ≠ 限制统计量) - CHANGELOG.md:本轮变更
This commit is contained in:
1 parent
319b16b17c
commit
b6dc4bc5a6
6 files changed
+144
-43
No files matched your search
+18
-6
@@ -83,15 +83,27 @@
|
||||
58 passed / 2 xfailed**。
|
||||
- `CHANGELOG.md`:[Unreleased] 里有一句被重复追加撑坏
|
||||
("…删掉它即全绿。:分析器会去 PATH 上找 python,"),已修。
|
||||
- `data.detect_outliers` 收尾(2026-10-02,**由用户本人实现**):统计量(`quantile` /
|
||||
`mean` / `std`)与掩码写入**都**收窄到数值列,含文本列的赛题表不再崩;
|
||||
非数值列在掩码里恒 `False`(用户本人定的语义,见决策 32)。docstring `Notes` 补上这条语义。
|
||||
- `data.detect_outliers` 里 `data=data.copy()` 是死代码:下面的 `to_frame()` / `pd.DataFrame()`
|
||||
本来就返回新对象,函数全程也没原地改过 `data`,白白复制一份数据;而且它排在类型分派
|
||||
**之前**,会把错误入参的报错从 `ValueError` 变成 `AttributeError`。已删。
|
||||
- `data.detect_outliers`:删掉那行死代码后 pyright 反而报了 1 个真错 ——
|
||||
`df[Index]` 被类型存根当成 `Series`,`.std()` 于是被判成标量、`std.replace(...)` 非法。
|
||||
在取列子表处用 `cast(pd.DataFrame, ...)` 按运行时真值收窄。详见 `docs/04-environment.md` 坑 8。
|
||||
- `tests/test_data.py`:`test_detect_outliers_survives_text_columns` 摘掉 xfail 并加强断言
|
||||
(文本列必须恒 `False`);新增 `test_detect_outliers_all_text_frame_returns_all_false`
|
||||
钉住"整表没有数值列"这条边界。测试 **58 passed / 2 xfailed → 60 passed / 1 xfailed**。
|
||||
- `docs/dev/personal-pitfalls.md`:追加第 8 条(限制掩码 ≠ 限制统计量)。
|
||||
|
||||
### Notes
|
||||
- `detect_outliers` 原有三个 bug,现已修掉两个(threshold 范围校验挪进 `clean_missing`、
|
||||
`is_series` / `is_ld_array` 提到类型转换**之前**),**只剩"文本列"这一处**:
|
||||
`data.quantile()` 仍在全表上算,含文本列的赛题表一带就崩。
|
||||
这一处要**先定设计**(非数值列返回全 `False`,还是只对数值列给掩码),
|
||||
所以不在"轻度直接修"的范围内,留给用户本人写 —— 见 `STATUS.md`「下一步」第 1 条。
|
||||
- `detect_outliers` 原有的三个 bug 加一处设计空白**已全部收口**:`threshold` 范围校验挪进
|
||||
`clean_missing`、`is_series` / `is_ld_array` 提到类型转换**之前**、统计量与掩码都限制在数值列、
|
||||
非数值列恒 `False`(决策 32)。最后一条 `xfail` 已按 XPASS 信号摘掉。
|
||||
**仍缺 S 档函数卡片**(`docs/algorithms/`)与 `examples/` 最小用法 —— 见 `STATUS.md`「下一步」第 1/4 条。
|
||||
- `impute_missing` 的 mode 分支会**就地修改**调用方的 DataFrame,其余四个分支都返回新表。
|
||||
同样属于"要选语义",留给用户本人写 —— 见 `STATUS.md`「下一步」第 3 条。
|
||||
同样属于"要选语义",留给用户本人写 —— 见 `STATUS.md`「下一步」第 2 条。
|
||||
- 已知缺口:
|
||||
- 除 `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 顺序填实现。
|
||||
|
||||
Reference in new issue
Block a user