Scanpy(1)数据结构和样本过滤

注:主要讲述scanpy处理数据的结构、数据过滤(生信领域)和数据预处理(和机器学习类似,但是又有不同。)

1. Scanpy简介与安装

Scanpy 是一个可扩展的工具包,用于分析与 AnnData(一种数据结构)联合构建的单细胞分析数据。
fig1

通过conda,使用命令cd进入whl文件所在的目录后,然后通过pip安装:

pip install scanpy

2. AnnData

2.1 AnnData的结构

在scanpy中,我们最常见的数据结构是AnnData,它是一个用于存储数据的对象,其数据结构可以描述如下:
fig2
我们把上面这个对象记作 adata,我们需要了解以下几个部分:

功能类型
adata.X矩阵numpy矩阵
adata.obs观测量pandas Dataframe
adata.var特征量pandas Dataframe
adata.uns非结构化数据字典dict

为了进一步了解这个数据结构,我们手动构建一个AnnData对象:

import numpy as np
import pandas as pd
import anndata as ad
from string import ascii_uppercase# 设置观测样本的数量
n_obs=1000
# obs用于保存观测量的信息
obs=pd.DataFrame()# numpy.random.choice(a, size=None, p=None)
# 从a(ndarray, 但必须是一维的)中随机抽取元素, 并组成指定大小(size)的数组
# 数组p: 与数组a对应, 表示取数组a中每个元素的概率, 默认情况下选取每个元素的概率相同
obs['time']=np.random.choice(['day1','day2','day4','day8'],size=n_obs)# 设置特征名var_names
print(ascii_uppercase) # ABCDEFGHIJKLMNOPQRSTUVWXYZ
var_names=[i*letter for i in range(1,10) for letter in ascii_uppercase]
print(var_names)
# ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', ......, 'X', 'Y', 'Z',
# ......
# 'AAAAAAAAA', 'BBBBBBBBB', 'CCCCCCCCC', ......, 'YYYYYYYYY', 'ZZZZZZZZZ']# 特征数量
n_vars=len(var_names) # 234# 将特征定义到 Dataframe
var=pd.DataFrame(index=var_names)
print(var.head()) # 现在var没有columns(列索引), 只有index(行索引)# 创建数据矩阵 adata.X
X=np.arange(n_obs*n_vars).reshape(n_obs,n_vars)
1234567891011121314151617181920212223242526272829303132

然后初始化 AnnData 对象,AnnData 对象默认采用数据类型 float32,我们为了便于后期观察打印结果,设置数据类型为 int32:

adata=ad.AnnData(X,obs=obs,var=var,dtype='int32')# 查看数据
print(adata)
"""
AnnData object with n_obs × n_vars = 1000 × 234obs: 'time'
"""# 查看adata的X矩阵
print(adata.X)
"""
[[     0      1      2 ...    231    232    233][   234    235    236 ...    465    466    467][   468    469    470 ...    699    700    701]...[233298 233299 233300 ... 233529 233530 233531][233532 233533 233534 ... 233763 233764 233765][233766 233767 233768 ... 233997 233998 233999]]
"""
1234567891011121314151617181920

一般对于adata.X,行对应观测(即,细胞),列对应特征(即,基因);

我们每次操作 AnnData 时,并不是再新建一个 AnnData 来存储数据,而是直接找到已经在之前初始化好的 AnnData 的内存地址,通过内存地址来直接改变 AnnData 的值。这样做的好处是:

  • 无需分配多余的内存;
  • 可以直接修改已经初始化后的 AnnoData 对象;

比如:

# 查看 'A' 列的头三个元素
print(adata[:3, 'A'].X)
"""
[[  0][234][468]]
"""# 设置 'A' 列的头三个元素
adata[:3, 'A'].X = [0, 0, 0]# 再查看 'A' 列的头五个元素发现值被修改了
print(adata[:5, 'A'].X)
"""
[[  0][  0][  0][702][936]]
"""
1234567891011121314151617181920

但是,如果将 AnnData 对象中的一部分赋值到新对象,该对象会得到一块新内存用于存储实际数据,而不再是对原来adata对象的内存地址引用,比如:

