用Python做单细胞分析01

1环境准备

搭建Python高效开发环境:Pycharm+Anaconda

2安装scanpy

pipinstallscanpy3AnnData1AnnData介绍与结构

在做单细胞分析之前,先了解用于单细胞数据分析的一种数据结构--AnnData。

它一般作为scanpy单细胞分析包的数据存储格式。

主要由以下几部分构成:

功能数据类型adata.X矩阵数据numpy,scipysparse,matrixadata.obs观察值数据pandasdataframeadata.var特征和高可变基因数据pandasdataframeadata.uns非结构化数据dict

下面我们动手构建一个用于创建AnnoData的虚拟数据

importnumpyasnpimportpandasaspdimportanndataasadfromstringimportascii_uppercase#设置观测值数量n_obs=#生成观察时间obs=pd.DataFrame()obs[time]=np.random.choice([day1,day2,day4,day8],n_obs)#设置特征名var_names=[i*letterforiinrange(1,10)forletterinascii_uppercase]#特征数量n_vars=len(var_names)#特征注释数据框var=pd.DataFrame(index=var_names)#生成数据矩阵X=np.arange(n_obs*n_vars).reshape(n_obs,n_vars)2AnnoData初始化

#初始化AnnoData对象#AnnoData对象默认使用数据类型为`float32`,可以更精确的存储数据#这里设置为整数,为了演示方便adata=ad.AnnData(X,obs=obs,var=var,dtype=int32)#一般默认将变量或特征存储在数据框的行#查看数据print(adata)3AnnoData切片特性

可以看到AnnData具有和dataframe或Array相似的长相,同样具备相似的特性,比如切片:

#通过切片查看观测值和变量print(adata.obs_names[:10].tolist())print(adata.obs_names[-10:].tolist())print(adata.var_names[:10].tolist())print(adata.var_names[-10:].tolist())#查看矩阵print(X)4AnnoData的view特性

AnnoData可以实现与numpy中的view相似的功能。

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

无需分配多余的内存

可以直接修改已经初始化后的AnnoData对象

view可以使用.copy()来得到AnnoData对象。

#查看A列的头三个元素print(adata[:3,A].X)#设置A列的头三个元素adata[:3,A].X=[0,0,0]#查看A列的头五个元素print(adata[:5,A].X)

其实我们在调用.[]时,AnnoData已经在内部实现了该操作,也就是说该view会成为保存数据的AnnoData对象。

但是,如果将AnnoData对象的view中的一部分赋值,该内容会复制一份并生成新的数据存储对象。

adata_subset=adata[:5,[A,B]]print(adata_subset)adata_subset.obs[foo]=range(5)

可以看到,这时赋值会直接将AnnoData对象复制一份。现在adata_subset会重新得到一块内存用于存储实际数据,而不再仅仅是对adata的内存地址引用。

5读取数据

importscanpyasscimportpandasaspd#初始化数据adata=sc.read(filename)#加入数据anno=pd.read_csv(filename_sample_annotation)#加入样本分组信息adata.obs[cell_groups]=anno[cell_groups]#categoricalannotationoftypepandas.Categorical#加入时间信息adata.obs[time]=anno[time]#numericalannotationoftypefloat#甚至可以直接赋值dataframeadata.obs=anno6备份到本地

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

可以看到,我们的adata对象已经备份成功,而且就在本地./write/test.h5ad目录。

前边提到的view特性在这里同样适用,我们来看看adata_subset是否备份成功。

adata_subset.isbackedadata_subset.filename=./write/adata_subset_test.h5adadata_subset.isbacked

adata_subset并没有被启用备份模式,重新设置备份模式。

需要注意的是:备份仅影响数据矩阵X,所有注释信息都保留在内存中。如果想对全部数据的更改保存,则必须将导出到本地。

9保存数据

adata.write("./write/my_results.h5ad")

adata.write_csvs(./write/my_results_csvs,)

参考:


转载请注明:http://www.92nongye.com/zyjs/zyjs/204626545.html