Mis a jour le 2025-04-14, 12:10

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