DrugBank 5.1.7 数据库解析:从数据获取到药物-靶点网络构建实战
简介DrugBank 5.17 是面向药物研发、生物信息学与计算药理学研究者的权威结构化数据资源提供覆盖化学、靶点、药代动力学及临床信息的完整药物知识体系助力新药发现、多靶点分析与知识图谱构建。压缩包为单文件 ZIP140.19MB内含唯一核心文件——结构严谨的 full database.xml该 XML 文件以标准标签组织全部药物条目涵盖通用名/商品名、SMILES/InChI 结构表示、ATC 分类、靶点类型与亲和力、半衰期与生物利用度、适应症与药物相互作用等关键字段支持 DOM/SAX 等主流解析方式。已有 2160 人学习下载适用于需批量提取结构化药物数据的研究人员与开发者。读者可直接加载该 XML 进行靶点富集分析、构建本地药物数据库或对接 Python/Java/R 生态工具链无需额外清洗开箱即用。1. 项目概述从数据库到知识图谱的跨越如果你在药物研发、生物信息学或者计算化学领域摸爬滚打过一段时间那么“DrugBank”这个名字对你来说绝对不是一个陌生的词汇。它远不止是一个简单的数据库更像是一座连接化学、药理学、基因组学和临床医学的桥梁。我最早接触DrugBank还是在做靶点预测项目的时候当时需要批量获取药物的靶点信息、ADMET性质以及已知的相互作用市面上能免费提供如此结构化、高质量数据的资源DrugBank几乎是唯一的选择。后来随着项目深入从早期的版本用到5.0再到现在的5.1.7我亲眼见证了它从一个相对基础的药物信息库演变成一个集成了多组学数据、通路信息、药物标签和临床数据的综合性知识平台。“DrugBank 5.1.7”这个标题指的就是该数据库在2021年7月左右发布的5.1.7版本。对于外行来说这可能只是一个版本号但对于我们这些需要用它来“吃饭”的研究者和开发者而言每一个小数点后面的数字变动都可能意味着数百条新记录的增加、数据结构的优化、API接口的调整甚至是整个分析逻辑的更新。这个版本在当时是一个重要的稳定版修复了之前版本的一些问题并整合了更多来自FDA、临床试验和最新文献的数据。简单来说它解决的核心问题就是如何为药物发现和重定位研究提供一个可信、全面且易于计算处理的数据源。无论是想筛选具有特定作用机制的化合物还是分析药物的副作用网络或是构建药物-靶点-疾病的知识图谱DrugBank 5.1.7都是一个绕不过去的起点。它适合药物化学家、生物信息学家、医学研究者以及任何希望将数据驱动方法应用于医药领域的从业者。2. DrugBank 5.1.7的核心架构与数据模型解析要真正用好DrugBank不能只停留在“下载数据然后查一查”的层面必须理解它的内在逻辑。DrugBank 5.1.7的数据模型设计得非常精巧它采用了分层和关联的思想将不同类型的实体如药物、靶点、酶、载体、转运体以及它们之间的关系如作用、抑制、诱导清晰地组织起来。2.1 核心数据实体及其关系整个数据库的核心是“药物”Drug实体。每一个药物条目都不仅仅是一个名字和结构式而是一个包含数十个字段的复杂对象。在5.1.7版本中一个典型的药物记录会包含以下核心信息块标识与分类包括DrugBank ID如DB00001、通用名、商品名、CAS号、化学式、分子量、以及基于ATC代码的治疗分类。这里特别需要注意的是DrugBank ID它是整个数据库内部链接的基石所有关联都通过它来建立。化学与物理性质提供了详细的化学描述包括SMILES字符串、InChI/InChI Key、二维和三维结构文件SDF/MOL2格式。这对于计算化学和分子对接模拟至关重要。此外还包含logP、pKa、水溶性等关键的ADMET预测或实验参数。药理学信息这是药物研发的核心包括作用机制、药理作用描述、适应症、禁忌症、吸收、分布、代谢、排泄ADME的详细数据以及来自FDA标签的黑色框警告。相互作用网络这是DrugBank最强大的部分之一。它明确列出了药物-靶点相互作用药物与哪些蛋白质靶点结合如酶、离子通道、GPCRs并注明作用是激动剂、拮抗剂、抑制剂还是底物。药物-酶相互作用药物被哪些细胞色素P450酶代谢或者抑制哪些酶。药物-载体/转运体相互作用药物与哪些转运蛋白结合影响其细胞摄取和外排。药物-药物相互作用基于药代动力学PK和药效学PD的已知或预测的药物间相互作用并给出严重程度评级。外部链接提供了到PubChem、ChEBI、KEGG Drug、PharmGKB、UniProt等权威数据库的链接方便进行深度数据挖掘。与“药物”实体紧密关联的是“靶点/蛋白”Target/Protein实体。每个靶点条目不仅包含蛋白名称、基因名、UniProt ID还包含了详细的序列信息、功能描述、亚细胞定位以及关键的PDB结构链接如果可用。在5.1.7版本中药物-靶点关系的证据等级也得到了加强区分了实验验证的和预测的相互作用。2.2 数据格式与获取方式DrugBank 5.1.7的数据主要以两种形式提供XML格式和CSV格式。这是选择使用策略的第一个关键决策点。XML格式这是最完整、结构最丰富的版本。它包含了上述所有数据实体和关系的完整嵌套结构。例如一个drug元素内部会嵌套targets、enzymes、carriers等子元素每个子元素又包含详细信息。这种格式非常适合需要深度解析、构建复杂知识图谱或进行全量数据分析的场景。它的缺点是文件体积巨大完整版超过1GB解析需要一定的编程能力通常使用Python的xml.etree.ElementTree或lxml库。CSV格式为了方便快速分析DrugBank也提供了多个预生成的CSV文件例如“药物信息表”、“靶点信息表”、“药物-靶点相互作用表”等。这些是扁平化的表格每行代表一条记录列代表属性。CSV格式的优点是易于用Excel、R或Pandas快速打开和筛选特别适合进行统计分析和机器学习特征提取。缺点是信息被拆散在不同的文件中需要根据ID进行关联查询且可能丢失XML中的一些层级细节。实操心得对于大多数分析任务我建议从CSV文件开始快速验证想法和进行探索性数据分析EDA。当需要构建一个包含所有关系的本地知识库或者开发一个需要频繁查询内部关系的应用程序时再转向解析完整的XML文件。在5.1.7版本中CSV文件的完整性已经很高对于药物-靶点网络分析、副作用预测等常见任务CSV文件基本够用。3. 本地化部署与数据预处理实战直接从DrugBank官网下载数据包只是第一步。要想高效、可重复地使用这些数据必须建立一套本地的数据处理流程。直接使用原始文件不仅慢而且容易出错。3.1 环境准备与数据下载首先你需要注册一个DrugBank账户学术用途通常是免费的。登录后在下载页面选择“DrugBank 5.1.7”版本你会看到“Full Database”和“CSV Files”等选项。根据你的需求下载对应的压缩包通常是.zip格式。我个人的标准工作环境是Python Jupyter Notebook配合Pandas、NumPy和NetworkX等库。以下是一个基础的准备脚本# 假设你已经下载了 drugbank_all_full_database.xml.zip 和 drugbank_all_csv.zip unzip drugbank_all_full_database.xml.zip -d ./drugbank_data/ unzip drugbank_all_csv.zip -d ./drugbank_data/csv/import pandas as pd import numpy as np import xml.etree.ElementTree as ET from tqdm import tqdm # 用于显示进度条 import os DATA_PATH ./drugbank_data/ CSV_PATH os.path.join(DATA_PATH, csv)3.2 解析XML文件并构建关系型数据库如果你决定使用XML文件解析是关键。由于文件巨大一次性加载到内存可能会失败。推荐使用迭代解析iterparse。def parse_drugbank_xml(xml_file): 迭代解析DrugBank XML文件提取核心信息。 返回药物列表和关系列表。 drugs_list [] targets_list [] drug_target_relations [] # 定义我们感兴趣的命名空间DrugBank XML有固定的命名空间 namespaces {db: http://www.drugbank.ca} # 使用iterparse进行流式解析 context ET.iterparse(xml_file, events(start, end)) context iter(context) event, root next(context) # 获取根元素 for event, elem in tqdm(context, descParsing XML): if event end and elem.tag {http://www.drugbank.ca}drug: # 当一个完整的drug元素解析结束时 drug_id elem.findtext(db:drugbank-id, namespacesnamespaces) name elem.findtext(db:name, namespacesnamespaces) description elem.findtext(db:description, namespacesnamespaces) drug_info { drugbank_id: drug_id, name: name, description: description[:500] if description else None, # 截断长文本 # ... 可以继续提取更多字段如SMILES, ATC代码等 } drugs_list.append(drug_info) # 提取靶点信息 targets elem.find(db:targets, namespacesnamespaces) if targets is not None: for target in targets.findall(db:target, namespacesnamespaces): target_id target.findtext(db:id, namespacesnamespaces) target_name target.findtext(db:name, namespacesnamespaces) uniprot_id target.findtext(db:polypeptide/db:external-identifiers/db:external-identifier[db:resourceUniProtKB]/db:identifier, namespacesnamespaces) if uniprot_id: # 记录靶点 target_info {uniprot_id: uniprot_id, name: target_name} if target_info not in targets_list: # 简单去重 targets_list.append(target_info) # 记录药物-靶点关系 relation { drugbank_id: drug_id, uniprot_id: uniprot_id, drug_name: name, target_name: target_name } drug_target_relations.append(relation) # 非常重要清理已处理的元素释放内存 elem.clear() root.clear() # 转换为DataFrame drugs_df pd.DataFrame(drugs_list) targets_df pd.DataFrame(targets_list) relations_df pd.DataFrame(drug_target_relations) return drugs_df, targets_df, relations_df # 调用函数 # drugs_df, targets_df, relations_df parse_drugbank_xml(os.path.join(DATA_PATH, full database.xml))注意事项内存管理elem.clear()和root.clear()是避免内存溢出的关键。对于超大的XML这是标准操作。命名空间DrugBank XML的每个标签都有{http://www.drugbank.ca}前缀在查找元素时必须指定否则会找不到。字段选择上述代码只提取了最基本的信息。在实际项目中你需要根据需求修改drug_info和target_info字典添加更多字段如smiles、indication、action作用机制等。解析逻辑会变得复杂但模式是相同的。保存中间结果解析一次XML耗时较长可能几十分钟。解析完成后立即将DataFrame保存为Parquet或Feather格式比CSV读写快得多方便后续快速加载。drugs_df.to_parquet(drugs.parquet) relations_df.to_parquet(drug_target_relations.parquet)3.3 使用CSV文件进行快速分析对于大多数场景使用预处理的CSV文件更快捷。下载的CSV包通常包含以下文件drugs.csv药物基本信息。targets.csv靶点/蛋白信息。drug_targets.csv药物-靶点关联表。enzymes.csv,carriers.csv,transporters.csv酶、载体、转运体信息及其与药物的关联。drug_interactions.csv药物-药物相互作用。# 加载CSV数据 drugs_df pd.read_csv(os.path.join(CSV_PATH, drugs.csv)) targets_df pd.read_csv(os.path.join(CSV_PATH, targets.csv)) drug_targets_df pd.read_csv(os.path.join(CSV_PATH, drug_targets.csv)) # 快速查看数据结构 print(drugs_df.info()) print(drug_targets_df.head()) # 一个简单的分析统计每个药物的靶点数量 target_count_per_drug drug_targets_df.groupby(drugbank_id).size().reset_index(nametarget_count) merged_df pd.merge(drugs_df[[drugbank_id, name]], target_count_per_drug, ondrugbank_id, howleft) merged_df[target_count] merged_df[target_count].fillna(0) print(merged_df.sort_values(target_count, ascendingFalse).head(10))实操心得CSV文件中的drugbank_id和uniprot_id或gene_name是进行表连接JOIN的黄金键。在进行任何分析前先用pd.merge将相关信息关联起来。例如想分析“治疗高血压的药物都作用于哪些靶点”你需要先筛选drugs.csv中适应症包含“hypertension”的药物再用它们的drugbank_id去drug_targets.csv里找对应的靶点最后用靶点的ID去targets.csv里获取靶点详情。4. 基于DrugBank 5.1.7的典型应用场景实现有了本地化处理好的数据我们就可以开展一系列有价值的分析。下面以两个最常见的场景为例展示具体的实现步骤。4.1 场景一构建药物-靶点相互作用网络并进行可视化这是网络药理学和系统生物学的基础。我们可以使用networkx库来构建和分析这个网络。import networkx as nx import matplotlib.pyplot as plt # 为了更好的可视化可以使用pyvis生成交互式网页图 # from pyvis.network import Network # 假设我们已经有了 relations_df (包含drugbank_id, uniprot_id, drug_name, target_name) # 构建一个无向图 G nx.Graph() # 添加节点和边 for _, row in relations_df.iterrows(): drug_node fDrug:{row[drug_name]} # 给药物节点加前缀便于区分 target_node fTarget:{row[target_name]} G.add_node(drug_node, typedrug, db_idrow[drugbank_id]) G.add_node(target_node, typetarget, up_idrow[uniprot_id]) G.add_edge(drug_node, target_node) print(f网络包含 {G.number_of_nodes()} 个节点 和 {G.number_of_edges()} 条边。) print(f其中药物节点{len([n for n, attr in G.nodes(dataTrue) if attr[type]drug])}) print(f靶点节点{len([n for n, attr in G.nodes(dataTrue) if attr[type]target])}) # 计算一些基本的网络拓扑特征 degree_centrality nx.degree_centrality(G) # 度中心性连接数多的节点更重要 betweenness_centrality nx.betweenness_centrality(G) # 中介中心性处于多条最短路径上的节点是关键枢纽 # 找出度最高的靶点可能是多靶点药物作用的“热门”靶点 target_nodes [n for n, attr in G.nodes(dataTrue) if attr[type]target] target_degrees {n: G.degree(n) for n in target_nodes} top_targets sorted(target_degrees.items(), keylambda x: x[1], reverseTrue)[:10] print(连接药物最多的前10个靶点) for target, deg in top_targets: print(f {target}: {deg} 个连接) # 简单可视化对于大型网络静态图会很杂乱建议用交互式或只画子图 plt.figure(figsize(15, 10)) # 只画出一个子网络示例比如与“EGFR”靶点相关的药物 ego nx.ego_graph(G, Target:EGFR, radius1) # 一度邻居子图 pos nx.spring_layout(ego, seed42) node_colors [lightblue if attr[type]drug else lightcoral for _, attr in ego.nodes(dataTrue)] nx.draw(ego, pos, with_labelsTrue, node_colornode_colors, node_size500, font_size8, edge_colorgray) plt.title(EGFR及其直接关联的药物网络) plt.show()注意事项DrugBank构建的网络通常非常庞大数万个节点数十万条边。直接用matplotlib绘制全图会是一团乱麻且毫无意义。正确的做法是分析先行可视化后行先计算网络指标度中心性、介数中心性、聚类系数等识别出关键节点枢纽药物或枢纽靶点。可视化子图围绕关键节点提取其邻居一度或二度构成子图进行可视化。使用交互式工具对于探索性分析强烈推荐使用pyvis生成HTML交互图可以拖动、缩放、点击查看节点属性。考虑网络类型药物-靶点网络是二分图两类节点。一些网络指标和布局算法对二分图有特殊处理可以寻找专门的库或方法。4.2 场景二基于分子描述符的相似性搜索与药物重定位药物重定位老药新用是DrugBank数据的一个重要应用。思路是如果药物A和药物B在化学结构上高度相似并且作用于相似的靶点群那么它们可能具有相似的适应症或副作用。from rdkit import Chem from rdkit.Chem import AllChem, DataStructs, Descriptors from rdkit.Chem.Draw import IPythonConsole from rdkit import RDLogger RDLogger.DisableLog(rdApp.*) # 禁用RDKit的警告日志保持输出整洁 import warnings warnings.filterwarnings(ignore) # 1. 准备数据从drugs_df中提取SMILES和DrugBank ID # 假设drugs_df包含smiles和drugbank_id列 drugs_smiles_df drugs_df[[drugbank_id, name, smiles]].dropna(subset[smiles]).copy() # 2. 计算分子指纹这里使用摩根指纹即圆形指纹是常用的相似性度量 def smiles_to_fp(smiles, radius2, nBits2048): 将SMILES字符串转换为摩根指纹位向量 mol Chem.MolFromSmiles(smiles) if mol is None: return None fp AllChem.GetMorganFingerprintAsBitVect(mol, radius, nBitsnBits) return fp print(正在计算分子指纹...) drugs_smiles_df[morgan_fp] drugs_smiles_df[smiles].apply(lambda x: smiles_to_fp(x)) # 移除无法生成指纹的分子 drugs_smiles_df drugs_smiles_df.dropna(subset[morgan_fp]).reset_index(dropTrue) print(f成功为 {len(drugs_smiles_df)} 个药物生成指纹。) # 3. 定义相似性搜索函数 def find_similar_drugs(query_smiles, df, top_n10, similarity_threshold0.7): 根据输入的SMILES在数据框中查找最相似的药物。 query_fp smiles_to_fp(query_smiles) if query_fp is None: print(无效的查询SMILES) return None similarities [] for idx, row in df.iterrows(): target_fp row[morgan_fp] # 计算Tanimoto相似度Jaccard相似度用于位向量 sim DataStructs.TanimotoSimilarity(query_fp, target_fp) similarities.append((row[drugbank_id], row[name], sim)) # 排序并过滤 similarities.sort(keylambda x: x[2], reverseTrue) # 排除与自身比较如果查询药物在库中 result [s for s in similarities if s[2] 0.999][:top_n] result [s for s in result if s[2] similarity_threshold] return pd.DataFrame(result, columns[drugbank_id, name, similarity]) # 4. 示例查找与“阿司匹林”化学结构相似的药物 aspirin_smiles CC(O)OC1CCCCC1C(O)O # 阿司匹林的SMILES similar_to_aspirin find_similar_drugs(aspirin_smiles, drugs_smiles_df, top_n15) print(与阿司匹林结构相似度最高的药物) print(similar_to_aspirin.head(10)) # 5. 结合靶点信息进行验证查看这些相似药物的靶点是否有重叠 # 获取阿司匹林的靶点 aspirin_id drugs_smiles_df.loc[drugs_smiles_df[smiles]aspirin_smiles, drugbank_id].values if len(aspirin_id) 0: aspirin_targets set(drug_targets_df.loc[drug_targets_df[drugbank_id]aspirin_id[0], uniprot_id]) print(f\n阿司匹林 ({aspirin_id[0]}) 的靶点数量: {len(aspirin_targets)}) for _, sim_drug in similar_to_aspirin.iterrows(): sim_targets set(drug_targets_df.loc[drug_targets_df[drugbank_id]sim_drug[drugbank_id], uniprot_id]) common_targets aspirin_targets.intersection(sim_targets) overlap_ratio len(common_targets) / len(aspirin_targets) if aspirin_targets else 0 print(f药物 {sim_drug[name]} (相似度{sim_drug[similarity]:.3f}) 与阿司匹林共享 {len(common_targets)} 个靶点重叠率 {overlap_ratio:.2%})实操心得指纹选择摩根指纹Morgan FP是最常用的选择但也可以尝试其他指纹如MACCS Keys、Atom Pairs等不同的指纹捕捉不同的分子特征。相似度阈值Tanimoto相似度大于0.7通常被认为结构高度相似但这不是金标准。需要结合生物学数据如共享靶点进行综合判断。计算效率对于上万规模的化合物库两两比较的复杂度是O(N²)。在实际应用中会使用更高效的相似性搜索算法如基于位置的倒排索引如rdkit的DataStructs.BulkTanimotoSimilarity进行批量计算或近似最近邻搜索ANN库。重定位假设生成找到结构相似药物后下一步是比对它们的适应症Indications、副作用Side Effects和靶点Targets。如果药物A用于治疗疾病X而与之高度相似的药物B目前不用于治疗X但共享关键靶点那么B就有被“重定位”用于治疗X的潜力。这需要进一步查阅文献和临床试验数据进行验证。5. 常见问题、数据陷阱与排查技巧即使像DrugBank这样高质量的数据库在实际使用中也会遇到各种坑。以下是我在多个项目中总结出的常见问题及解决方法。5.1 数据一致性与完整性挑战问题现象可能原因排查与解决技巧同一药物有多个DrugBank ID药物可能以不同盐的形式、不同立体异构体或不同商品名被收录为不同条目。使用Generic Name通用名或SMILES去除立体化学和盐的部分进行归一化比对。rdkit的Chem.MolToSmiles(mol, isomericSmilesFalse)可以生成去立体化的标准SMILES用于比较。靶点名称或ID混乱同一个蛋白可能有多个基因名、别名或在不同物种间有同源物。始终以UniProt ID作为靶点的唯一标识符进行关联。在targets.csv或XML的polypeptide字段中可以找到。如果只有基因名需通过UniProt映射表可从UniProt官网下载转换为ID。缺失关键字段如SMILES并非所有药物条目都包含SMILES尤其是生物制剂蛋白质、抗体等。先筛选smiles字段非空的记录。对于生物制剂结构相似性搜索不适用应考虑基于序列氨基酸序列的相似性。药物-靶点关系证据等级混杂关系有的是实验验证的有的是预测的。在XML数据中关注known-action标签值为yes/no和参考文献。在分析时可以优先筛选known-action为yes的关系以提高网络的可信度。数据更新导致的版本差异你正在使用的5.1.7版本可能与最新版如5.1.10在数据量和结构上有差异。永远记录你使用的确切版本号。在发表论文或报告结果时必须注明数据来源和版本。不同版本间的ID可能稳定但关联关系可能增减。5.2 实操过程中的技术坑XML解析内存溢出症状解析大型XML文件时程序崩溃报MemoryError。解决严格使用iterparse并配合elem.clear()和root.clear()。不要尝试用ET.parse()直接加载整个文件。可以考虑分块解析或使用lxml库的类似流式解析方法它通常比标准库的xml.etree更高效。CSV文件编码与分隔符问题症状用pd.read_csv读取时出现乱码或列错位。解决DrugBank的CSV文件通常是UTF-8编码用逗号分隔。但最好打开文件前几行确认一下。使用pd.read_csv(filepath, encodingutf-8, sep,)。如果仍有问题尝试encodinglatin-1或sep\t制表符分隔。分子指纹计算失败或缓慢症状Chem.MolFromSmiles()返回None或计算上万分子指纹耗时过长。解决无效SMILESDrugBank的SMILES字段总体质量很高但偶尔会有问题。使用try...except捕获异常或先用rdkit的Chem.SanitizeMol检查分子有效性将无效记录单独处理或剔除。性能对于批量计算避免在循环中频繁调用AllChem.GetMorganFingerprintAsBitVect。可以先将所有有效的Mol对象存入列表然后使用列表推导式或并行计算库如joblib加速。对于超大规模库考虑使用预计算的指纹数据库。网络分析可视化一团糟症状用spring_layout画出的图所有节点挤在一起无法辨识。解决先过滤后画图不要画全图。基于网络指标如度中心性筛选出最重要的前50或100个节点及其边构成子图再可视化。使用更适合的布局尝试kamada_kawai_layout或spectral_layout有时效果更好。对于二分图可以尝试专门的方法。转向交互式可视化使用pyvis、Gephi或Cytoscape等工具。它们能处理更大规模的网络并允许交互式探索。5.3 从分析到洞见的关键一步很多新手在完成数据处理和基础分析后就不知道下一步该做什么了。这里分享一个进阶思路多数据源整合。DrugBank本身已经整合了不少外部链接但你还可以主动引入更多数据。例如在进行药物重定位分析时整合副作用数据从SIDER或FAERS数据库获取药物的副作用信息。如果结构相似的药物A和B共享某些罕见但严重的副作用这可能是它们作用于同一脱靶靶点off-target的强烈信号。整合表达数据从GTEx或TCGA数据库获取基因在特定组织或疾病状态下的表达谱。如果一个药物靶向的基因在某种癌症中高表达那么这个药物可能对该癌症有治疗潜力。整合通路信息使用KEGG或Reactome数据库将药物靶点映射到具体的生物通路中。如果多个相似药物的靶点都富集在同一个通路上那么这个通路很可能就是其药效的核心机制。一个具体的操作片段假设你已经有了一个候选药物列表及其靶点来自DrugBank你想知道这些靶点是否在“癌症通路”中富集。# 假设 targets_of_interest 是一个UniProt ID列表 targets_of_interest [P00533, P04626, P15056, ...] # 例如EGFR, HER2, BRAF # 1. 将UniProt ID映射到Entrez Gene IDKEGG常用Gene ID # 你需要一个UniProt到Gene ID的映射文件可以从UniProt或NCBI下载 mapping_df pd.read_csv(uniprot_to_gene.csv) gene_ids mapping_df.loc[mapping_df[uniprot_id].isin(targets_of_interest), gene_id].tolist() # 2. 使用生物信息学富集分析工具如gseapy (Python)或clusterProfiler (R) # 这里以概念为例 import gseapy as gp # 假设 background_genes 是所有人类基因的列表背景集 enrichment_result gp.enrichr(gene_listgene_ids, gene_sets[KEGG_2021_Human], backgroundbackground_genes, outdirNone # 不输出文件 ) # 查看显著富集的通路 if enrichment_result.results is not None: sig_pathways enrichment_result.results[enrichment_result.results[Adjusted P-value] 0.05] print(sig_pathways[[Term, Overlap, Adjusted P-value]].head())通过这样的整合分析你就能够从简单的“数据查询”升级到“假设生成”和“机制探索”真正发挥出DrugBank作为知识核心的价值。记住工具和数据库是死的而跨领域的数据连接和生物学洞察力才是从海量数据中淘金的关键。本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联
返回资讯列表 →