--- name: python-analysis description: >- 当用户使用 Python 做科研数据分析、统计建模、机器学习实验或批量数据处理,说"用 Python 跑一下分析""做个统计""清洗数据""画结果图""跑个脚本"时使用。本技能规定本地 Python 分析的统一操作规程:环境优先 uv/venv 隔离、依赖写入 requirements.txt 并通过 record_run 记录环境指纹、随机种子固定并登记、原始数据只读(清洗另存新文件)、产物落盘 output///latest/、图表 PNG+PDF 双格式 300dpi,并附 stats_integrity_check.py 对报告数字做确定性体检。同义触发场景:Python 分析、跑数据、统计分析、数据处理、画图、pandas、matplotlib、分析环境怎么配。 argument-hint: '[分析任务描述]' metadata: domains: [compute] last_reviewed: '2026-08-18' --- # python-analysis:Python 分析规程 ## 目的 Python 是科研计算的主力工具,也是"跑过一次就复现不出来"的重灾区:依赖版本漂移、随机种子没固定、原始数据被顺手改掉、图只存了屏幕截图。本技能把每一次本地 Python 分析约束为可复现的最小闭环: 1. 环境可重建:隔离环境 + requirements.txt + 环境指纹进 provenance; 2. 结果可复算:随机种子固定并写进记录; 3. 数据可追溯:原始数据只读,清洗产物另存; 4. 产物可定位:统一落盘 `output///`,图表双格式; 5. 报告数字可机检:交付前过一遍 `stats_integrity_check.py`。 本技能只规定规程,不规定具体算法;算法选择由研究问题决定(必要时标注 `[模型知识—待核实]` 并与用户确认)。 ## 前置检查 1. 确认当前目录是工作区根目录(结构约定见 research-workspace);产物路径契约 `output///latest/` 在这里同样适用,本技能的 `` 名即 `python-analysis`(用户自建脚本的分析产物可用 `analysis` 作为 skill 名,保持与既有产物一致即可)。 2. 确认原始数据已在 `data/` 下且按只读原则管理;数据还没就位时先停下来请用户放数据,不要用"示例数据"冒充真实数据跑分析。 3. 检查是否已有可用环境:项目根存在 `.venv/` 或 `requirements.txt` 时优先复用,不要每次分析都新建环境。 4. 涉及人体、患者、涉密数据的分析,先对照画像"伦理与数据合规要求"一节:红线数据不得离开规定机器,更不得上传到第三方在线工具(guardrail 第 8 条)。 ## 1 · 环境:优先 uv,其次 venv 按以下优先级选择环境管理工具: 1. **uv**(已安装时):`uv venv` 创建 `.venv/`,`uv pip install -r requirements.txt` 安装依赖。速度快、锁文件友好。 2. **venv + pip**(uv 不可用时):`python -m venv .venv`,激活后 `pip install -r requirements.txt`。 3. 不用 conda 新建环境,除非画像"算力环境"一节明确写了 conda——与画像保持一致优先于本规程。 纪律: - 每个项目一个 `.venv/`,放在工作区根目录;不在系统 Python 里 `pip install` 任何分析依赖。 - 新装依赖后立刻 `pip freeze > requirements.txt`(uv 同理)更新锁定;requirements.txt 是产物的一部分。 - 首次在某环境跑分析时,用 provenance-record 登记一次环境(脚本自动写 `.openscience/env/.txt`);此后每次登记的 env_hash 自动关联。 ## 2 · 随机种子:固定并登记 1. 脚本开头统一设种子: ```python import random import numpy as np SEED = 42 random.seed(SEED) np.random.seed(SEED) ``` 用到其他带随机性的库(如 torch、sklearn 的 `random_state`)时,把同一个 SEED 传进去。 2. 种子值写进 record_run 的 `--note`(如 `seed=42`);换种子重跑视为一次新实验,登记新记录并说明换种子的原因。 3. 不允许"先不固定种子看看效果"——探索性运行同样登记,大不了 note 里写"探索性,未固定种子",让读者知道这条结果的复现等级。 ## 3 · 数据:原始只读,清洗另存 1. 从 `data/` 读,永不写 `data/` 下已存在的文件;任何脚本检测到自己在覆盖 `data/` 文件,立即停止并报告(research-workspace 原始数据只读原则)。 2. 清洗、转换、筛选的产物是新文件:中间产物放 `output/python-analysis///`;需要跨分析复用的清洗后数据集放项目自建的 `derived/`(不存在则创建),并在 README 或 note 里写清由哪份原始数据经哪步处理而来。 3. 数据纠错走增补:发现原始数据有误时新存修正版 + `README-correction.md`,原文件保留。 4. 大文件读取失败(内存不足)时,改用分块(`pandas.read_csv(..., chunksize=...)`)或先抽样探索,不要在报告里假装全量分析过。 ## 4 · 分析脚本:可重复执行 1. 脚本放 `scripts/`,命名 kebab-case(如 `analyze-cycle-life.py`);一次性探索可以用 notebooks/,但进入产物的分析必须落成脚本。 2. 脚本满足"从头跑到尾不交互":`python scripts/xxx.py` 一条命令完成,不弹 input()、不依赖 notebook 单元格顺序。 3. 参数用 argparse 或脚本顶部常量集中声明;硬编码路径只允许指向工作区内相对路径。 4. 输出目录按时间戳创建(`YYYYMMDD-HHMMSS`),本次全部产物写入其中。 ## 5 · 产物落盘与图表规范 1. 目录契约(与 research-workspace 一致): ```text output/python-analysis/// # 本次运行全部产物 output/python-analysis//latest/ # 运行结束后的完整副本 ``` 2. 图表一律双格式导出:PNG(预览、贴报告)+ PDF(排版、投稿矢量),均 300 dpi: ```python fig.savefig(out / "cycle-life.png", dpi=300, bbox_inches="tight") fig.savefig(out / "cycle-life.pdf", bbox_inches="tight") ``` 3. 统计结果(表格、模型参数、p 值)同时落一份机器可读文件(CSV 或 JSON),不要只存在图里或打印在 stdout——报告里的每个数字都应能指回这份文件。 4. 运行结束后刷新 `latest/`(先清空再放副本),然后用 provenance-record 登记: ```bash python <插件包路径>/skills/provenance-record/scripts/record_run.py \ --path output/python-analysis//latest/ \ --tool "python scripts/analyze-cycle-life.py" \ --note "循环寿命分析,seed=42,数据 data/2026-08-cycling/" ``` ## 6 · 报告数字体检:stats_integrity_check.py 分析结论写进 markdown 报告后、交付前,运行本技能自带脚本做确定性数字检查(纯标准库): ```bash python <插件路径>/skills/python-analysis/scripts/stats_integrity_check.py \ --path reports/<报告>.md --format json ``` 检查项: 1. 百分比在 0-100 内;同一行疑似构成组的百分比之和 ≈ 100±0.5; 2. p 值格式(`p<0.001` 或 `p=0.xxx`)与取值在 0-1 内; 3. `N=n` 多次出现时数值一致; 4. 置信区间下界不超过上界。 脚本输出 `{issues: [{check, location, detail, level}]}`,error 级问题修复前不得交付(guardrail 第 7 条);脚本退出码为 1 表示存在 error 级问题,可接入流水线。脚本是确定性规则,不替代统计判断——它查"数字写得对不对",不查"数字算得对不对"。 ## 输出模板 分析完成后的汇报: ```markdown ## Python 分析完成(<任务名>) - 环境:.venv/(uv / venv),requirements.txt 已更新,env_hash= - 种子:seed=(已登记) - 产物:output/python-analysis//latest/(清单:…) - 图表:…(PNG+PDF,300dpi) - 数字体检:stats_integrity_check 通过 / N 条 warn(列出)/ N 条 error(修复中) - provenance:已登记(note:…) 下一步:… ``` ## 本技能不做什么 - 不替用户选统计方法或模型:方法适用性是领域判断,本技能最多提示"该选择需要领域依据",必要时标注 `[模型知识—待核实]` 并请用户确认。 - 不动原始数据:任何清洗、纠错都生成新文件(research-workspace 只读原则)。 - 不管理远程与集群任务:SSH 远程算力见 remote-compute,Slurm 集群见 hpc-slurm,长任务后台管理见 run-monitor。 - 不保证统计正确性:stats_integrity_check.py 只做格式与一致性机检,显著性解释、多重比较校正等仍需用户与 reviewer 把关。 - 不自动安装系统级软件:装 Python 本身、装 uv 属环境准备,向用户说明后由用户执行。 ## 收尾与下一步 - 产物进入报告或论文前:刷新 `latest/`、确认 provenance 登记完整、跑 stats_integrity_check.py 清零 error。 - 分析结论要支撑论文级论断时,进入 evidence-capsule 冻结流程(脚本、环境、数据版本一并打包)。 - 报告交付前按 reviewer-protocol 接受审查;数字类意见(check=number)与本技能体检结果一并处理。 - 分析耗时超过分钟级时,改用 run-monitor 后台运行,不要让人机会话空等任务结束。