2 数据来源:公开数据库(DrugBank、KEGG、ChEMBL 等)介绍与获取归纳总结
做药物图谱分析,第一步就是搞到靠谱的数据。你想想看,不管算法多漂亮,数据是脏的,结论就是废的。这些年我踩过不少坑——从网上爬下来一堆格式错乱的化合物,结果预处理花了三倍于分析的时间。所以这一章,咱就聊聊几个最常用的公开数据库,怎么获取,怎么避坑,以及我个人的一些习惯。
2.1 为什么是这些数据库?
药物信息学涉及的公开数据库少说有几十个,但真正做 Visual Analytics 用得最顺手、社区维护最勤的,无非这三家:DrugBank、KEGG、ChEMBL。它们分别覆盖了药物靶点、代谢通路和生物活性三个核心视角。
下面这张图能帮你快速建立这三个数据库的定位关系:
2.2 DrugBank:药物与靶点权威库
DrugBank 是目前最全面的药物-靶点知识库。它把所有药物分为两类:获批药物 和 实验阶段药物。每个条目都包含化学结构、靶点、作用机制、药物相互作用等信息。
获取方式很简单。官方提供 XML 和 CSV 两种格式的完整下载。我个人习惯用 XML,因为结构更完整,但解析起来稍微费力一点。
| 字段名 | 说明 | 数据类型 |
|---|---|---|
| drugbank-id | 唯一标识,如 DB00001 | 字符串 |
| name | 通用名 | 字符串 |
| targets | 靶点列表(基因名、UniProt ID) | 嵌套结构 |
| groups | 分类(approved / experimental) | 枚举 |
| drug-interactions | 药物-药物相互作用 | 列表 |
用 Python 解析 XML 的代码大概长这样:
import xml.etree.ElementTree as ET
tree = ET.parse("drugbank.xml")
root = tree.getroot()
ns = {"db": "http://www.drugbank.ca"}
for drug in root.findall("db:drug", ns):
drug_id = drug.find("db:drugbank-id", ns).text
name = drug.find("db:name", ns).text
targets = drug.findall("db:targets/db:target", ns)
print(f"{drug_id}: {name}, {len(targets)} targets")
iterparse 逐元素处理。
2.3 KEGG:通路与系统生物学
KEGG(Kyoto Encyclopedia of Genes and Genomes)是日本京都大学和生物信息学中心维护的。它最出名的是通路图(Pathway Maps),但还包含疾病、基因、化合物、药物等多个子库。
获取方式有点特殊。KEGG 官方不提供完整的一键下载(受许可协议限制),但提供了 KEGG API,可以通过 HTTP GET 请求获取数据。我用得比较多的是 list 和 get 两个命令。
举个例子,获取 human 通路列表:
curl -X GET "https://rest.kegg.jp/list/pathway/hsa" > hsa_pathways.txt
然后获取具体通路内容:
curl -X GET "https://rest.kegg.jp/get/hsa00010" > glycolysis.txt
KEGG 返回的内容是纯文本格式,带一定的结构化缩进。我一般用 Python 正则解析:
import requests
import re
response = requests.get("https://rest.kegg.jp/get/hsa00010")
text = response.text
# 提取通路中的基因列表
genes = re.findall(r"([A-Z0-9]+)\s+\([^)]+\)", text)
print(genes[:10])
time.sleep(1),否则会被封 IP。还有,KEGG 的数据更新较慢,新近发表的药物通路可能还没收录。
2.4 ChEMBL:生物活性与文献挖掘
ChEMBL 由 EMBL-EBI 维护,是目前最大的开放药物活性数据库。它收录了从文献中手工挖掘的化合物-靶点结合数据,包括 IC50、Ki、EC50 等。这对 Visual Analytics 来说特别重要——你可以在图上直接标注活性值。
ChEMBL 提供两种获取路径:
- 直接下载 MySQL dump:适合本地搭建全量数据库。文件较大(约 20GB 压缩后),但查询灵活。
- ChEMBL Web Services API:轻量级,适合按需查询。我最常用的是
chembl_id_lookup和activity端点。
用 API 查询某个化合物的活性数据(以 CHEMBL25 为例):
import requests
url = "https://www.ebi.ac.uk/chembl/api/data/activity"
params = {
"molecule_chembl_id": "CHEMBL25",
"limit": 10,
"format": "json"
}
response = requests.get(url, params=params)
data = response.json()
for act in data["activities"]:
print(act["standard_type"], act["standard_value"], act["standard_units"])
返回的结果一般包含活性类型、数值、单位、靶点等信息。我会直接转成 DataFrame 做后续分析。
| 对比维度 | DrugBank | KEGG | ChEMBL |
|---|---|---|---|
| 核心内容 | 药物-靶点 | 代谢通路 | 生物活性 |
| 数据粒度 | 药物条目 | 通路反应 | 单一实验 |
| 获取方式 | XML/CSV 下载 | API 按需获取 | MySQL dump / API |
| 更新频率 | 每年 1-2 次 | 不定期 | 每季度 |
| 主要用途 | 靶点发现 | 通路分析 | 活性筛选 |
2.5 获取数据的常见陷阱
这些年我总结出几个新手最容易犯的错:
- 版本不一致:DrugBank 每年会出新版,不同版本之间字段可能变化。我建议在做项目前固定一个版本号,并在代码里写死版本校验。
- ID 映射混乱:同一个药物在不同库里的 ID 不一样。需要用 UniProt、ChEBI 或 PubChem CID 做交叉映射。我一般先拉一张映射表。
- 许可协议:KEGG 的学术和非商业使用是免费的,但商业使用需要付费。DrugBank 和 ChEMBL 相对宽松,但也要看具体条款。
- 数据洁癖:ChEMBL 里有大量“不活跃”数据,如果全拿来用,Visual Analytics 图上会乱成一片。我习惯只保留
pChEMBL > 5的条目。
2.6 小结与实操建议
总结一下:做药物图谱 Visual Analytics,数据源选对了就成功了一半。我个人最常用的组合是 DrugBank 做靶点骨架、ChEMBL 做活性填充、KEGG 做通路上下文。在后续章节中,我会演示如何把这三个来源的数据融合成一个统一的知识图谱。
最后分享一个小技巧:写 Python 脚本时,把每个数据库的 API 调用封装成独立的函数,加上重试和日志。这样即使某个库挂了,也不影响整体流程。嗯,这就是经验带来的习惯。