fix(stats): correlation_matrix 修硬 bug,两处 pyright 报错按坑 8/10 正经修(无 ignore)
用户报的是"63 行 p 值赋值报错"。查下来:63 行运行完全正常(p 是 np.float64),
pyright 那条是 scipy 存根的缺陷。但顺着看发现了真正跑不起来的第 41 行。
correlation_matrix:
- 硬 bug: `if numeric_cols == 0` 拿 Index 和标量比 -> 得到布尔数组。
0 列时静默不报错、1 列时碰巧能跑、>=2 列直接 ValueError 崩(而 >=2 列正是常见情况)。
改成 len(numeric_cols) == 0,并加回归用例
- pyright 两处报错都不是运行时问题,且一处 # type: ignore 都没挂:
- data[numeric_cols] 是坑 8 的 DataFrame | Series 重载 -> cast 收窄
- `_, p = stats.pearsonr(...)` 解包退化成 object(scipy 的返回值是 _make_tuple_bunch
运行时拼的类,存根里没有 pvalue)-> 新增 _pvalue(result: Any) -> float 小助手统一取,
后面 t_test / anova / chi_square_test 可复用
- method 校验提到最前;add_stars 的 elif 链改 if;清掉 3 条 F541 与 1 条 I001,ruff 归零
- 顺带记录两处待定:对角线被标了 ***;含 NaN 时 corr 成对删失而 pearsonr 不删,r 与 p 对不上
tests:
- test_correlation_matrix_diagonal_is_one 由 skip 改成 xfail(strict=False)(决策 30):
契约要数值矩阵、实现返回带星标字符串表,口径待拍板
- 新增 2 条:多列数值表能跑通、非法输入报错
验证: pytest 105 passed / 38 skipped / 1 xfail;ruff All checks passed;pyright 0 errors。
docs: STATUS.md(correlation_matrix 进行中 + 决策 40 + 下一步 A/B/C 选项);CHANGELOG;
personal-pitfalls 追加第 13 条(Index == 标量 得到布尔数组);
docs/04-environment.md 追加坑 10(scipy 检验结果的存根缺陷)
This commit is contained in:
1 parent
cfc1be31ca
commit
3432bf3e50
6 files changed
+215
-24
No files matched your search
+22
-1
@@ -173,6 +173,23 @@
|
||||
- 测试计数:**82 passed / 40 skipped → 103 passed / 39 skipped**(新增 21 条);
|
||||
ruff 7 error → **All checks passed**;pyright **1 error → 0**。
|
||||
|
||||
- `stats.correlation_matrix`:实现落地(**由用户本人写**,Codex 审查 + 代修),修掉一个**硬 bug** ——
|
||||
`if numeric_cols == 0:` 拿 `Index` 和标量比,得到的是布尔**数组**:0 列时静默不报错、
|
||||
1 列时碰巧能跑、**≥2 列直接 `ValueError: The truth value of an array ... is ambiguous`** ——
|
||||
而"≥2 个数值列"正是最常见的情况,等于整个函数不可用。改成 `len(numeric_cols) == 0`,
|
||||
并加回归用例(见易错点 13)。
|
||||
- `stats.correlation_matrix`:pyright 的两处报错**都不是运行时问题,也都没挂 `# type: ignore`** ——
|
||||
`data[numeric_cols]` 是坑 8 的 `DataFrame | Series` 重载(`cast` 收窄);
|
||||
`_, p = stats.pearsonr(...)` 解包后会退化成 `object`(scipy 的返回值是 `_make_tuple_bunch`
|
||||
在运行时拼的类,存根里看不到 `pvalue`)。新增 `_pvalue(result: Any) -> float` 小助手统一取 p 值,
|
||||
后面 `t_test` / `anova` / `chi_square_test` 可复用(见 `docs/04-environment.md` 坑 10、决策 40)。
|
||||
- `stats.correlation_matrix`:`method` 校验提到最前(守卫集中开头);`add_stars` 的 `elif` 链改 `if`
|
||||
(RET505);清掉 3 条 F541 与 1 条 I001(import 未排序)—— ruff 归零。
|
||||
- `tests/test_stats.py`:`test_correlation_matrix_diagonal_is_one` 由 `skip` 改成 `xfail(strict=False)`
|
||||
(决策 30)—— 契约要**数值**矩阵,实现返回带星标的字符串表,口径待拍板;
|
||||
另新增 2 条(多列数值表能跑通、非法输入报错)。
|
||||
- 测试计数:**103 passed / 39 skipped → 105 passed / 38 skipped / 1 xfail**。
|
||||
|
||||
### Notes
|
||||
- `detect_outliers` 原有的三个 bug 加一处设计空白**已全部收口**:`threshold` 范围校验挪进
|
||||
`clean_missing`、`is_series` / `is_ld_array` 提到类型转换**之前**、统计量与掩码都限制在数值列、
|
||||
@@ -183,7 +200,11 @@
|
||||
(`min(x) + offset > 0`,见决策 35,**待用户确认**);④ 常量列行为写进 docstring 的 `Notes`;
|
||||
另外 `Parameters` / `Returns` / `Raises` 已按 §4.7 补齐。
|
||||
- 新增易错点第 10 条:**把真报错当成"编辑器误报"** —— 红线先跑 CLI 与 `pytest` 再判断(`docs/dev/personal-pitfalls.md`)。
|
||||
- `stats` 这条线开工了:`describe` 落地,并填掉 `examples/01_clean_and_describe.py` 的 `TODO(L0)`。
|
||||
- `stats` 这条线开工了:`describe` 落地,填掉 `examples/01_clean_and_describe.py` 的 `TODO(L0)`;
|
||||
`correlation_matrix` 功能上也能跑了(硬 bug 已修)。
|
||||
- `correlation_matrix` 的**返回契约待拍板**:带星标的字符串表(好贴论文)vs 数值矩阵
|
||||
(能做后续计算)。另有两处一并待定:**对角线不该带 `***`**;`df_num` 含 NaN 时
|
||||
`corr` 成对删失而 `pearsonr` 不删,r 与 p 会对不上。A/B/C 三个选项见 `STATUS.md`「下一步」第 1 条。
|
||||
- 三处口径已拍板(2026-10-03):`log_transform` 的 `offset` 维持现状(决策 35);
|
||||
`describe` / `zscore` **默认丢掉**非数值列、与 `detect_outliers` 的"保留列"刻意不统一(决策 37);
|
||||
变异系数改用 `σ/|μ|`(决策 38)。另立决策 39 明确分工:语义口径用户拍板、工程事务 Codex 顺手补。
|
||||
|
||||
Reference in new issue
Block a user