3. 数据源介绍:DrugBank、CTD、STITCH 等
搞药物重定位,第一步不是写代码,而是找数据。我见过不少新手一上来就急着调模型,结果数据质量一塌糊涂,白白浪费几个星期的算力。说白了,数据源选不对,后面一切归零。
这一章我只讲几个真正能打的公开数据库:DrugBank、CTD、STITCH,再把它们的拿手活儿和坑都掏出来。我个人习惯是先把这些库的结构摸透再动手,否则你连「这个字段是啥意思」都搞不明白。
3.1 DrugBank —— 结构化程度最高的药物知识库
DrugBank 是目前覆盖最全、注释最深的药物数据库。它把药物拆成了两类:小分子药和生物药(抗体、蛋白、核酸等)。每个药物条目里都附带靶点、代谢酶、转运体、适应症、ADMET 参数——这些字段对重定位来说就是黄金。
我手头有个真实经验:当年做某个抗肿瘤药重定位,花了两天在 PubChem 里翻来翻去都没找到完整的靶点谱,结果在 DrugBank 同一页面的「Target」选项卡下直接拿到了 12 个已知靶点,还附了 Ki 值和实验条件。所以我的建议是:DrugBank 永远是第一站。
3.1.1 核心字段与下载方式
DrugBank 提供 XML 和 CSV 两种导出格式。学术用户可以直接下载全量数据,但需要申请。我个人推荐用 XML 版,因为里面嵌套信息更完整。
关键字段表(来自 DrugBank 5.x 版本)
| 字段名 | 描述 | 重定位用途 |
|---|---|---|
| drugbank-id | 药物唯一标识,如 DB00001 | 跨库关联的主键 |
| name | 通用名 / 商品名 | 文本匹配 |
| type | small molecule / biotech | 筛选药物类别 |
| targets | 靶点列表(含基因名、UniProt ID) | 构建药物-靶点网络 |
| pathways | 参与的 KEGG / Reactome 通路 | 通路富集分析 |
| indications | 已批准的适应症 | 定义已知标签 |
| toxicity | 毒性描述 | 禁忌 / 不良反应过滤 |
XML 结构里,每个
# 用 xml.etree.ElementTree 做流式解析示例
import xml.etree.ElementTree as ET
tree = ET.iterparse('drugbank.xml', events=('end',))
for event, elem in tree:
if elem.tag == 'drug':
drug_id = elem.findtext('drugbank-id')
name = elem.findtext('name')
# 提取每个靶点
targets = elem.findall('.//target')
for t in targets:
uniprot = t.findtext('.//uniprot-id')
action = t.findtext('.//action')
print(drug_id, name, uniprot, action)
elem.clear()
3.2 CTD —— 化学-基因-疾病关联的交叉枢纽
CTD(Comparative Toxicogenomics Database)是我做重定位时使用频率最高的数据库之一。它最大的特点是:直接给出了「化学物 ↔ 基因」和「化学物 ↔ 疾病」的关联,而且每条关联都带有文献证据。
你想想看,DrugBank 只能告诉你这个药靶向哪个蛋白,但 CTD 能告诉你这个蛋白跟哪个疾病相关。把两层跳转合并成一跳,重定位路径就清晰多了。
3.2.1 核心文件与用法
CTD 提供三个核心 TSV 文件:CTD_chemicals.tsv、CTD_chem_gene_ixns.tsv、CTD_diseases.tsv。我一般把它们下载后存到 SQLite 里,方便跨表查询。
# 加载 CTD 化学-基因互作文件
import pandas as pd
chem_gene = pd.read_csv(
'CTD_chem_gene_ixns.tsv',
sep='\t',
skiprows=29, # 前 29 行是说明
low_memory=False
)
# 筛选 human 数据
human = chem_gene[chem_gene['OrganismID'].str.contains('9606')]
print(human[['ChemicalName', 'GeneSymbol', 'InteractionActions']].head())
3.2.2 关联分数与推理
CTD 不直接给「药→疾病」推荐,但你可以通过两条路径推导:
- 化学 → 基因 → 疾病:用
CTD_chem_gene_ixns找到受药物影响的基因,再用CTD_gene_disease找到这些基因参与的疾病。 - 化学 → 疾病直接关联:在
CTD_chemicals_diseases文件中,直接给出化学物与疾病的关联类型(therapeutic、marker/mechanism 等)。
这里有个我踩过的坑:CTD 里「Marker/Mechanism」类型的关联不代表治疗关系,可能是毒性标志物。如果你不加筛选就全盘拿去做阳性样本,模型预测出来的结果会有一堆假阳性。
CTD 关联类型过滤经验
| 关联类型(DirectEvidence) | 含义 | 是否可用于重定位正样本 |
|---|---|---|
| Therapeutic | 该化学物被用于治疗该疾病 | ✅ 是 |
| Marker/Mechanism | 该化学物与该疾病的标志物/机制相关 | ⚠️ 仅做负样本筛选 |
| Etiology | 该化学物与该疾病的病因相关 | ❌ 不建议直接使用 |
3.3 STITCH —— 化学-蛋白互作网络
STITCH(Search Tool for Interacting Chemicals)跟 STRING 是同一团队开发的。它专门做 化学小分子与蛋白质之间互作 的预测和整合。STITCH 的数据来源包括:实验验证、数据库挖掘(KEGG、DrugBank)、文本挖掘,以及基于结构相似性的预测。
说实话,STITCH 在我早期的重定位工作里帮了大忙。有一次我要找一个老药的新靶点,DrugBank 里只列了 3 个靶点,而 STITCH 给出了 27 个,其中 2 个后来在文献里被验证了——虽然预测分数不高,但至少给了我线索。
3.3.1 核心数据字段
- chemical:用 PubChem CID 或 STITCH ID 标识
- protein:用 Ensembl 蛋白 ID 或 UniProt 标识
- combined_score:0~999 的置信度分数,越高越可靠
- experimental:实验证据分数(0~1)
- database:来自数据库的分数
- textmining:文本挖掘分数,来源是 PubMed 摘要共现分析
# STITCH 数据文件示例(tab 分隔)
# 格式:chemical protein combined_score experimental database textmining
CID000004827 ENSP00000359055 876 0.9 0.85 0.72
CID000004827 ENSP00000359822 342 0.0 0.0 0.68
CID000004827 ENSP00000361125 998 1.0 1.0 0.90
3.4 数据源横向对比
每次讲课都有人问:这三个库到底选哪个?我的回答永远是——不全用等于白做。因为三个库的维度不同,互补性很强。
| 维度 | DrugBank | CTD | STITCH |
|---|---|---|---|
| 类型 | 结构化知识库 | 关联数据库 | 互作预测网络 |
| 覆盖药物数 | ~14000(含实验阶段) | ~17000 种化学物 | ~68000 种化学物 |
| 数据质量 | 最高(人工审核+文献验证) | 高(明确标记证据类型) | 中到高(部分来自计算预测) |
| 核心用法 | 获取药物靶点、通路、适应症 | 建立化学-疾病桥梁关系 | 扩展药物-蛋白互作网络 |
| 下载格式 | XML / CSV | TSV(结构化良好) | TSV + SIF 网络文件 |
| 更新频率 | 每年 1~2 次 | 每月更新 | 每季度更新 |
| 学术免费 | 是(注册后可下载) | 是(无需注册) | 是(最多 20 万条记录) |
3.5 数据整合流程(SVG)
为了让你直观理解这几个数据源怎么串起来,我画了一张流向图。从数据流的角度看,它们是这样配合的:
3.6 入手建议
如果你是第一次接触这些数据源,我建议按这个顺序入手:
- 先去 DrugBank 下载全量 XML,解析出药物-靶点-适应症三元组。这是你最可信的骨架数据。
- 再用 CTD 补全化学-疾病直接关联,注意严格过滤 evidencetype。这一步能帮你快速找到「老药新病」候选。
- 最后用 STITCH 扩展药物-蛋白互作网络,并且把阈值设在 700 以上。这样可以降低随机噪声,保留真正有潜力的候选。