第4章 数据获取:公开数据库(ChEMBL, PubChem, ZINC, DrugBank)
搞AI药物发现,数据就是燃料。这可不是一句口号,我刚开始做这个方向时就吃过亏——花了一周折腾模型,最后发现训练数据里混了不少结构错误的分子,结果全白干了。所以选对数据库、拿到干净数据,比调模型参数重要得多。
今天咱们把四个最常用的公开数据库过一遍:ChEMBL、PubChem、ZINC、DrugBank。每个我都用过,踩过坑,也攒了些小技巧。你想想看,如果能把这些数据源玩熟了,搭建管线时就相当于有了自己的弹药库。
1. ChEMBL — 生物活性数据的金标准
ChEMBL 是我个人最常用的数据库之一。它收录了药物分子对靶点的结合亲和力数据(Ki、IC50、EC50 等),而且数据质量很高,有专家人工审查过。说白了,你要做活性预测模型,ChEMBL 是首选。
获取 ChEMBL 数据最推荐的方式是直接用 Python 的 chembl_webresource_client 库。下面是获取某个靶点所有活性分子的例子:
from chembl_webresource_client.new_client import new_client
targets = new_client.target
target = targets.get('CHEMBL203')
print(target['pref_name'])
activities = new_client.activity
activity_list = activities.filter(target_chembl_id='CHEMBL203')
for act in activity_list[:5]:
print(act['molregno'], act['standard_value'], act['standard_type'])
你也可以直接下载 MySQL dump 或 PostgreSQL 格式的完整数据库文件,自己搭个本地环境。不适合用 API 大批量拉取的话,本地副本更高效。
2. PubChem — 最全面的化合物百科
PubChem 的体量非常大,化合物总数超过 1.1 亿(截止 2024 年)。它不仅包含生物活性数据,还有化学结构、理化性质、安全信息等。说实话,很多时候你可以在 PubChem 找到 ChEMBL 没有的分子。
PubChem 提供了多个接口,我最常用的是 PUG REST 和 PUG View。通过 compound 的 CID 或 SMILES 查询,速度很快。下面是个简单的批量查询例子:
import requests, json
cids = [2244, 2245, 2246] # 阿司匹林、扑热息痛等
url = f'https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/cid/{",".join(map(str,cids))}/property/MolecularWeight,MolecularFormula,SMILES/JSON'
resp = requests.get(url)
data = resp.json()
for prop in data['PropertyTable']['Properties']:
print(prop['CID'], prop['MolecularWeight'], prop['MolecularFormula'])
3. ZINC — 虚拟筛选的采购清单
ZINC 的定位很明确:它收录的是“可购买”的化合物,而且会标注供应商、价格、是否是“类药”分子(Rule-of-Five 过滤)。做虚拟筛选时,ZINC 是首选的化合物来源,毕竟你不能在虚拟世界中合成虚拟分子。
ZINC 提供多种下载格式:SMILES、SDF、甚至预先生成的分子指纹。我记得有一次需要快速搭建一个百万级分子库,直接从 ZINC 的 FTP 下载了一个 .smi 文件,用 Pandas 一行代码就读进来了:
import pandas as pd
df = pd.read_csv('https://zinc.docking.org/substance/scripts/zinc_id_smiles.txt.gz',
sep='\t', header=None, names=['ZINC_ID', 'SMILES'])
4. DrugBank — 已上市药物的知识库
DrugBank 是 FDA 批准药物和临床试验药物的数据库,它不光有化学信息,还有详细的药理学、药代动力学、靶点、代谢途径等。如果你想做重定位(drug repurposing)或者了解药物副作用,DrugBank 是必须考的。
DrugBank 的数据获取分两种:开放版本(免费,但条目少一些)和完整版(需要学术申请或购买)。开放版大概包含 13000 种药物,对于多数课题已经够用。
下面是一个用 Python 解析 DrugBank XML 文件(开放版)的示例:
import xml.etree.ElementTree as ET
tree = ET.parse('drugbank_all_open.xml')
root = tree.getroot()
ns = {'db': 'http://www.drugbank.ca'}
for drug in root.findall('db:drug', ns):
name = drug.findtext('db:name', ns)
type_ = drug.get('type')
print(name, type_)
四个数据库对比一览
| 数据库 | 主要数据类型 | 规模(化合物数) | 更新频率 | 典型用途 |
|---|---|---|---|---|
| ChEMBL | 生物活性(Ki/IC50)、分子结构、靶点 | ~200 万 | 半年 | 活性预测模型、SAR 分析 |
| PubChem | 化合物性质、生物活性、安全信息 | ~1.1 亿 | 持续更新 | 大规模虚拟筛选、性质预测 |
| ZINC | 可购买化合物、3D 结构、供应商信息 | ~4.5 亿 | 每季度 | 分子对接、化合物库构建 |
| DrugBank | 已上市药物、药理/药代、靶点通路 | ~13000(开放) | 每年 | 药物重定位、副作用分析 |
实战建议:如何选数据库
我一般按这个逻辑来决定用哪个:
- 要是做 QSAR/活性预测,ChEMBL 是首选,补充 PubChem 的 BioAssay 数据。
- 做 虚拟筛选,直接用 ZINC 的“lead-like”或“drug-like”子集,省去过滤步骤。
- 做 药物重定位,DrugBank + ChEMBL 的已知靶点数据就够了。
- 要是需要 大规模负样本(非活性分子),从 PubChem 或 ZINC 随机抽取。
rdkit 把不同数据库的分子统一标准化(比如加氢、去盐、归一化 SMILES),这样后续合并数据时不会因为格式问题翻车。