adata_subset = adata[:5, ['A', 'B']]
print(adata_subset)
"""
View of AnnData object with n_obs × n_vars = 5 × 2obs: 'time'
"""# 为新对象 adata_subset 增加观测量 'foo'
adata_subset.obs['foo'] = range(5)
print(adata_subset)
"""
AnnData object with n_obs × n_vars = 5 × 2obs: 'time', 'foo'
"""
1234567891011121314

2.2 h5ad:AnnData的写入和读取

我们可以将AnnData对象通过h5ad文件保存到磁盘中,保存过程如下:

# 计算对象的大小
def print_size_in_MB(x):print('{:.3} MB'.format(x.__sizeof__()/1e6))# 查看对象大小
print_size_in_MB(adata) # 0.187 MB# 查看是否备份
print(adata.isbacked) # False# 设置备份地址
adata.filename = './test.h5ad'# 查看是否备份成功
print(adata.isbacked) # True
123456789101112131415

adata.isbacked 状态为 True 后,证明对象已经被写入磁盘;

相反的,我们可以利用 scanpy 很方便地读取文件,获得 AnnData 对象:

import scanpy as scMyadata=sc.read('./test.h5ad')
print(Myadata)
"""
AnnData object with n_obs × n_vars = 1000 × 234obs: 'time'
"""
12345678

3. Scanpy中一些常用api的用法介绍

首先导入Scanpy:

import scanpy as sc
1

3.1 sc.pp.filter_cells

sc.pp.filter_cells(data, min_genes=None, max_genes=None) 
1

常常用于预处理中,做一些细胞筛选的工作,该函数保留至少有 min_genes 个基因的细胞,或者保留至多有 max_genes 个基因的细胞;

另外注意,参数 min_genes 和参数 max_genes 不能同时传递;

实例:

# 导入数据
adata=sc.datasets.krumsiek11() # 5类细胞, 640个细胞样本, 共测量11种基因
print(adata)
"""
AnnData object with n_obs × n_vars = 640 × 11obs: 'cell_type'uns: 'iroot', 'highlights'
"""print(adata.n_obs) # 640个细胞# 11个基因(即特征)
print(adata.var_names)
"""
Index(['Gata2', 'Gata1', 'Fog1', 'EKLF', 'Fli1', 'SCL', 'Cebpa', 'Pu.1','cJun', 'EgrNab', 'Gfi1'],dtype='object')
"""### 注意观察细胞数量变化 ###
sc.pp.filter_cells(adata,min_genes=0) # 相当于没有筛选print(adata.n_obs) # 640print(adata.obs)
"""cell_type  n_genes
0    progenitor        9
..          ...      ...
159         Neu        8
细胞一共就5类, 每一类有不同数量个细胞, cell_type左边的index不是dataframe的真正int型index, 
是字符串index, 仅表示每类细胞的index, 比如Neu范围是0到159 
"""
print(set(adata.obs['cell_type'].values)) # 5类细胞{'Neu', 'progenitor', 'Ery', 'Mo', 'Mk'}
print(adata.obs['n_genes'].min()) # 4, 每个细胞至少测量了4个基因sc.pp.filter_cells(adata,min_genes=6) # 选择测量了6个基因以上的细胞
print(adata.n_obs) # 630
print(adata.obs['n_genes'].min()) # 6
123456789101112131415161718192021222324252627282930313233343536373839

3.2 sc.pp.filter_genes

sc.pp.filter_genes(data, min_cells=None, max_cells=None) 
1

该函数用于保留在至少 min_cells 个细胞中出现的基因,或者保留在至多 max_cells 个细胞中出现的基因;

参数 min_cells 和参数 max_cells 不能同时传递;

对比 sc.pp.filter_cells 可以发现,sc.pp.filter_genes 用于选择基因(筛选列),sc.pp.filter_cells 用于选择细胞(筛选行);

3.3 sc.pp.highly_variable_genes

sc.pp.highly_variable_genes(data, n_top_genes=None, min_disp=0.5, max_disp=inf, min_mean=0.0125, max_mean=3)
1234567

该函数用于确定高变基因;

常用参数说明:

  • data:AnnData Matrix,行对应细胞列对应基因
  • n_top_genes:要保留的高变基因的数量

