解析DrugBank数据库数据|Python

news2025/5/11 13:55:51

一、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.coloradmin.cn/o/2301495.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

专题 - Java Stream API

概述 分类 数据源 任何位置。 如:集合、数组、文件、随机数、 Stream 静态工厂等。 支持的数据类型 整型、长整型、双精度浮点型基本数据类型。引用数据类型。流管道的数据处理流程 流管道必须要有终止操作。否则永不执行,只是一个静默的无操作指令。流管道是懒运算的。当执…

【前端框架】vue2和vue3的区别详细介绍

Vue 3 作为 Vue 2 的迭代版本,在性能、语法、架构设计等多个维度均有显著的变革与优化。以下详细剖析二者的区别: 响应式系统 Vue 2 实现原理:基于 Object.defineProperty() 方法实现响应式。当一个 Vue 实例创建时,Vue 会遍历…

大模型WebUI:Gradio全解11——使用transformers.agents构建Gradio UI(3)

大模型WebUI:Gradio全解11——使用transformers.agents构建Gradio UI(3) 前言本篇摘要11. 使用transformers.agents构建Gradio UI11.3 创建和使用工具Tools11.3.1 默认工具箱与load_tool11.3.2 创建新工具11.3.3 管理代理的工具箱toolbox11.3…

路由基础 | 路由引入实验 | 不同路由引入方式存在的问题

注:本文为 “路由基础 | 路由表 | 路由引入” 相关文章合辑。 未整理去重。 路由基本概念 1—— 路由表信息、路由进表以及转发流程、最长掩码匹配原则 静下心来敲木鱼已于 2023-11-26 14:06:22 修改 什么是路由 路由就是指导报文转发的路径信息,可以…

网络原理-HTTP/HTTPS

文章目录 HTTPHTTP 是什么?理解“应用层协议”理解 HTTP 协议的⼯作过程HTTP 协议格式抓包⼯具的使用抓包⼯具的原理抓包结果协议格式总结 HTTP 请求(Request)认识 URLURL 的基本格式关于URL encode 认识“⽅法”(method&#xff…

SpringBoot启动失败之application.yml缩进没写好

修改前: spring前面空格了 报错输出:Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured. Reason: Failed to determine a suitable driver class Action: Consider the follow…

python爬虫系列课程2:如何下载Xpath Helper

python爬虫系列课程2:如何下载Xpath Helper 一、访问极简插件官网二、点击搜索按钮三、输入xpath并点击搜索四、点击推荐下载五、将下载下来的文件解压缩六、打开扩展程序界面七、将xpath.crx文件拖入扩展程序界面一、访问极简插件官网 极简插件官网地址:https://chrome.zzz…

CentOS建立ssh免密连接(含流程剖析)

一、场景举例(为啥需要免密连接) 1.服务集群间文件复制、通信 2.执行定时触发自动化脚本 3.本地连接远程服务器操作 服务器台数有很多,以上举例都是属于服务器之间的通信,如果每次执行上面操作都要输入账号密码岂不是效率太高了,容易被开…

自由学习记录(36)

Linux Linux 是一个开源的操作系统,其内核及大部分组件都遵循自由软件许可证(如 GPL),允许用户查看、修改和分发代码。这种开放性使得开发者和企业可以根据自己的需求定制系统​。 “Linux”严格来说只是指由Linus Torvalds最初开…

【python碎碎笔记】

1.交互模式和编辑器模式 2. 保存文件格式.py (表示python文件) 3.缩进是python的命! 4.内置函数 dir(__builtins__) [ArithmeticError, AssertionError, AttributeError, BaseException, BaseExceptionGroup, BlockingIOError, Broken…

【OS安装与使用】part3-ubuntu安装Nvidia显卡驱动+CUDA 12.4

文章目录 一、待解决问题1.1 问题描述1.2 解决方法 二、方法详述2.1 必要说明2.2 应用步骤2.2.1 更改镜像源2.2.2 安装NVIDIA显卡驱动:nvidia-550(1)查询显卡ID(2)PCI ID Repository查询显卡型号(3&#xf…

python-leetcode 37.翻转二叉树

题目: 给定一颗二叉树的根节点root,翻转这棵二叉树,并返回根节点 方法一:递归 从根节点开始,递归地对树进行遍历,并从叶子节点先开始翻转。如果当前遍历到的节点root的左右两棵子树都已经翻转,那么我们只…

Vue 实现通过URL浏览器本地下载 PDF 和 图片

1、代码实现如下: 根据自己场景判断 PDF 和 图片,下载功能可按下面代码逻辑执行 const downloadFile async (item: any) > {try {let blobUrl: any;// PDF本地下载if (item.format pdf) {const response await fetch(item.url); // URL传递进入i…

android,flutter 混合开发,pigeon通信,传参

文章目录 app效果native和flutter通信的基础知识1. 编解码器 一致性和完整性,安全性,性能优化2. android代码3. dart代码 1. 创建flutter_module2.修改 Android 项目的 settings.gradle,添加 Flutter module3. 在 Android app 的 build.gradl…

unity学习47:寻路和导航,unity2022后版本如何使用 Navmesh 和 bake

目录 1 寻路和导航对移动的不同 1.1 基础的移动功能 1.1.1 基础移动 1.1.2 智能导航寻路 1.1.3 智能导航寻路还可以 2 如何实现这个效果? 2.1 通过地图网格的形式 2.1.1 警告信息 the static value has been deprecated的对应搜索 2.1.2 新的navigation ba…

跟着李沐老师学习深度学习(十二)

循环神经网络 序列模型 序列数据 实际中很多数据是有时序结构的 比如:电影的评价随时间变化而变化 拿奖后评分上升,直到奖项被忘记看了很多好电影后,人们的期望变高季节性:贺岁片、暑期档导演、演员的负面报道导致评分变低 核心思想&#…

深入解析NoSQL数据库:从文档存储到图数据库的全场景实践

title: 深入解析NoSQL数据库:从文档存储到图数据库的全场景实践 date: 2025/2/19 updated: 2025/2/19 author: cmdragon excerpt: 通过电商、社交网络、物联网等12个行业场景,结合MongoDB聚合管道、Redis Stream实时处理、Cassandra SSTable存储引擎、Neo4j路径遍历算法等42…

STM32物联网终端实战:从传感器到云端的低功耗设计

STM32物联网终端实战:从传感器到云端的低功耗设计 一、项目背景与挑战分析 1.1 物联网终端典型需求 (示意图说明:传感器数据采集 → 本地处理 → 无线传输 → 云端存储) 在工业物联网场景中,终端设备需满足以下核心需…

[实现Rpc] 客户端划分 | 框架设计 | common类的实现

目录 3. 客户端模块划分 3.1 Network模块 3.2 Protocol模块 3.3 Dispatcher模块 3.4 Requestor模块 3.5 RpcCaller模块 3.6 Publish-Subscribe模块 3.7 Registry-Discovery模块 3.8 Client模块 4. 框架设计 4.1 抽象层 4.2 具象层 4.3 业务层 ⭕4.4 整体设计框架…

【SFRA】笔记

GK_SFRA_INJECT(x) SFRA小信号注入函数,向控制环路注入一个小信号。如下图所示,当前程序,小信号注入是在固定占空比的基础叠加小信号,得到新的占空比,使用该占空比控制环路。 1.2 GK_SFRA_COLLECT(x, y) SFRA数据收集函数,将小信号注入环路后,该函数收集环路的数据,以…