feat(stats): correlation_matrix 按方案 A 拆成三个函数,收口返回契约(L0 9/12)
用户 2026-10-03 拍板方案 A(见决策 41),由 Codex 落地。
拆成三个函数:
- correlation_matrix -> 数值系数矩阵(对角线 1.0)
- correlation_pvalues -> 数值 p 值矩阵(对角线 NaN)
- correlation_table -> 星标字符串表(对角线 1.000 不带星)
三者共用 _check_corr_args 守卫与成对删缺失口径;correlation_table 在最外层调另外两个。
理由: 字符串表做不了后续计算(挑高相关对、喂聚类/PCA、画热力图),反过来随时能格式化;
一旦返回字符串,数值信息不可逆地丢失。
顺带修掉两处:
- 对角线 p 值由 0.0 改成 NaN —— 写 0 会被下游读成"极显著",而"自己和自己"没有 p 值
- p 值与 r 现在用同一批观测: 先成对 dropna() 再算,并同样尊重 min_periods。
此前 corr 是成对删缺失、pearsonr 不删,两者样本量不同,r 与 p 对不上
- p 值只算上三角再镜像(成对变量的 p 天然对称),省一半重复计算
tests: test_correlation_matrix_diagonal_is_one 摘掉 xfail 转正;新增 8 条
(数值性+对称性、非数值列跳过、p 值对照解析式 t = r*sqrt((n-2)/(1-r^2))、
对角线 NaN、成对删缺失口径、min_periods、对角线无星标、表格与数值输出一致)。
测试 105 passed / 38 skipped / 1 xfail -> 114 passed / 38 skipped / 0 xfail。
验证: pytest 114 passed / 38 skipped;ruff All checks passed;pyright 0 errors。
docs: STATUS.md(L0 9/12 + 决策 41 + 下一步);CHANGELOG;
personal-pitfalls 追加第 14 条(把"能看的表"和"能算的表"塞进同一个返回值);
roadmap 记录 correlation_matrix 的两个伴随函数
This commit is contained in:
1 parent
3432bf3e50
commit
95f5266563
7 files changed
+308
-71
No files matched your search
@@ -217,3 +217,20 @@
|
||||
`if x:` 对 `DataFrame` / `Index` / 多元素 `ndarray` 会抛同一个歧义错误;
|
||||
③ 新写的分支,**至少拿 0 / 1 / 多三种形状各跑一遍**,单列能过不代表多列能过。
|
||||
- 首次:2026-10-03|复发:0
|
||||
|
||||
### 14. 把"能看的表"和"能算的表"塞进同一个返回值
|
||||
|
||||
- 现象:`correlation_matrix` 返回的是一张**带显著性星标的字符串表**(`1.000***` 这种),
|
||||
直接贴论文很爽。但同一个函数在 docstring 里承诺的是"值 = 相关系数",
|
||||
L0 用例也断言 `np.allclose(np.diag(...), 1.0)` —— 字符串表两样都做不到:
|
||||
拿到结果的人**没法**挑高相关对、喂给聚类 / PCA、画热力图。
|
||||
于是这条用例只能先挂 `xfail`,实现和契约顶在那里。
|
||||
- 为什么会错:写的时候想的是"我最后要看到什么"(论文里的那张表),
|
||||
没想"调用方还要拿它**算什么**"。展示需求是**输出端**的事,不该侵占返回值。
|
||||
一旦返回字符串,数值信息就**不可逆地丢了**(你可以随时把数字格式化成字符串,
|
||||
但没法把 `"0.570***"` 还原成 `0.570` 和小数点后丢失的精度)。
|
||||
- 以后怎么防:① 一个函数只返回**一种东西** —— 要么是数据,要么是给人看的展示;
|
||||
② 判据是"这个返回值还能不能参与下一步计算":不能,就该拆成两个函数;
|
||||
③ 拆的时候让**计算型**当主函数、**展示型**去调它(`correlation_table` 调
|
||||
`correlation_matrix` + `correlation_pvalues`),而不是反过来。
|
||||
- 首次:2026-10-03|复发:0
|
||||
Reference in new issue
Block a user