解析DrugBank数据库数据|Python
一、DrugBank 数据库简介
DrugBank 是一个综合性的生物信息学和化学信息学数据库,专门收录药物和靶点的详细信息。它由加拿大阿尔伯塔大学的 Wishart 研究组 维护,提供化学、药理学、相互作用、代谢、靶点等多方面的药物数据。DrugBank 结合了实验数据和计算预测,广泛应用于药物研发、精准医疗、生物信息学研究等领域。
二、下载公开的数据
DrugBank 提供了多种方式下载其数据库,包括 免费的开放数据 和 需要许可的完整数据库。如果需要完整的 DrugBank 数据(包括所有药物、靶点、相互作用等),则需要 注册账户并申请许可。申请页面:DrugBank Release Version 5.1.13 | DrugBank Online
申请步骤
- 创建 DrugBank 账户:注册页面
- 选择许可类型
- Academic License(学术许可,免费):用于非商业科研,如生物信息学研究、论文分析等。
- Commercial License(商业许可,收费):适用于制药公司、AI 药物研发等商业用途。
- 提交申请,等待 DrugBank 审核。
- 批准后,可下载完整数据库(通常为 XML、CSV、SQL 格式)
这里我们先把免费的开放的药物信息数据下载下来用Python解析。下载的SDF格式,我们需要用到Rdkit包来读取结构文件。
三、Python解析药物SDF文件
import pandas as pd
from rdkit import Chem
from rdkit.Chem.MolStandardize import rdMolStandardize
from rdkit import RDLogger
RDLogger.DisableLog('rdApp.*')
def get_drug_info(drug_file, current_dir):
drug_list = []
drug_dict = {}
supplier = Chem.SDMolSupplier(drug_file)
for mol in supplier:
if mol is not None:
mol_id = mol.GetProp('DRUGBANK_ID')
drug_name = mol.GetProp('COMMON_NAME')
# smiles = Chem.MolToSmiles(mol, isomericSmiles=True, canonical=True)
# smiles = standardize_smiles(smiles)
smiles = Chem.MolToSmiles(mol)
drug_list.append([mol_id, drug_name, smiles])
drug_dict[mol_id] = smiles
drug_df = pd.DataFrame(drug_list, columns=['ID', 'Name', 'SMILES'])
drug_df.to_csv(current_dir + '/drug_information.csv', index=False)
return drug_dict
current_dir = './'
drug_info_file = current_dir + 'drugbank_structures_2025_02_14.sdf'
drug_id_smi_dic = get_drug_info(drug_info_file, current_dir)
print('Done!')
处理好的文件可在这里drugbank_2025_02_14下载。
四、Python解析药物XML文件
import json
import os
import xmltodict
import pandas as pd
"""
From xml file to extract drug and traget information.
"""
current_dir = os.path.dirname(os.path.abspath(__file__))
# 读取 XML 文件并转换为 JSON
xml = open(current_dir + "/full-database.xml", encoding="utf-8").read()
xml2json = xmltodict.parse(xml, encoding="utf-8")
# 将数据保存为JSON文件,设置缩进为4个空格
with open("drugbank.json", 'w', encoding='utf-8') as file:
json.dump(xml2json, file, ensure_ascii=False, indent=4)
drugs = xml2json['drugbank']['drug']
results = []
for drug in drugs:
try:
drug_id = drug['drugbank-id'][0]['#text']
except:
drug_id = drug['drugbank-id']['#text']
drug_name = drug['name']
try:
targets = drug['targets']['target']
except:
continue
drug_type = drug['@type']
if isinstance(targets, dict):
try:
uniprot_id = targets['polypeptide']['@id']
except:
continue
target_id = targets['id']
target_name = targets['name']
results.append([drug_id, drug_name, drug_type, uniprot_id, target_name])
if isinstance(targets, list):
for target in targets:
try:
uniprot_id = target['polypeptide']['@id']
except:
continue
target_id = target['id']
target_name = target['name']
results.append([drug_id, drug_name, drug_type, uniprot_id, target_name])
my_columns = ['DrugBank ID', 'Drug Name', 'Drug Type', 'UniProt ID', 'Target Name']
df = pd.DataFrame(results, columns=my_columns)
df.to_csv(current_dir + '/drugbank.csv', index=False)