f95fbd2726c96ee4d6ddd9a51a0267e36e23ced6
## 用户问的「t_test 307 / 308 两行报错」 - 那两行是 `float(res.statistic)` / `float(res.pvalue)`,报错来自 scipy 的 `TtestResult`: 它和 `PearsonRResult` 一样是 `_make_tuple_bunch` **运行时**拼出来的类,存根里没有这两个字段。 - 探针实测 `TtestResult(statistic=3.873, pvalue=0.0305)`,运行时取值完全正常 —— **不是真 bug**。 - 按决策 40 的路子补 `_statistic(result: Any) -> float`(与 `_pvalue` 成对),一行 `# type: ignore` 都没挂。 详情见 `docs/04-environment.md` 坑 10(已扩写为 pvalue / statistic 两条)。 ## 顺手查出来的真 bug:`confidence_interval` - 原码 `return (float(min(0.0, lower)), float(max(upper, 1.0)))`: ① `min` / `max` 的**参数写反**,下界被钉死成 `0.0`; ② **无条件**把三种 method 的区间都夹到 `[0, 1]`。 - 实测 `confidence_interval(rng.normal(170, 8, 50), method="t")` 下界是 `0.0`(正确 `171.0 ± 2.1`); `confidence=1.5` 被夹成 `(0.0, nan)` 而不报错。 - 现在:**只有 `proportion` 夹**(决策 42),`normal` / `t` 返回 `mean ± z|t·se` 不夹; `method` 非法抛 `ValueError`(§4.7)、`confidence` 走 `(0, 1)` 开区间、样本量 < 2 抛 `ValueError`。 - 入参放宽到 `list` / `tuple` / `ndarray` / `Series` / `DataFrame`: docstring 的 Examples 传 list、L0 用例传 ndarray,原来**两条都直接 `TypeError`**。 ## t_test - docstring 补齐 `Parameters` / `Returns` / `Raises` / `Notes`(§4.7); `_clean_data` 改用 `isinstance(data, pd.DataFrame)` 收窄(坑 8 的 `cast`); `alpha` 开区间校验;`df` 按 Welch–Satterthwaite / pooled / paired 分别给。 - **4 个口径未代选**(决策 39),已记进 `STATUS.md`「下一步」第 6 条待用户拍板: 单样本结论文案、`paired` 的 NaN 对齐、`value` 被静默忽略、`DataFrame` 摊平多列。 ## 测试与文档 - `tests/test_stats.py` +10 条(36 → 46),含把原先挂 skip 的 `test_confidence_interval_matches_scipy` 转正;对照一律用解析式(z 公式 / Welch df / t 公式)。 - 全量:**125 passed / 37 skipped / 0 xfail**,ruff 0,pyright 0。 - 个人易错点新增第 15 条,并把**停在 6 号**的索引表补齐到 15(只补索引,正文未动)。 - `docs/04-environment.md` 顺手修掉残留的 `[FENCE]` 代码围栏占位符与一处重复的 `---`。 - `STATUS.md`:L0 记 9/12;校正测试数为 162 条;新增决策 42 / 43。
MCM/ICM Toolkit
这是我参加美赛时用的学习和准备复用的代码,有需要可以自行克隆和修改。
美赛(MCM/ICM)编程手的竞赛层工具箱: 把比赛中反复手写的代码沉淀成"高频算法自己实现 + 成熟库薄封装 + 统一结果接口"。
不替代 SciPy / scikit-learn / statsmodels / NetworkX / SALib / SymPy。 只做它们到"4 天赛程能用"之间的那一层。
快速开始
# 1) 建环境(两条路选一条)
.\scripts\setup-venv.ps1 # venv,零下载,复用 Anaconda base 的科学栈
.\scripts\setup-conda.ps1 # conda 环境 mcm-toolkit(精准包列表,走代理下载)
# 2) 自检
.\scripts\doctor.ps1
# 3) 激活
.\.venv\Scripts\Activate.ps1
import mcm_toolkit as mcm
mcm.set_seed(42)
r = mcm.bootstrap_ci(data, statistic=np.median, random_state=42)
print(r.params["low"], r.params["high"])
当前状态(v0.0.1)
本地 git 仓库已初始化(main,首次提交 5319589),远程 Gitea 待配置。
接口已定,实现未填。 所有函数体是 raise NotImplementedError + TODO(L0/L1/v0.2) 标记,
按 docs/03-roadmap.md 的 L0 → L1 顺序填。
目录
| 路径 | 说明 |
|---|---|
src/mcm_toolkit/ |
包源码,7 个子包 |
tests/ |
测试,与包一一对应(测已知解析解,不测实现细节) |
examples/ |
每个模块一个能跑的最小例子 |
problems/ |
历年真题(每做完一题,反向沉淀 1~3 个通用函数) |
notebooks/ |
探索用 |
docs/ |
需求、架构、路线图、环境、规范 |
scripts/ |
环境脚本 |
STATUS.md |
当前进度 |
子包
| 包 | 职责 | 关键函数 |
|---|---|---|
core |
基础设施 | Result get_rng check_* |
data |
读 / 洗 / 变换 / 采样 | load_table detect_outliers normalize |
stats |
描述 / 推断 / bootstrap | describe bootstrap_ci fit_distribution |
models |
回归 / 时序 / ML | fit_linear fit_arima compare_models |
solve |
优化 / 模拟 / 敏感性 | monte_carlo simulated_annealing sobol_analyze |
decision |
评价决策 | entropy_weights ahp_weights topsis gm11 |
viz |
出图出表 | plot save_figure save_table |
文档
开始动手前请先读 docs/01-suggestion-review.md—— 它记录了"为什么最终结构是这样",以及明确不做什么。
许可
MIT,见 LICENSE。
Languages
Python
95.4%
PowerShell
4.6%