a1cc26e0424cbea4340dfa19f1d9875e6b454c4f
## 审查结论 算法移植是对的:大样本正态下百分位区间半宽与解析 `2 × 1.96 × se` 差 < 2%, 按块重采样(batch_size=1000)也照 docstring 的 Notes 做了。以下是要改的部分。 ## Fixed - `random_state=None` 时另开 `np.random.default_rng()`,**绕过了 `core.get_rng`** —— 与决策 24 冲突:`set_seed` 对它无效,同一段脚本重跑区间就变。改成无条件 `get_rng(random_state)`(决策 46)。 - `metrics["statistic_name"]` 用 `hasattr(statistic, "__name__")` 判不出 lambda: lambda 的 `__name__` 恒为 `"<lambda>"`,于是 `else "custom"` 是**死代码**, 实测自定义统计量拿到的是 `"<lambda>"`。改成 `getattr(f, "__name__", None)` + 判 `"<lambda>"`(易错点 17)。 - docstring 补齐 `Parameters` / `Returns` / `Raises`(§4.7),并如实写明 `method="bca"` **尚未实现** (此前 docstring 承诺支持、实现却抛 `NotImplementedError`)。 - ruff 两条:I001(导入块拆成三行且用了绝对导入)、F541(`f"暂不支持bca"` 无占位符)。 ## Tests - **摘掉 3 条 `skip`**:等 `bootstrap_ci` 的那 3 条一直挂着,实现写完照样全绿 —— 易错点 9 复发, 已在 `personal-pitfalls.md` 把该条 `复发` 记到 1 并注明本次经过。 - 新增 6 条:`estimate` 等于原样本统计量、`confidence` 单调性、五种容器一致、 自定义 lambda 走回退分支、**不给种子时跟随 `set_seed`**(钉住上面那个 rng 修复)、非法/未实现 method。 - 写测试时踩到一个真性质:极差的重采样值**永远 ≤ 原样本极差**,`high` 会正好等于 `estimate`, 断言不能写 `estimate < high`。这条已写进卡片 §5。 - 全量 **177 条:143 passed / 34 skipped / 0 xfail**;ruff 0,pyright 0;`examples/01` 跑通。 ## Docs - `docs/algorithms/bootstrap_ci.md`:**第 2 张 S 档卡片**(模板九节 + §10 待拍板)。 `docs/algorithms/README.md` 进度表打勾。 - `docs/dev/personal-pitfalls.md`:新增第 17 条(`hasattr(f, "__name__")` 挡不住 lambda,`else` 分支即死代码), 索引补到 17;第 9 条记一次复发。 - `STATUS.md`:E 节记 `bootstrap_ci`(L0 10/12 → 剩余 `monte_carlo` `save_figure`),决策 46, 「下一步」第 1 条改写、新增第 8 条列 5 个待拍板口径。 ## 待用户拍板(Codex 一律未动,按决策 39) - `x` 里的 NaN 静默传进统计量 → `nan` 区间(`confidence_interval` / `t_test` 都是先丢 NaN 的,口径不齐) - `n_resamples <= 0` 现在抛 `IndexError: index -1 is out of bounds`(应在入口给可读 ValueError) - `confidence` 越界交给 numpy 抛 `Percentiles must be in the range [0, 100]` - `method="bca"`:补实现(≈25 行,S 档)还是从 docstring 删掉 - `bootstrap_statistic` 仍是 `NotImplementedError`,而 `bootstrap_ci` 把那段重采样循环内联了 —— 建议抽出去让 `bootstrap_ci` 调它(易错点 16 的变体)
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%