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 结构里,每个 节点下会有多个 子节点。解析时建议用 SAX 或迭代式解析,不要一次性把 1.2 GB 的 XML 塞进内存——我吃过这个亏,服务器直接 OOM 崩了。

# 用 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()
技巧:DrugBank 的「action」字段(激动、拮抗、抑制剂等)在做机制推断时极其有用,建议保留。
警告:DrugBank 免费版只有 0.5 版之前的全序列数据。新版 XML 中部分靶点的序列被截断了,如果你需要做对接或序列比对,得另外去 UniProt 补全。

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 不直接给「药→疾病」推荐,但你可以通过两条路径推导:

  1. 化学 → 基因 → 疾病:用 CTD_chem_gene_ixns 找到受药物影响的基因,再用 CTD_gene_disease 找到这些基因参与的疾病。
  2. 化学 → 疾病直接关联:在 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
这里要特别小心:STITCH 的 textmining 分数可能产生大量假阳性。我见过一个案例,仅靠共现就给出 0.8 以上的分数,但实际上两个实体只是在同一篇综述中被并列提及,根本没有直接互作。我的习惯是:只用 combined_score ≥ 700 且 experimental > 0 的记录做正样本。

3.4 数据源横向对比

每次讲课都有人问:这三个库到底选哪个?我的回答永远是——不全用等于白做。因为三个库的维度不同,互补性很强。

维度 DrugBank CTD STITCH
类型 结构化知识库 关联数据库 互作预测网络
覆盖药物数 ~14000(含实验阶段) ~17000 种化学物 ~68000 种化学物
数据质量 最高(人工审核+文献验证) 高(明确标记证据类型) 中到高(部分来自计算预测)
核心用法 获取药物靶点、通路、适应症 建立化学-疾病桥梁关系 扩展药物-蛋白互作网络
下载格式 XML / CSV TSV(结构化良好) TSV + SIF 网络文件
更新频率 每年 1~2 次 每月更新 每季度更新
学术免费 是(注册后可下载) 是(无需注册) 是(最多 20 万条记录)

3.5 数据整合流程(SVG)

为了让你直观理解这几个数据源怎么串起来,我画了一张流向图。从数据流的角度看,它们是这样配合的:

药物重定位数据整合流程 DrugBank 药物·靶点·通路·适应症 CTD 化学·基因·疾病关联 STITCH 化学-蛋白互作网络 数据预处理 & 标准化 ID映射(PubChem CID / UniProt / Ensembl) 字段清洗 · 去重 · 证据评分过滤 多源数据整合 构建统一知识图谱 · 特征矩阵 · 正负样本集 Ready for Model Building 提示:建议优先完成 DrugBank → CTD 的 ID 映射,再补充 STITCH 扩展覆盖

3.6 入手建议

如果你是第一次接触这些数据源,我建议按这个顺序入手:

  1. 先去 DrugBank 下载全量 XML,解析出药物-靶点-适应症三元组。这是你最可信的骨架数据。
  2. 再用 CTD 补全化学-疾病直接关联,注意严格过滤 evidencetype。这一步能帮你快速找到「老药新病」候选。
  3. 最后用 STITCH 扩展药物-蛋白互作网络,并且把阈值设在 700 以上。这样可以降低随机噪声,保留真正有潜力的候选。
经验小贴士:三个库的 ID 系统并不互通。DrugBank 用的 DB 编号、CTD 用 MeSH 化学物 ID 和 CAS 号、STITCH 用 PubChem CID。我一般会建一张全局 ID 映射表,用 PubChem CID 做桥梁。这个映射表我会在后续章节里教你如何自动化构建。