FEATURED · 精选文章

网络药理学靶点分析 Python 全流程:从交集到 PPI 网络与富集分析

发布时间 / 2026/9/16 11:09:25
来源 / 创域科博编辑部
栏目 / 资讯中心
网络药理学靶点分析 Python 全流程:从交集到 PPI 网络与富集分析 简介一套面向网络药理学入门与进阶学习者的视频教程配套资源包重点讲解如何利用R、Perl等编程工具完成药物靶点分析、生物网络构建与可视化。资源共62个文件压缩包约17.91MB涵盖R脚本.r、Perl脚本.pl、文本数据.txt、表格.csv/.tsv/.xls、化合物结构.sdf、网络文件.cys以及富集分析图表.png/.tiff等基本覆盖靶点预测、GO/KEGG富集、PPI网络、Cytoscape可视化等完整流程。目前已有688人学习下载适合具备一定生物信息学基础、希望将编程方法用于药物机制研究的学生和科研人员。通过该资源可系统掌握网络药理学核心分析思路包括化合物与靶点映射、通路注释、模块检测与中心性分析并能结合实验数据验证潜在靶点为多靶点药物设计和药物重定位提供实用工具与参考范例。1. 网络药理学是数据游戏靶点分析才是讲解视频里最该停下来的部分一份药物成分列表、一份疾病基因列表中间夹着诸多“为什么有效”的推断网络药理学处理的就是这种多对多的关系。讲解视频里概念图一闪而过真正需要动手的只有靶点分析这一核心环节把药物成分对应的靶点拉出来与疾病靶点求交集再放进互作网络里找核心节点最后看富集通路。这一步能跑通整个网络药理学的计算链条就通了其余都属于展示层的工作。这篇文章按最常用的 Python 方案把靶点获取、ID 归一化、交集与 PPI 建网、富集分析的代码和参数一次讲全适合懂一点编程、想用可复现脚本替代手工点网页的读者。2. 程序化靶点分析的对象与流程把“药到靶”关系落成可复跑的脚本2.1 网络药理学的最小闭环药物-靶点-疾病-通路网络药理学的计算逻辑从一张“围棋棋盘”开始药物成分与蛋白质靶点结合扰动与疾病相关的细胞通路。结构上就是四张表药物-成分表、成分-靶点表、靶点-通路表、疾病-靶点表。这四张表之间的连接都是多对多的单靠人眼在 Excel 里查找、粘贴结果既没法复现也没法解释。最容易被忽略的一个结论是网络药理学分析的第一步并不是拿成分去查药效而是先把成分-靶点映射做扎实再和疾病靶点做集合运算。也就是说靶点分析的核心操作是“集合交集加网络构建”。讲解视频里常画一个两圈相交的韦恩图落到程序里就是一行集合运算但前面的数据准备决定了这行运算出来的是 5 个靶点还是 50 个靶点。2.2 靶点分析的标准四步主流程在实际项目中我习惯把程序化靶点分析拆成四步每步都有明确的输入、输出和验收标准。步骤输入输出关键工具靶点获取药物成分列表、疾病名称基因 Symbol 或 UniProt Accession 列表TCMSP、ChEMBL、DisGeNET、GeneCardsID 归一化混合 ID 的靶点列表统一 ID 的靶点列表UniProt mapping 表、pandas merge交集与网络药物靶点、疾病靶点交集列表、PPI 子网络set 运算、STRING、NetworkX富集分析目标靶点列表GO/KEGG 富集结果表gseapy.clusterProfiler这套流程的验收标准很简单每一步都能用同一份输入复现出相同输出。只要哪一步是手工复制粘贴完成的整条链路就失去了可重复性后续写论文或做批量筛选时都会吃亏。2.3 技术选型为什么是 Python 而不是 Excel 或 R如果只是几十个基因Excel 的 VLOOKUP 勉强能顶住但网络药理学动辄要做多药物对比、1000 次随机网络验证Excel 就完全失去了可维护性。R 的 clusterProfiler 在富集分析上确实成熟但考虑到整套靶点分析以 Python 为主时pandas 做交集、NetworkX 做网络、gseapy 做富集从头到尾一套脚本就能跑完环境也更容易在团队里统一。import pandas as pd # 读入两份靶点列表文件里只需要一列Gene drug pd.read_csv(drug_targets.csv) disease pd.read_csv(disease_targets.csv) # 用集合运算代替 Excel 的 VLOOKUP common_genes sorted( set(drug[Gene]) set(disease[Gene]) ) print(交集靶点数:, len(common_genes))这段代码的关键在set(drug[Gene]) set(disease[Gene])两列基因名分别转成集合交集运算符直接算出共同靶点再用sorted()保证输出顺序稳定。如果交集结果为空绝大多数情况不是“没有共同靶点”而是两份列表的 ID 体系不一致比如药物表里是 EGFR疾病表里是 1956或者一个是大写一个是小写这就引出第三章的 ID 归一化问题。3. 用程序准备靶点数据数据库来源、ID 映射与数据清洗3.1 药物靶点和疾病靶点的常见来源药物靶点一侧讲解视频里用得最多的是 TCMSP 的中药成分靶点数据导出文件是 Excel 格式读取后需要清理列名ChEMBL 提供化合物-靶点活性数据适合做化学结构相关的分析DrugBank 收录已批准上市药物的靶点格式相对规整如果手里只有成分的 CAS 编号或 SMILESSTITCH 的化学物质-蛋白互作数据是更灵活的备选。疾病靶点一侧OMIM 提供表型-基因关系的权威注释但文本里常混着换行符DisGeNET 给每个基因-疾病关联打了分数做筛选时可以直接按 score 阈值过滤GeneCards 的导出文件信息最全但冗余列很多。这些数据库各有各的 ID 体系输出列名也各不相同常见的字段有 Gene Symbol如 EGFR、UniProt Accession如 P00533、Entrez ID如 1956。只要两份文件来源不同就必须先把 ID 统一否则后面的交集运算没有意义。3.2 Symbol 与 UniProt Accession 的批量映射推荐的做法是先去 UniProt 下载一份完整的 Symbol 到 Accession 映射文件然后用 pandas 的 merge 一次性完成转换而不是在代码里硬编码字典。硬编码几十个基因还能忍受一旦药物列表规模上千字典就完全不可维护了。import pandas as pd # 映射文件包含两列From 和 To分别是 Symbol 与 UniProt Accession mapping pd.read_csv(uniprot_mapping.tsv, sep\t) drug pd.read_csv(drug_targets.csv) drug drug.merge( mapping, left_onGene, right_onFrom, howleft ) # 只保留能映射成功的行映射失败的单独记录 failed drug[drug[To].isna()] drug drug.dropna(subset[To])merge的参数需要说明left_onGene指定药物表里的基因名列right_onFrom指定映射表里的源 ID 列howleft保证药物表原有行不丢失映射不到的行在To列会是空值。处理完毕后用dropna(subset[To])丢掉映射失败的行同时把failed单独存一份方便回头检查是基因别名问题还是数据源本身拼写错误。实际项目中这一步成功率达到 95% 以上才算正常低于这个比例首先要怀疑读文件的列名不对。3.3 清洗时容易忽略的三个坑第一个坑是同一基因的别名写法。EGFR 在部分数据库里写作 ERBB1PDGFRB 也可能被写作 CDK4B。如果不做别名归并交集结果会凭空少掉几个真实靶点而且很难察觉。第二个坑是大小写混合有的文件里是 EGFR有的文件里是 egfr转集合之前统一用.str.upper()处理一次最保险。第三个坑是物种混杂如果数据源里同时混着人、小鼠和大鼠的基因交集和富集都会出现难以解释的噪音最有效的办法是在数据下载阶段就按物种过滤。提示在源头就把物种过滤在 9606人之外比在 pandas 里事后清洗省力得多下载时多看一眼筛选条件后面少改一小时代码。4. 结合 Python 完成网络药理学靶点分析交集、PPI 与富集4.1 药物-疾病靶点取交集一行 set 运算代替韦恩图当药物靶点和疾病靶点都已经完成 ID 归一化之后交集运算本身极其简单。common sorted(set(drug[Target]) set(disease[Target])) with open(common_targets.txt, w) as f: f.write(\n.join(common))这段代码先把两列数据转成集合用求交集最后写进文本文件。把交集结果落盘的目的是让后续 PPI 分析、富集分析都从同一个文件读取避免在 Jupyter Notebook 里反复复制变量导致前后结果不一致。这里建议同时对交集列表做一次人工确认数量在 10 到 200 之间比较合理如果只有 2 个或直接变成 0回头查 ID 映射或数据源过滤条件而不是继续往下跑网络分析。4.2 用 NetworkX 构建 PPI 子网络并计算核心节点得到交集靶点后常见做法是去 STRING 数据库下载蛋白互作关系。导出格式选择 TSV里面包含 protein1、protein2、combined_score 等列直接用 pandas 读入并过滤高置信度边。import pandas as pd import networkx as nx ppi pd.read_csv( string_interactions.tsv, sep\t, usecols[protein1, protein2, combined_score] ) # STRING 的分数 0.9 属于高置信度网络更干净 ppi ppi[ppi[combined_score] 0.9] G nx.from_pandas_edgelist( ppi, sourceprotein1, targetprotein2, edge_attrcombined_score )这里有一个最常踩的坑STRING 导出文件里的蛋白 ID 通常是 ENSP 编号或带物种前缀的编号而交集靶点列表里是 Symbol两者直接比较永远对不上。正确做法是把交集靶点先映射成 STRING 使用的 ID 再做子图提取。from_pandas_edgelist的三个参数分别指定源节点列、目标节点列和边属性列生成的图对象可以直接做后续计算。如果直接用交集靶点提取子图往往会发现节点很多但边很少因为交集中的基因并不一定两两直接互作。这时需要做一步“一阶邻居扩展”candidate_nodes set() for node in common: candidate_nodes.add(node) candidate_nodes.update(G.neighbors(node)) subgraph G.subgraph(candidate_nodes)这段扩展逻辑把每个交集靶点及其直接互作邻居都纳入子图网络规模会从十几个节点膨胀到几十上百个节点但结构和功能信息完整得多。随后计算节点的度并取前 10degree dict(subgraph.degree()) top_nodes sorted(degree, keydegree.get, reverseTrue)[:10] print(top_nodes)dict(subgraph.degree())返回每个节点的度值sorted按度值降序排列后取前 10 个这就是讲解视频里常说的核心靶点或 hub 基因。4.3 用 gseapy 做 GO/KEGG 富集分析富集分析是靶点分析里最能说明生物学意义的一步。gseapy 不需要装 R 环境直接 pip 就能用pip install pandas networkx gseapy然后对交集靶点跑富集import gseapy as gp res gp.enrichr( gene_listlist(common), # 交集靶点列表 gene_sets[ KEGG_2021_Human, GO_Biological_Process_2023 ], organismhuman, outdirenrichr_out, ) res.results.sort_values(Adjusted P-value).head(10)gene_list传入交集靶点gene_sets指定基因集库outdir让富集结果完整保存到本地目录Adjusted P-value是校正后的显著性指标排序后取前 10 条通路就是下游分析的重点。如果网络环境受限或想保证结果完全可复现可以下载 GMT 格式的基因集文件改用gp.enrich并指定gene_sets_file参数做本地富集效果等同但完全离线。4.4 靶点分析的常用参数与经验阈值不同项目里靶点数差异很大参数不能一套用到底以下是我在实际操作中比较常用的起始值。环节参数常用值说明交集最小交集靶点数5 个少于 5 个时富集基本没有统计效力STRING 过滤combined_score0.7 或 0.90.9 更严格0.7 适合小靶点集邻居扩展扩展层数1 层超过 1 层网络噪音会快速增加PPI 网络核心节点数degree 前 10也可改用 betweenness需要对比验证富集分析显著性阈值Adjusted P-value 0.05只看 P 值容易把噪音通路当结果当交集靶点只有十几个时把 combined_score 卡在 0.9 会直接导致网络碎成多个孤立小图。此时建议放宽到 0.4 或 0.7先看看边的整体分布再决定是否提高阈值。参数的选取要在“网络完整性”和“连接可信度”之间取平衡这也是视频课里最不好讲的隐性知识。5. 批量跑多药物并验证固定随机种子与结果合并5.1 循环处理多个药物并合并结果实际项目很少只分析一个药物把前面两步包装成函数后循环是水到渠成的事results [] for drug_name, target_file in drug_target_files.items(): common get_common_targets(target_file, disease_list) top get_top_hub_genes(common) results.append({ drug: drug_name, common_count: len(common), top_hub: ,.join(top[:5]) }) pd.DataFrame(results).to_csv( all_drugs_result.tsv, sep\t, indexFalse )每次循环都把药物名称、交集数量和前几个核心靶点收集成字典最终用pd.DataFrame(results)汇总成一张总表。这里的技巧是只把关键摘要写进汇总表详细交集列表仍保留在各自的文件里避免生成一个几万行的巨型 Excel。5.2 用随机网络做拓扑验证必须固定随机种子网络药理学分析里一个经常被质疑的问题是你找到的 PPI 网络结构换成随机生成的网络是不是也这样验证方法是保持节点数和边数不变随机重连网络的边比较真实网络与随机网络的聚类系数real_clustering nx.average_clustering(subgraph) random_clustering [] for i in range(1000): random_graph nx.double_edge_swap( subgraph, nswap1000, max_tries10000, seed42 i ) random_clustering.append( nx.average_clustering(random_graph) )double_edge_swap在保持每个节点度不变的前提下重连边比完全随机图更合理seed42 i让每次随机化过程可复现。如果真实网络的聚类系数明显高于随机网络的均值说明该网络结构并非随机产生分析的结论就更站得住脚。这个验证不需要在每次分析里都跑但关键结论最好补上。5.3 导出 GraphML 时先统一节点命名最终结果通常要在 Cytoscape 或 Gephi 里展示。直接导出 GraphML 比导出 SIF 格式保留更多属性信息nx.write_graphml(subgraph, result.graphml)注意导出前必须先统一节点命名同一基因用同一个 ID 写进 GraphML否则可视化工具里会出现两个名字不同但实际是同一蛋白的孤立节点排查起来非常头疼。统一命名后导出 GraphML后续无论用哪种可视化工具打开都不会再看到同基因不同 label 的怪图。本文还有配套的精品资源点击获取
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