> 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)
- Exemple de construction plus complet d'un objet AnnData :
dfGene = pandas.DataFrame(index = ['g1', 'g2', 'g3'])
dfCell = pandas.DataFrame({'cellType': ['H', 'L', 'L']}, index = ['c1', 'c2', 'c3'])
mat = numpy.array([[0, 2, 0], [3, 1, 0], [0, 0, 2]], dtype = numpy.float32)
adata = anndata.AnnData(mat, obs = dfC, var = dfG)
- 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.uns : un dictionnaire avec les données non structurées (unstructured).
- 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.
- dans le subsetting d'un objet AnnData, l'utilisation d'entier implique un iloc tandis que l'utilisation de string implique un loc.
- 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).
- adata.var_names_make_unique() : si adata.var a des noms de gènes redondants, elle les rend unique. Pour ceux qui sont redondants, le premier reste inchangé, le second reçoit une extension -1, le 3ème -2, etc ... La modification se fait en place.
Lecture d'un fichier au format mtx avec aussi renseignement des metadata sur les cellules et les gènes :
- adata = anndata.read_mtx('myMatrix.mtx', dtype = 'float32') : lecture de la matrice.
- adata.obs = pandas.read_csv(INPUT_DIR + '/cell_metadata.csv') : fixation des metadata sur les cellules.
- adata.var = pandas.read_csv(INPUT_DIR + '/all_genes.csv') : fixation des metadata sur les gènes.
- adata.obs_names = adata.obs['myName'] : fixation au besoin des noms des cellules.
- adata.var_names = adata.var['geneName'] : fixation au besoin des noms des gènes.
Sauvegarde dans un fichier :
- adata.write('myFile.h5ad', compression = 'gzip') (= adata.write_h5ad) : sauvegarde dans un fichier HDF5
- adata = anndata.read_h5ad('myFile.h5ad') : pour relire le fichier.
- anndata.read_h5ad et scanpy.read_h5ad sont la même fonction.
- 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