Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >内容更新---单细胞空间差异基因的富集分析(python)

内容更新---单细胞空间差异基因的富集分析(python)

原创
作者头像
追风少年i
发布于 2025-05-22 08:46:44
发布于 2025-05-22 08:46:44
10600
代码可运行
举报
运行总次数:0
代码可运行

作者,Evil Genius

快51了,大家准备去哪里玩?

目前针对全python流程的搭建,不知道各个公司做的怎么样了,不过针对我们课程内容,需要准备完成。

R版本的GO、KEGG富集分析采用了clusterprofiler,来到我们python,采用的是gseapy模块。

我们更新一下这部分内容

前面的基础分析要做到,最好做一下细胞注释,保存出h5ad文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import scanpy as sc
import pandas as pd
import gseapy as gp
import numpy as np
import matplotlib.pyplot as plt
import os

# 创建保存结果的目录
os.makedirs('enrichment_results', exist_ok=True)
os.makedirs('enrichment_plots', exist_ok=True)

# 加载单细胞数据
adata = sc.read("test.h5ad")
####基础分析(需要调整)
sc.pp.filter_cells(adata, min_genes=200)
sc.pp.filter_genes(adata, min_cells=3)
sc.pp.normalize_total(adata, target_sum=1e4)
sc.pp.log1p(adata)
sc.pp.highly_variable_genes(adata, min_mean=0.0125, max_mean=3, min_disp=0.5)
adata = adata[:, adata.var.highly_variable]
sc.pp.regress_out(adata, ['total_counts', 'pct_counts_mt'])
sc.pp.scale(adata, max_value=10)

# 聚类分析
sc.tl.pca(adata, svd_solver='arpack')
sc.pp.neighbors(adata, n_pcs=30, n_neighbors=20)
sc.tl.leiden(adata, resolution=0.5)
sc.tl.umap(adata)

#最好细胞聚类与注释(细胞注释放在celltype列),这里以cluster为例。
sc.tl.rank_genes_groups(adata, groupby='cluster', method='wilcoxon')
# 获取所有cluster ID
clusters = adata.obs['leiden'].cat.categories.tolist()

# 设置富集分析的参数
gene_sets = ['GO_Biological_Process_2023', 'KEGG_2021_Human']
organism = 'human'  ####物种参数

# 循环处理每个cluster
for cluster in clusters:
    print(f"\nProcessing cluster {cluster}...")
    
    # 1. 获取差异基因
    deg_df = pd.DataFrame({
        'names': adata.uns['rank_genes_groups']['names'][cluster],
        'scores': adata.uns['rank_genes_groups']['scores'][cluster],
        'pvals': adata.uns['rank_genes_groups']['pvals'][cluster],
        'pvals_adj': adata.uns['rank_genes_groups']['pvals_adj'][cluster],
        'logfoldchanges': adata.uns['rank_genes_groups']['logfoldchanges'][cluster]
    })
    
    # 筛选显著差异基因 (调整p值<0.05且logFC>0.5)
    significant_genes = deg_df[(deg_df['pvals_adj'] < 0.05) & (abs(deg_df['logfoldchanges']) > 0.5)]
    
    if len(significant_genes) < 5:
        print(f"Cluster {cluster} has too few significant genes ({len(significant_genes)}), skipping...")
        continue
    
    # 取差异最显著的前100个基因
    gene_list = significant_genes.sort_values('scores', ascending=False)['names'].head(100).tolist()
    
    # 2. 执行富集分析
    try:
        # GOKEGG富集分析
        enr_results = gp.enrich(
            gene_list=gene_list,
            gene_sets=gene_sets,
            organism=organism,
            outdir=None,
            cutoff=0.05
        )
        
        # 3. 保存结果
        # 保存差异基因
        deg_filename = f'enrichment_results/cluster_{cluster}_differential_genes.csv'
        significant_genes.to_csv(deg_filename, index=False)
        
        # 保存富集结果
        if enr_results is not None:
            enr_filename = f'enrichment_results/cluster_{cluster}_enrichment.csv'
            enr_results.res2d.to_csv(enr_filename)
            
            # 4. 可视化
            # 绘制并保存前10个富集项
            plt.figure(figsize=(10, 6))
            top_terms = enr_results.res2d.head(10)
            top_terms.plot.barh(x='Term', y='Adjusted P-value', legend=False)
            plt.title(f'Cluster {cluster} - Top 10 Enriched Terms')
            plt.xlabel('-log10(Adjusted P-value)')
            plt.tight_layout()
            plot_filename = f'enrichment_plots/cluster_{cluster}_enrichment.png'
            plt.savefig(plot_filename)
            plt.close()
            
            print(f"Cluster {cluster} analysis completed. Results saved.")
        else:
            print(f"No enrichment results for cluster {cluster}")
            
    except Exception as e:
        print(f"Error processing cluster {cluster}: {str(e)}")

