一、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] = smilesdrug_df = pd.DataFrame(drug_list, columns=['ID', 'Name', 'SMILES'])drug_df.to_csv(current_dir + '/drug_information.csv', index=False)return drug_dictcurrent_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:continuedrug_type = drug['@type']if isinstance(targets, dict):try:uniprot_id = targets['polypeptide']['@id']except:continuetarget_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:continuetarget_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)