高变异基因就是highly variable features(HVGs),就是在细胞与细胞间进行比较,选择表达量差别最大的基因,Seurat使用FindVariableFeatures函数鉴定高变基因,这些基因在不同细胞之间的表达量差异很大(在一些细胞中高表达,在另一些细胞中低表达)。默认情况下,会返回2,000个高变基因用于下游的分析。

利用FindVariableFeatures函数,会计算一个mean-variance结果,也就是给出表达量均值和方差的关系并且得到top variable features,这一步的目的是鉴定出细胞与细胞之间表达量相差很大的基因,用于后续鉴定细胞类型。

标记基因 (marker gene),是一种已知功能或已知序列的基因,能够起着特异性标记的作用。

3.4 sc.pp.normalize_total

sc.pp.normalize_total(adata, target_sum=None, inplace=True)
1

函数可以对每个细胞进行标准化,以便每个细胞在标准化后沿着基因方向求和具有相同的总数target_sum

实例:

adata.X
array([[ 3.,  3.,  3.,  6.,  6.],[ 1.,  1.,  1.,  2.,  2.],[ 1., 22.,  1.,  2.,  2.]], dtype=float32)
# 设置 target_sum=1 标准化后
X_norm
array([[0.14, 0.14, 0.14, 0.29, 0.29],[0.14, 0.14, 0.14, 0.29, 0.29],[0.04, 0.79, 0.04, 0.07, 0.07]], dtype=float32)
123456789

ta.X
array([[ 3., 3., 3., 6., 6.],
[ 1., 1., 1., 2., 2.],
[ 1., 22., 1., 2., 2.]], dtype=float32)

设置 target_sum=1 标准化后

X_norm
array([[0.14, 0.14, 0.14, 0.29, 0.29],
[0.14, 0.14, 0.14, 0.29, 0.29],
[0.04, 0.79, 0.04, 0.07, 0.07]], dtype=float32)
123456789


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/829755.shtml

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

相关文章

SpringCloud系列(19)--将服务消费者Consumer注册进Consul

前言:在上一章节中我们把服务提供者Provider注册进了Consul,而本章节则是关于如何将服务消费者Consumer注册进Consul 1、再次创建一个服务提供者模块,命名为consumerconsul-order80 (1)在父工程下新建模块 (2)选择模块的项目类型为Maven并选…

2024LarkXR新增功能系列之九| 优化分配策略:增加GPU检查参数

Paraverse平行云实时云渲染解决方案LarkXR在2024年新增了优化分配策略,增强了GPU检查参数的能力,满足了复杂元宇宙/数字孪生场景多样性的可视化的需求,为这些应用找到了更好的解决方案。新版本的LarkXR在渲染请求分配策略上做出了显著的改进。…

币圈资讯Cryptosquare论坛

在加密货币世界中,信息的及时获取对于投资者和交易者至关重要。今天,我将向大家介绍Cryptosquare这个综合性资讯论坛,它汇集了币圈新闻、空投信息、社会热点以及与Web3相关的工作信息。让我们一起解锁加密世界的种种可能性,探索Cr…

创建SpringBoot和RabbitMQ的整合项目

文章目录 创建SpringBoot和RabbitMQ的整合项目首先快速创建一个maven项目引入SpringBoot整合rabbitMQ的依赖在src/main目录下创建resources目录并引入配置文件写消息发送者MessageSender写消息接收者MessageReceiver写RabbitMQConfig配置类写SpringBoot启动主类CommandLineRunn…

【黑马点评Redis——002商户查询缓存】

1. 商户查询缓存 2. 知识储备和课程内容 2.1 什么是缓存 缓存是数据交换的缓冲区,是存贮数据的临时地方,一般读写性能较高。 浏览器缓存应用层缓存数据库缓存CPU缓存磁盘缓存 缓存的作用: 降低后端负载提高读写效率,降低响应…

B站无限评论暴力截留协议及教程

B站无限评论暴力截留协议及教程 B站无限评论暴力截留协议及教程,需要抓CK ,教程里面有讲如何抓取 网盘自动获取 链接:https://pan.baidu.com/s/1lpzKPim76qettahxvxtjaQ?pwd0b8x 提取码:0b8x

springboot路劲映射