# 收集所有cluster的富集结果
all_enrichments = []

for cluster in clusters:
    try:
        filename = f'enrichment_results/cluster_{cluster}_enrichment.csv'
        if os.path.exists(filename):
            df = pd.read_csv(filename)
            df['Cluster'] = cluster
            all_enrichments.append(df)
    except:
        continue

if all_enrichments:
    # 合并所有结果
    combined_enr = pd.concat(all_enrichments)
    
    # 保存合并结果
    combined_enr.to_csv('enrichment_results/combined_enrichment_results.csv', index=False)
    
    # 找出在多个cluster中富集的通路
    common_pathways = combined_enr['Term'].value_counts().head(20)
    print("\nPathways enriched in multiple clusters:")
    print(common_pathways)
    
    # 可视化共同通路
    plt.figure(figsize=(10, 8))
    common_pathways.plot.barh()
    plt.title('Pathways Enriched in Multiple Clusters')
    plt.xlabel('Number of Clusters')
    plt.tight_layout()
    plt.savefig('enrichment_plots/common_pathways_across_clusters.png')
    plt.close()
else:
    print("No enrichment results to combine")

生活很好,有你更好

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Pytest测试框架一键动态切换测试环境实现思路及方案
在上一篇文章《Pytest fixture及conftest详解》中,我们介绍了fixture的一些关键特性、用法、作用域、参数等,本篇文章将结合fixture及conftest实现一键动态切换自动化测试环境。在开始前,我们可以先思考几个问题:动态切换测试环境的目的是什么(能够解决什么问题)?该如何实现(实现方案)?具体步骤是什么(实现过程)?
大刚测试开发实战
2022/11/14
1.5K0
Pytest测试框架一键动态切换测试环境实现思路及方案
Flask的Blueprints和Views
Flask的view函数是用来对请求作出响应的。单个URL能匹配到单个View,那么多个类似的URL,比如:
dongfanger
2021/11/30
7370
【Flask】当企业级项目在大多数视图登录性能优化以及测试覆盖的详细解决方案
对于大多数视图,用户需要登录。测试中最方便的方法是使用客户端发出POST请求并将其发送到登录视图。不是每次都写,而是写一个类,使用class方法来完成,并使用固件将其传递给每个被测试的客户端。
上进小菜猪
2022/12/13
1.2K0
【Flask】当企业级项目在大多数视图登录性能优化以及测试覆盖的详细解决方案
解锁Python TDD:从理论到实战的高效编程之道(9/10)
在 Python 开发的广袤天地中,确保代码质量与稳定性是每位开发者的核心追求。测试驱动开发(TDD,Test-Driven Development)作为一种强大的开发理念与实践方法,正逐渐成为 Python 开发者不可或缺的工具。TDD 强调在编写功能代码之前先编写测试代码,这种看似逆向的流程,却蕴含着提升代码质量、增强代码可维护性以及加速开发进程的巨大能量。它如同为开发者配备了一位严谨的 “质量卫士”,从开发的源头开始,就为代码的正确性与健壮性保驾护航。无论是小型项目的敏捷开发,还是大型企业级应用的复杂构建,TDD 都能发挥关键作用,帮助开发者高效地创建出高质量的 Python 代码。接下来,让我们一同深入探索 Python 测试驱动开发的实践奥秘。
正在走向自律
2025/05/14
1160
解锁Python TDD:从理论到实战的高效编程之道(9/10)
Flask官方推荐项目结构竟然是这样
Flask有个特点:千人千面。它没有硬性规定,你必须采用哪种项目结构来组织代码,这就导致每个人都按照自己的习惯和喜好来写,写出来的项目结构往往是千差万别。在Flask2.0的官方文档中,有一节内容介绍了Flask的项目结构,我们可以窥探一番。
dongfanger
2021/09/06
2.8K0
Flask框架的蓝图与视图
您好,我是码农飞哥,感谢您阅读本文!接上一篇文章,上篇文章我们介绍了Flask框架与SQLAlchemy框架的整合一分钟快速实现Flask框架与SQLAlchemy框架的整合,这篇文章我们将介绍Flask框架的蓝图和视图。
码农飞哥
2021/08/18
6050
Flask框架之博客的发布和编辑
您好,我是码农飞哥,感谢您阅读本文!上一篇文章我们介绍了一分钟快速实现Flask框架的蓝图和视图,这一篇文章我们将接着介绍博客的发布以及编辑。同样是运用视图和蓝图。
码农飞哥
2021/08/18
3450
Python 单元测试详解
作者:yukkizhang,腾讯 CSIG 测试工程师 本文直接从常用的 Python 单元测试框架出发,分别对几种框架进行了简单的介绍和小结,然后介绍了 Mock 的框架,以及测试报告生成方式,并以具体代码示例进行说明,最后列举了一些常见问题。 一、常用 Python 单测框架 若你不想安装或不允许第三方库,那么 unittest 是最好也是唯一的选择。反之,pytest 无疑是最佳选择,众多 Python 开源项目(如大名鼎鼎的 requests)都是使用 pytest 作为单元测试框架。甚至
腾讯技术工程官方号
2021/04/15
2.7K0
测试 Flask 应用
这一箴言的起源已经不可考了,尽管他不是完全正确的,但是仍然离真理不远。没有测试过的应用将会使得提高现有代码质量很困难,二不测试应用程序的开发者,会显得特别多疑。如果一个应用拥有自动化测试,那么您就可以安全的修改然后立刻知道是否有错误。
用户1214487
2018/07/31
7350
Flask框架与SQLAlchemy框架手牵手,一起走
您好,我是码农飞哥,感谢您阅读本文!上一篇文章我们介绍了快速上手SQLAlchemy框架,两分钟了解Python之SQLAlchemy框架的使用今天就让我们学习下如何将Flask框架与SQLAlchemy框架进行整合。在Python的Web项目中我们都是使用Flask框架的,快速上手Flask请参考一分钟学会Flask框架的安装与快速使用。
码农飞哥
2021/08/18
1.5K0
从 Flask 切到 FastAPI 后,起飞了!
本文翻译自 Moving from Flask to FastAPI, 作者:Amal Shaji
Python编程与实战
2024/03/04
1.8K0
从 Flask 切到 FastAPI 后,起飞了!
Python 编程必不可少的测试框架「unittest 篇」
unittest 是一个单元测试框架,单元测试完成对一个模块、一个类或一个函数的运行结果进行检验的测试工作。单元测试是对一个程序最基础的组成部分进行正确性验证,只有所有的单元测试不存在问题才能保证整体程序的正确性。
keinYe
2020/01/02
6890
tep1.0.0正式版发布且将不再维护
根据pypistats统计,tep在pypi的下载量达到了1w,对于纯个人研发的一款测试小工具来说,已经算不错了,要知道HttpRunner也才6w啊。tep可以说是我在接口自动化测试这个领域的技术沉淀,凝结了个人经验和所见所闻的精华之作,它基于Pytest,借鉴了JMeter、RobotFramework、HttpRunner、京东接口测试平台等各种优秀自动化设计思想,小小工具,蕴含大大能量。相信它也已经影响了不少人,让初学者知道Pytest该怎么玩,让入门者知道Pytest工程化是什么样子,让熟练者可以参考对照优化代码。然而当我把tep优化到1.0.0正式版以后,为什么却选择停止维护呢? 一、 小工具的表达力不够。当我试图用tep来描绘更多自动化设计思想时,瞬间感觉到了一丝苍白,我不一定讲的清楚,别人也不一定能够理解,用代码来交流始终存在着一定门槛。二、每个人对Pytest使用方式不同 。Pytest本身是测试框架,很多人用它来做二次开发,设计”测试框架“,有好的,有差的,不管白猫黑猫能逮到耗子就是好猫,不管设计的如何,能实现接口自动化项目落地就是好框架。tep要想在这个方向上,建立一套标准,几乎是不可能的。这不并意味我会就此放弃Pytest,相反,我将致力于Pytest平台化,从做小工具改为做测试平台。 测试平台具有非常直观的强大表现力,并且具有工程化的规范性,一看就懂,一用就会,一点就通。测试平台也是能更好的做技术沉淀的,如果说写小工具是玩玩而已,那么开发测试平台就是认真搞技术了。比如,如何提高Pytest并行执行的效率,我相信测试平台会比小工具,更能给出一个比较完整的解决方案。下次使用Pytest,也许就不是从tep startproject开始了,而是docker run。
dongfanger
2022/12/31
8610
tep1.0.0正式版发布且将不再维护
tep0.6.0更新聊聊pytest变量接口用例3个级别复用
tep是一款测试工具,在pytest测试框架基础上集成了第三方包,提供项目脚手架,帮助以写Python代码方式,快速实现自动化项目落地。fixture是pytest核心技术,本文聊聊如何使用fixture完成变量、接口、用例3个级别复用。
dongfanger
2021/01/07
1.2K0
Pytest实战
Pytest测试框架是动态语言Python专用的测试框架,使用起来非常的简单,这主要得易于它的设计,Pytest测试框架具备强大的功能,丰富的第三方插件,以及可扩展性好,可以很好的和unittest测试框架能够结合起来在项目中使用。本文章主要介绍Pytest测试框架中参数化的详细信息。
无涯WuYa
2020/10/27
1.6K0
Pytest实战
带你认识 flask 优化应用结构
目前状态下的应用有两个基本问题。如果你观察应用的组织方式,你会注意到有几个不同的子系统可以被识别,但支持它们的代码都混合在了一起,没有任何明确的界限。我们来回顾一下这些子系统是什么:
公众号---人生代码
2019/11/24
1.6K0
基于flask的网页聊天室(三)
这个添加到init文件中,因为是创建app时的内容。 然后在html页面的表单中添加隐藏的csrf的input标签:
py3study
2020/01/16
1.1K0
tep用户手册帮你从unittest过渡到pytest
unittest和pytest是Python的2个强大的测试框架,经常用来做UI自动化或接口自动化。unittest是PyCharm的默认集成工具,也是我们大多数人入门自动化的首选框架。pytest提供了更丰富的功能,相对的上手难度也要高一点。如果学了pytest后,想快速用pytest写项目,用于工作实践,那么可以试试我写的这款测试工具:tep,try easy pytest。
dongfanger
2020/12/28
1.4K0
tep用户手册帮你从unittest过渡到pytest
python 生成flask结构 常用
config=""" import os basedir = os.path.abspath(os.path.dirname(file)) class Config: SECRET_KEY ='hard to guess string' SQLALCHEMY_COMMIT_ON_TEARDOWN = True FLASKY_MAIL_SUBJECT_PREFIX = '[Flasktest]' FLASKY_MAIL_SENDER = '13285921108@163.com' FLASKY_ADMIN = 'huangat' @staticmethod def init_app(app): pass class DevelopmentConfig(Config): DEBUG = True MAIL_SERVER = 'mail.163.com' MAIL_PORT = 587 MAIL_USE_TLS = True MAIL_USERNAME = os.environ.get('13285921108') MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD') SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'data-dev.sqlite') class TestingConfig(Config): TESTING = True SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'data-test.sqlite') class ProductionConfig(Config): SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'data.sqlite')
用户5760343
2019/07/07
6310
tep集成HttpRunner与Flask实现开箱即用
趁着元旦假期最后一天,有着大把时间,奔着把tep做大做强的目标,好好学习了一波。在开始正文之前,先回答可能会问到的两个问题。第一个问题是为什么要集成HttpRunner?因为我最近在思考如何给tep做分层设计,参考了我司现有的接口自动化平台,它的设计是每个用例有很多测试步骤,可以针对用例设置预设变量,然后在测试步骤中引用。正当我准备自己开发类似功能时,想到了HttpRunner,我记得HttpRunner第3版是建议直接编写pytest代码而非以前的ymal或json文件了。大有所获,HttpRunner正是以这种方式编写的代码,而且和pytest有很好的结合,很符合tep要集成的第三方包的希望。第二个问题是为什么要集成Flask?刚开始只是我用来调试代码的,等到把Mock写完以后,想到可能大家也需要调试代码,就把它做到tep里面了,并且附带了测试用例的示例代码,安装完以后就能一键运行,开箱即用,美滋滋。归根结底,都是为了把tep做大做强。
dongfanger
2022/01/05
6380
推荐阅读
相关推荐
Pytest测试框架一键动态切换测试环境实现思路及方案
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验