当前位置: 首页 > article >正文

解析DrugBank数据库数据|Python

一、DrugBank 数据库简介

DrugBank 是一个综合性的生物信息学和化学信息学数据库,专门收录药物和靶点的详细信息。它由加拿大阿尔伯塔大学的 Wishart 研究组 维护,提供化学、药理学、相互作用、代谢、靶点等多方面的药物数据。DrugBank 结合了实验数据和计算预测,广泛应用于药物研发、精准医疗、生物信息学研究等领域。

二、下载公开的数据

DrugBank 提供了多种方式下载其数据库,包括 免费的开放数据需要许可的完整数据库。如果需要完整的 DrugBank 数据(包括所有药物、靶点、相互作用等),则需要 注册账户并申请许可申请页面:DrugBank Release Version 5.1.13 | DrugBank Online

申请步骤

  1. 创建 DrugBank 账户:注册页面
  2. 选择许可类型
    • Academic License(学术许可,免费):用于非商业科研,如生物信息学研究、论文分析等。
    • Commercial License(商业许可,收费):适用于制药公司、AI 药物研发等商业用途。
  3. 提交申请,等待 DrugBank 审核。
  4. 批准后,可下载完整数据库(通常为 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)

http://www.kler.cn/a/553153.html

相关文章:

  • KTransformers如何通过内核级优化、多GPU并行策略和稀疏注意力等技术显著加速大语言模型的推理速度?
  • JVM 类加载器深度解析(含实战案例)
  • 有名管道的空间大小
  • [实现Rpc] 消息抽象层的具体实现
  • IO进程 day01
  • MySQL 安装过程记录以及安装选项详解
  • 寒假总结。
  • 基于Java(JSP)+MySQL设计与实现的 MVC 鲜花订购系统
  • “以数治税”时代 数据要素的价值挖掘
  • 昇腾DeepSeek模型部署优秀实践及FAQ
  • 图解长短期记忆网络(LSTM)
  • Yocto项目:如何部署AI——完整指南*
  • 基于开源Odoo、SKF Phoenix API与IMAX-8数采网关的圆织机设备智慧运维实施方案 ——以某纺织集团圆织机设备管理场景为例
  • SpringCloud面试题----什么是Feign?是如何实现负载均衡的
  • OSPF(开放路径最短优先)
  • JAX-RS与JAXB:实现XML数据交互的完整指南
  • 萌新学 Python 之 if 语句的三目运算符
  • C++ stack:数据结构的“叠盘子艺术”与“后进先出法则
  • Python 爬虫selenium
  • 细说Java 引用(强、软、弱、虚)和 GC 流程(一)