般情况下,使用了页面模板后,用户需要通过控制器才能访问页面。有一些页面需要在控制器中加载数据,然后渲染,才能显示出来;还有一些页面在控制器中不需要加载数据,只是完成简单的跳转,对于这种页面&#xff…

C++:week1:C语言基础

文章目录 (一) C语言概述1.预处理指令:宏定义、宏函数2.生成可执行程序的过程3.进程与虚拟内存空间 (二) 格式化输入输出1.变量及命名2.格式化输入输出、输入输出模型(1)CPU、内存、外部设备的速度矛盾(2)printf(3)scanf 3.代码即注释4.程序出错的原因、调试程序5.其…

提示词优化的自动化探索:Automated Prompt Engineering

编者按: 作者在尝试教授母亲使用 LLM 完成工作任务时,意识到提示词的优化并不像想象中简单。提示词的自动优化对于经验并不丰富的提示词撰写者很有价值,他们没有足够的经验去调整和改进提供给模型的提示词,这引发了对自动化提示词…

C++学习之指针和引用

指针 指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为: type *var-name; 在这里…

kotlin 编写一个简单的天气预报app (七)使用material design

一、优化思路 对之前的天气预报的app进行了优化,原先的天气预报程序逻辑是这样的。 使用text和button组合了一个输入城市,并请求openweathermap对应数据,并显示的功能。 但是搜索城市的时候,可能会有错误,比如大小写…

steam打不开没反应 steam客户端启动不了一直无响应的解决方法

steam打不开没反应 steam客户端启动不了一直无响应的解决方法 steam这个平台想必各位游戏爱好者们肯定不会陌生,作为全球最大的游戏服务平台,steam不仅为玩家们提供了全面的游戏服务,还经常给玩家们提供各种游戏优惠,并且每年四…

【综述】DSP处理器芯片

文章目录 TI DSP C2000系列 TMS320F28003X 典型应用 开发工具链 参考资料 TI DSP TI C2000系列 控制领域 TI C5000系列 通信领域 TI C6000系列 图像领域 C2000系列 第三代集成了C28浮点DSP内核,采用了65nm工艺(上一代180nm) 第四代正在…

无人零售与传统便利店的竞争优势

无人零售与传统便利店的竞争优势 成本控制 • 无人零售 显著降低了人力成本,无需支付店员薪资和相关福利,且通过智能化管理减少能源消耗与维护费用,尤其在高租金和高人流区域效益突出。 • 传统便利店 则承担较高的人员开支,…

chrome 查看版本安装路径、cmd命令行启动浏览器

chrome 查看版本安装路径 浏览器输入 chrome://version/cmd命令行启动浏览器 "C:\Program Files\Google\Chrome\Application\chrome.exe" www.baidu.com

恒峰智慧科技—高扬程水泵:解决远距离输水难题的新选择!

在森林消防领域,水泵是一个至关重要的设备。它的主要功能是将水源输送到火灾现场,为消防人员提供足够的水源进行灭火。然而,传统的水泵往往面临着距离限制的问题,这对于远距离输水来说是一个巨大的挑战。幸运的是,高扬…

Jenkins构建触发器-Git hook自动触发构建

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 Jenkins是一个开源…

《苍穹外卖》Day10部分知识点记录

一、Spring Task 介绍 Spring Task是Spring框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑。 定位:定时任务框架 作用:定时自动执行某段Java代码 应用场景:只要是需要定时处理的场景都可以使用Spring Task …

2024腾讯游戏安全技术竞赛-机器学习赛道

决赛赛题链接https://gss.tencent.com/competition/2024/doc/2024%E8%85%BE%E8%AE%AF%E6%B8%B8%E6%88%8F%E5%AE%89%E5%85%A8%E6%8A%80%E6%9C%AF%E7%AB%9E%E8%B5%9B-%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0-%E5%86%B3%E8%B5%9B.zip 今年的题目是游戏跨语言恶意内容识别 ,题目比较…

技术速递|利用 Redis 使 AI 驱动的 .NET 应用程序更加一致和智能

作者:Catherine Wang 排版:Alan Wang Redis 是一种流行的内存数据存储,可用于解决构建和扩展智能应用程序的关键挑战。在本文中,你将了解如何使用 Redis 的 Azure 缓存来提高使用 Azure OpenAI 的应用程序的效率。 Redis 的 Azur…