> Modules non standards > Autres modules non standards > anndata
anndata
package qui permet de stocker des matrices annotées
Définition d'un objet :
- values = numpy.random.normal(1, size = (100, 200)).astype(numpy.float32); adata = anndata.AnnData(values)
- les variables sont en colonnes, les observations en lignes (comme un dataframe pandas).
- adata.n_vars : le nombre de variables.
- adata.n_obs : le nombre d'observations.
- adata.var_names : les noms des gènes.
- adata.obs_names : les noms des cellules.
- adata.var : le dataframe des infos attachées aux gènes.
- adata.obs : le dataframe des infos attachées aux cellules.
- adata.shape : paire nombre de lignes (observations), nombre de colonnes (variables).
- adata.X : la matrice des observations. C'est une matrice sparse de type scipy.sparse.csr.csr_matrix.
- adata.X.toarray() : récupère la matrix dense de type numpy array, mais attention à ne pas faire ça sur une très grosse matrice !
- on peut donner des noms aux observations : adata.obs_names = ['cell' + str(i) for i in range(100)]
- on peut donner des noms aux variables : adata.var_names = ['gene' + str(i) for i in range(200)]
Metadata :
- on peut rajouter des metadata sur les variables (colonnes) et les observations (lignes)
- attaché à l'objet, on a 2 dataframes de metadata : adata.obs pour les observations, adata.var pour les variables. Ils sont initialement vides.
- adata.obs['cellType'] = ['typeA' if i < 50 else 'typeB' for i in range(100)] : rajout d'une colonne au dataframe adata.obs
- si c'est une variable de type catégorie, faire plutôt : adata.obs['cellType'] = pandas.Categorical(['typeA' if i < 50 else 'typeB' for i in range(100)])
- on peut aussi rajouter des metadata avec plusieurs dimensions :
- adata.obsm['umap'] = numpy.zeros((100, 2)) : la première dimension de la matrice doit être égale au nombre d'observations.
- adata.varm['geneProp'] = numpy.zeros((200, 5)) : la première dimension de la matrice doit être égale au nombre de variables.
- adata.uns : on peut rajouter aussi des informations générales dans le champ uns (unstructured) : adata.uns['info'] = {'a': 1, 'b': 3} (les valeurs peuvent être de n'importe quel type.
- var_keys(), obs_keys(), varm_keys(), obsm_keys, uns_keys() : méthodes qui retournent les clefs des différents champs.
- on peut rajouter aussi des layers qui doivent avoir les mêmes dimensions que la matrice principale : adata.layers['logTransf'] = numpy.log10(adata.X). Ce sont des array numpy.
- adata.layers.keys() : les noms des layers
- adata.layers['logTransf'] : pour accéder à une layer avec le nom donné.
- adata.layers['logTransf'][:, ['CD8', 'CD25']] : pour accéder à certaines valeurs.
Manipulation :
- adata[0:5, 0:3] : subsetting avec les index.
- adata[[0, 1], [0, 2]] : subsetting avec les index.
- adata[['cell0', 'cell1'], ['gene0', 'gene2']] : subsetting grâce aux noms donnés.
- adata[adata.obs.cellType == 'typeA'] ou adata[adata.obs['cellType'] == 'typeA'] : subsetting grâce aux metadata si cellType est une colonne des metadata.
- quand on fait un subsetting d'un objet AnnData, ça crée seulement une vue sur l'objet existant, pas de nouvelle création.
- si on veut créer un objet indépendant, il faut faire une copie : adata2 = adata.copy()
- adata.to_df() : renvoie un dataframe de la matrice.
- adata.to_df(layer = 'logTransf') : renvoie un dataframe d'une autre layer que la principale.
- adata.transpose() : transpose tout l'objet.
- adata.chunk_X() : renvoie un sample aléatoire (mais reproductible) de adata.X (1000 lignes et colonnes par défaut).
Sauvegarde dans un fichier :
- adata.write('myFile.h5ad', compression = 'gzip') (= adata.write_h5ad) : sauvegarde dans un fichier HDF5
- adata = anndata.read('myFile.h5ad') (= anndata.read_h5ad) : pour relire le fichier.
- on peut lire le fichier partiellement avec adata = anndata.read('myFile.h5ad', backed = 'r'). L'objet mémorise alors son fichier associé (avec adata.filename) et il faut le fermer quand on a fini : adata.file.close()
- adata.write_csv('myDir', skip_data = False, sep = '\t') : écrit dans myDir toutes les données au format csv avec une tabulation comme séparateur (par défaut, skip_data = False, et il n'écrit pas la matrice). Les noms des fichiers sont les noms des champs : X.csv, obs.csv, var.csv, uns.csv, ...
Concatenation d'objets selon les observations :
adata = anndata.AnnData.concatenate(adata1, adata2, , adata3, batch_categories = ['a', 'b', 'c']) :
- adata.obs a une colonne batch avec la valeur indiquée.
- les noms des observations sont suffixés par le nom de leur batch (ici, en rajoutant -a, -b ou -c selon le batch).
Copyright python-simple.com
programmer en python, tutoriel python, graphes en python, Aymeric Duclert