fix(stats): CV 改用 |mean|,并记录决策 37/38/39 与经验 12
coefficient_of_variation: - 分母由 mean 改为 |mean|(用户本人改),均值为负时 CV 不再是负值 - docstring 摘要 / Returns / Notes 同步,加一条测试钉住"均值为负时 CV 仍为正" 口径拍板(2026-10-03): - 决策 37: 非数值列的处置按输出契约分,不按包分 —— describe/zscore 丢掉(吐数值结果表), detect_outliers 保留列、掩码恒 False(吐与原表同形的掩码),刻意不统一 - 决策 38: CV 用 sigma/|mean| - 决策 39: 工作约定 —— 语义/非法输入口径由用户拍板,Codex 只列选项不代选; ruff / STATUS.md / CHANGELOG.md / tests / docstring 这类与算法无关的工程事务 Codex 顺手补 经验(docs/dev/personal-pitfalls.md,只追加): - 第 12 条: 三个并列的 if 让后面的静默覆盖前面的(transform.normalize 三种 method 实际只走 max) 第 11 条(上一轮)是 descriptive 的 .loc 对齐失败静默填 NaN —— 两条的共同点是"不抛异常" 验证: pytest 103 passed / 39 skipped;ruff All checks passed;pyright 0 errors。 docs: STATUS.md 决策 37/38/39 + 下一步;CHANGELOG 记录
This commit is contained in:
1 parent
e9624cb3a7
commit
cfc1be31ca
5 files changed
+58
-20
No files matched your search
@@ -221,6 +221,15 @@ def test_coefficient_of_variation_accepts_single_column_frame():
|
||||
assert coefficient_of_variation(df) == pytest.approx(single)
|
||||
|
||||
|
||||
def test_coefficient_of_variation_uses_absolute_mean():
|
||||
"""均值为负时 CV 仍是**正数**:符号不该被读成"波动更小"。"""
|
||||
from mcm_toolkit.stats import coefficient_of_variation
|
||||
|
||||
x = np.array([-1.0, -2.0, -3.0, -4.0])
|
||||
assert coefficient_of_variation(x) == pytest.approx(x.std() / abs(x.mean()))
|
||||
assert coefficient_of_variation(x) > 0
|
||||
|
||||
|
||||
def test_coefficient_of_variation_zero_mean_is_value_error():
|
||||
"""均值为 0 是**取值**问题不是类型问题:必须是 ValueError 而不是 TypeError。"""
|
||||
from mcm_toolkit.stats import coefficient_of_variation
|
||||
|
||||
Reference in new issue
Block a user