读者画像:你是一名有 SAS 编程经验的临床统计程序员(SDTM/ADaM/TLF 日常), Python 只学过一遍语法、现在大部分已经遗忘。 目标:用最短路径把 Python 变成你的第二生产工具,并具备开发 AI Agent 的基础能力。
0.1 先给你一个好消息:你不是从零开始
大多数 Python 教程把初学者当作"什么都不会的人",于是花了大量篇幅讲变量是什么、循环是什么。 对你来说那是浪费时间——你早就掌握了编程思维,只是换了一套语法和运行环境。
先看清楚你已有的资产:
| 你已经掌握的 SAS 能力 | 在 Python 世界的对应物 | 迁移难度 |
|---|---|---|
DATA 步逐行处理、if/then/else、output |
for 循环 + if;进阶:np.where / df.loc |
★★☆ |
| 数据集(数据集 = 行 + 列 + 标签 + 格式) | pandas DataFrame |
★☆☆ |
PROC SQL |
pandas query / merge / groupby;或 SQLite / duckdb |
★☆☆ |
PROC SORT / nodupkey |
df.sort_values() / df.drop_duplicates() |
★☆☆ |
PROC MEANS / PROC FREQ |
df.groupby().agg() / value_counts() / crosstab |
★★☆ |
PROC TRANSPOSE |
df.pivot() / df.melt() |
★★☆ |
MERGE / SET |
pd.merge() / pd.concat() |
★★☆ |
%MACRO / %LET |
函数(def)+ f-string + 配置文件 |
★★★ |
FORMAT / label |
pd.Categorical / pyreadstat 的 metadata |
★★☆ |
数组 ARRAY |
numpy 数组 / 列表推导式 | ★★☆ |
自动宏变量 _N_ &sysdate |
内置函数 / datetime / enumerate |
★☆☆ |
SAS 日志与 %put 调试 |
logging 模块、print、pdb / 断点 |
★★☆ |
真正需要重新建立的只有三件事:
- 向量化思维——Python 不是"逐行循环",而是"整列一起算"。这是最大的思维转换。
- 对象与方法——SAS 里
PROC MEANS data=a;是"过程作用在数据集上"; Python 里是a.groupby(...).mean(),"数据自己会做事情"。主语变了。 - 工程化习惯——虚拟环境、包管理、Git、单元测试。SAS 世界里通常不需要你操心这些, Python 世界里不管好这些寸步难行。
📌 本章之后,请先读 速查表—— 它是一页纸的语法映射,遇到不认识的写法随时回来查,比翻教程快。
0.2 为什么现在就必须学 Python(而不是"以后有空再说")
不是"多一门语言多条路"这种安慰剂,而是三条已经发生的行业事实:
- 监管口子已经打开。 FDA 2021 年的 Statistical Software Clarifying Statement 明确表示:提交中使用经验证的开源工具是可以接受的。这意味着"只能用 SAS"不再是硬约束。
- 岗位描述在变。 近两年 PharmaSUG / PHUSE 上关于 Python 的论文从"为什么学" 变成了"怎么落地"——例如 PharmaSUG 2026 的 ET-223 Python as a Cost-Effective Solution for Clinical Statistical Programming 已经在演示完整的 ADaM → TFL 报表工作流。
- AI Agent 只能长在 Python 上。 你后续想做的 Agent 开发, 生态(LangChain、OpenAI SDK、MCP、各类向量库)几乎清一色 Python。 SAS 里没有这条路,这是硬边界。
0.3 路线图:四个阶段,18 章
文本
┌──────────────────────────────────────────────────────────────────────┐
│ 阶段 1 · 重新长出语法肌肉(第 1–5 章) 投入最少,回报最快 │
│ 环境搭建 → 语法速通 → 数据结构 → 控制流/函数 → 文件与批处理自动化 │
│ 交付物:能写出自动重命名/批量比对/汇总文件的 Python 小脚本 │
├──────────────────────────────────────────────────────────────────────┤
│ 阶段 2 · 数据分析核心(第 6–10 章) 这是你 80% 的日常工作 │
│ NumPy 向量化 → pandas 入门 → DATA步/PROC SQL 对照 → 合并重塑 → │
│ 日期/缺失值/格式/数据质量 │
│ 交付物:能把一段 PROC SQL + DATA 步重写成 pandas │
├──────────────────────────────────────────────────────────────────────┤
│ 阶段 3 · 临床实战(第 11–14 章) 真正"能上手干活" │
│ 读 XPT/SAS7BDAT → SDTM 处理实战 → ADaM 衍生与 TFL → 统计与可视化 │
│ 交付物:用 CDISC 试点数据跑出 Table 1 / AE SOC-PT 表 / 移位表 │
├──────────────────────────────────────────────────────────────────────┤
│ 阶段 4 · 进阶与 Agent(第 15–17 章) 差异化竞争力 │
│ AI 辅助编程与 SAS→Python 迁移 → Agent 开发入门 → 工程化与合规考量 │
│ 交付物:一个能读临床数据、做 QC 检查、给出结论的 Agent │
└──────────────────────────────────────────────────────────────────────┘
章节清单与预估投入
| 章 | 标题 | 核心产出 | 建议投入 |
|---|---|---|---|
| 00 | 学习路线图与如何使用本项目 | — | 20 min |
| 01 | 环境搭建与思维转换 | 可运行的 Python 环境 | 1.5 h |
| 02 | 基础语法速通(SAS 对照) | 读懂并写出基础脚本 | 2 h |
| 03 | 核心数据结构:list / dict / str | 组织复杂数据 | 2.5 h |
| 04 | 控制流、函数、模块与异常 | 可复用的函数 | 2.5 h |
| 05 | 文件与批处理自动化 | 自动化脚本 | 2 h |
| 06 | NumPy 与向量化思维 | 摆脱逐行循环 | 2.5 h |
| 07 | pandas 入门:DataFrame 就是数据集 | 数据读取与探查 | 3 h |
| 08 | 数据操作对照:DATA 步 / PROC SQL → pandas | 完整重写日常逻辑 | 4 h |
| 09 | 合并、重塑与分组汇总 | 复刻 MERGE/TRANSPOSE/MEANS | 3 h |
| 10 | 日期、缺失值、格式与数据质量 | 处理真实脏数据 | 3 h |
| 11 | 读取 XPT/SAS7BDAT 与临床数据结构 | 不装 SAS 也能读数据 | 2 h |
| 12 | SDTM 数据处理实战 | SDTM 体检与衍生 | 4 h |
| 13 | ADaM 衍生与 TFL 报表生成 | 产出可用报表 | 4 h |
| 14 | 统计分析与可视化 | 描述统计与图形 | 3 h |
| 15 | AI 辅助编程与 SAS→Python 迁移 | 让 LLM 帮你干活 | 2 h |
| 16 | Agent 开发入门:从 API 到临床 QC Agent | 一个能跑的 Agent | 5 h |
| 17 | 工程化与后续进阶 | 可维护的项目 | 2 h |
不要按顺序每一章都读完再动手。 建议节奏: 第 1–5 章连续过一遍(打地基),第 6–10 章每章都跟着敲代码, 第 11 章之后直接进
cases/目录,卡住了再回查对应章节。
0.4 项目的目录结构与查阅方式
文本
clinical-python-roadmap/
├── README.md ← 项目主页:定位、快速开始、导航
├── docs/ ← 教程正文(你正在读第 00 章)
│ ├── 00-...md ... 17-...md
├── cheatsheets/
│ └── SAS-to-Python速查表.md ← 一页纸映射表,日常最高频
├── cases/ ← 实战案例(可运行的 .py + 说明)
│ ├── case01_数据体检.py
│ ├── case02_人口学表.py
│ ├── case03_不良事件汇总表.py
│ ├── case04_实验室移位表.py
│ ├── case05_ADSL衍生.py
│ ├── case06_批处理自动化.py
│ └── case07_临床数据QC_Agent.py
├── resources/ ← 权威资料索引(GitHub / PharmaSUG / PHUSE / …)
├── data/
│ ├── samples/ ← 已转好的小 CSV(开箱即用,无需下载)
│ └── raw/ ← XPT 原始数据(运行下载脚本得到,不入库)
├── scripts/
│ └── download_data.py ← 多通道数据集下载器(含国内镜像降级)
└── requirements.txt
三种使用方式:
| 你想… | 去哪里 |
|---|---|
| 系统学习 | docs/ 按顺序读 |
| 快速查语法 | cheatsheets/SAS-to-Python速查表.md |
| 直接抄能用的代码 | cases/,每个案例都独立可运行 |
0.5 关于数据集:为什么用 CDISC 试点数据
本项目全部实战案例基于 CDISC Pilot Project(CDISCPILOT01)——
- 2007 年 CDISC 公开发布的经 FDA 审阅的完整电子提交包;
- 阿尔茨海默症双盲试验,含完整 SDTM(DM/AE/CM/EX/LB/VS/QS…) 与 ADaM(ADSL/ADAE/ADTTE/ADLBC…);
- 文件格式为 SAS v5 传输格式(
.xpt),Python 可直接读取,不需要安装 SAS; - 完全公开、可自由使用,不涉及任何真实受试者隐私(已去标识化)。
仓库地址:https://github.com/cdisc-org/sdtm-adam-pilot-project
本项目
data/samples/已提供转换好的 CSV 小样本, 克隆下来就能直接跑案例,不需要联网下载。 需要完整数据时运行python scripts/download_data.py --core。
0.6 学习原则(比内容更重要)
- 必须动手敲。 读懂代码和写出代码之间的差距,比你想象的大 5 倍。 每章的代码请自己敲一遍,不要复制粘贴。
- 以"重写"代替"学习"。 最有效的练习是:找一段你熟悉的 SAS 程序, 用 Python 重写一遍,然后对比结果是否一致。这也正是第 08 章的作业。
- 允许自己忘记。 你的目标是"知道有这个东西 + 知道去哪查", 而不是背下所有 API。速查表和官方文档才是你的长期记忆。
- 不要纠结于完美。 Python 有很多"更好的写法", 但在你只求完成任务时,能跑通且结果正确的写法就是好写法。 优化是第三遍重写时才做的事。
0.7 学完之后,你应该能做到
- [ ] 用 pandas 把一个 SDTM 域读进来、体检、清洗、衍生新变量
- [ ] 把一段
PROC SQL+DATA步逻辑用 Python 等价实现,结果可对照 - [ ] 从 ADaM 数据生成一张符合行业惯例的人口学特征表(Table 1)
- [ ] 写脚本批量处理上百个文件(重命名、比对、汇总)
- [ ] 用 LLM API 搭一个能读临床数据、做检查、写结论的 Agent
- [ ] 在 Git 上管理自己的分析代码,做到可复现
下一章 → 第 01 章 · 环境搭建与思维转换