pertpy 0.9.4__py3-none-any.whl → 0.10.0__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
@@ -7,6 +7,7 @@ import pandas as pd
7
7
  from anndata import AnnData
8
8
  from lamin_utils import logger
9
9
  from rich import print
10
+ from scipy.stats import entropy
10
11
 
11
12
  if TYPE_CHECKING:
12
13
  from collections.abc import Iterable
@@ -41,7 +42,7 @@ class PerturbationSpace:
41
42
  Args:
42
43
  adata: Anndata object of size cells x genes.
43
44
  target_col: .obs column name that stores the label of the perturbation applied to each cell.
44
- group_col: .obs column name that stores the label of the group of eah cell. If None, ignore groups.
45
+ group_col: .obs column name that stores the label of the group of each cell. If None, ignore groups.
45
46
  reference_key: The key of the control values.
46
47
  layer_key: Key of the AnnData layer to use for computation.
47
48
  new_layer_key: the results are stored in the given layer.
@@ -364,50 +365,58 @@ class PerturbationSpace:
364
365
  self,
365
366
  adata: AnnData,
366
367
  column: str = "perturbation",
368
+ column_uncertainty_score_key: str = "perturbation_transfer_uncertainty",
367
369
  target_val: str = "unknown",
368
- n_neighbors: int = 5,
369
- use_rep: str = "X_umap",
370
+ neighbors_key: str = "neighbors",
370
371
  ) -> None:
371
372
  """Impute missing values in the specified column using KNN imputation in the space defined by `use_rep`.
372
373
 
374
+ Uncertainty is calculated as the entropy of the label distribution in the neighborhood of the target cell.
375
+ In other words, a cell where all neighbors have the same set of labels will have an uncertainty of 0, whereas a cell
376
+ where all neighbors have many different labels will have high uncertainty.
377
+
373
378
  Args:
374
379
  adata: The AnnData object containing single-cell data.
375
- column: The column name in AnnData object to perform imputation on.
380
+ column: The column name in adata.obs to perform imputation on.
381
+ column_uncertainty_score_key: The column name in adata.obs to store the uncertainty score of the label transfer.
376
382
  target_val: The target value to impute.
377
- n_neighbors: Number of neighbors to use for imputation.
378
- use_rep: The key in `adata.obsm` where the embedding (UMAP, PCA, etc.) is stored.
383
+ neighbors_key: The key in adata.uns where the neighbors are stored.
379
384
 
380
385
  Examples:
381
386
  >>> import pertpy as pt
382
387
  >>> import scanpy as sc
383
388
  >>> import numpy as np
384
389
  >>> adata = sc.datasets.pbmc68k_reduced()
385
- >>> rng = np.random.default_rng()
386
- >>> adata.obs["perturbation"] = rng.choice(
387
- ... ["A", "B", "C", "unknown"], size=adata.n_obs, p=[0.33, 0.33, 0.33, 0.01]
388
- ... )
390
+ >>> # randomly dropout 10% of the data annotations
391
+ >>> adata.obs["perturbation"] = adata.obs["louvain"].astype(str).copy()
392
+ >>> random_cells = np.random.choice(adata.obs.index, int(adata.obs.shape[0] * 0.1), replace=False)
393
+ >>> adata.obs.loc[random_cells, "perturbation"] = "unknown"
389
394
  >>> sc.pp.neighbors(adata)
390
395
  >>> sc.tl.umap(adata)
391
396
  >>> ps = pt.tl.PseudobulkSpace()
392
- >>> ps.label_transfer(adata, n_neighbors=5, use_rep="X_umap")
397
+ >>> ps.label_transfer(adata)
393
398
  """
394
- if use_rep not in adata.obsm:
395
- raise ValueError(f"Representation {use_rep} not found in the AnnData object.")
396
-
397
- embedding = adata.obsm[use_rep]
398
-
399
- from pynndescent import NNDescent
400
-
401
- nnd = NNDescent(embedding, n_neighbors=n_neighbors)
402
- indices, _ = nnd.query(embedding, k=n_neighbors)
403
-
404
- perturbations = np.array(adata.obs[column])
405
- missing_mask = perturbations == target_val
406
-
407
- for idx in np.where(missing_mask)[0]:
408
- neighbor_indices = indices[idx]
409
- neighbor_categories = perturbations[neighbor_indices]
410
- most_common = pd.Series(neighbor_categories).mode()[0]
411
- perturbations[idx] = most_common
412
-
413
- adata.obs[column] = perturbations
399
+ if neighbors_key not in adata.uns:
400
+ raise ValueError(f"Key {neighbors_key} not found in adata.uns. Please run `sc.pp.neighbors` first.")
401
+
402
+ labels = adata.obs[column].astype(str)
403
+ target_cells = labels == target_val
404
+
405
+ connectivities = adata.obsp[adata.uns[neighbors_key]["connectivities_key"]]
406
+ # convert labels to an incidence matrix
407
+ one_hot_encoded_labels = adata.obs[column].astype(str).str.get_dummies()
408
+ # convert to distance-weighted neighborhood incidence matrix
409
+ weighted_label_occurence = pd.DataFrame(
410
+ (one_hot_encoded_labels.values.T * connectivities).T,
411
+ index=adata.obs_names,
412
+ columns=one_hot_encoded_labels.columns,
413
+ )
414
+ # choose best label for each target cell
415
+ best_labels = weighted_label_occurence.drop(target_val, axis=1)[target_cells].idxmax(axis=1)
416
+ adata.obs[column] = labels
417
+ adata.obs.loc[target_cells, column] = best_labels
418
+
419
+ # calculate uncertainty
420
+ uncertainty = np.zeros(adata.n_obs)
421
+ uncertainty[target_cells] = entropy(weighted_label_occurence.drop(target_val, axis=1)[target_cells], axis=1)
422
+ adata.obs[column_uncertainty_score_key] = uncertainty
@@ -1,13 +1,20 @@
1
1
  from __future__ import annotations
2
2
 
3
+ from typing import TYPE_CHECKING
4
+
3
5
  import decoupler as dc
6
+ import matplotlib.pyplot as plt
4
7
  import numpy as np
5
8
  from anndata import AnnData
6
9
  from sklearn.cluster import DBSCAN, KMeans
7
10
 
11
+ from pertpy._doc import _doc_params, doc_common_plot_args
8
12
  from pertpy.tools._perturbation_space._clustering import ClusteringSpace
9
13
  from pertpy.tools._perturbation_space._perturbation_space import PerturbationSpace
10
14
 
15
+ if TYPE_CHECKING:
16
+ from matplotlib.pyplot import Figure
17
+
11
18
 
12
19
  class CentroidSpace(PerturbationSpace):
13
20
  """Computes the centroids per perturbation of a pre-computed embedding."""
@@ -168,6 +175,47 @@ class PseudobulkSpace(PerturbationSpace):
168
175
 
169
176
  return ps_adata
170
177
 
178
+ @_doc_params(common_plot_args=doc_common_plot_args)
179
+ def plot_psbulk_samples(
180
+ self,
181
+ adata: AnnData,
182
+ groupby: str,
183
+ *,
184
+ return_fig: bool = False,
185
+ **kwargs,
186
+ ) -> Figure | None:
187
+ """Plot the pseudobulk samples of an AnnData object.
188
+
189
+ Plot the count number vs. the number of cells per pseudobulk sample.
190
+
191
+ Args:
192
+ adata: Anndata containing pseudobulk samples.
193
+ groupby: `.obs` column to color the samples by.
194
+ {common_plot_args}
195
+ **kwargs: Are passed to decoupler's plot_psbulk_samples.
196
+
197
+ Returns:
198
+ If `return_fig` is `True`, returns the figure, otherwise `None`.
199
+
200
+ Examples:
201
+ >>> import pertpy as pt
202
+ >>> adata = pt.dt.zhang_2021()
203
+ >>> ps = pt.tl.PseudobulkSpace()
204
+ >>> pdata = ps.compute(
205
+ ... adata, target_col="Patient", groups_col="Cluster", mode="sum", min_cells=10, min_counts=1000
206
+ ... )
207
+ >>> ps.plot_psbulk_samples(pdata, groupby=["Patient", "Major celltype"], figsize=(12, 4))
208
+
209
+ Preview:
210
+ .. image:: /_static/docstring_previews/pseudobulk_samples.png
211
+ """
212
+ fig = dc.plot_psbulk_samples(adata, groupby, return_fig=True, **kwargs)
213
+
214
+ if return_fig:
215
+ return fig
216
+ plt.show()
217
+ return None
218
+
171
219
 
172
220
  class KMeansSpace(ClusteringSpace):
173
221
  """Computes K-Means clustering of the expression values."""
@@ -18,12 +18,16 @@ from scvi.data.fields import CategoricalObsField, LayerField
18
18
  from scvi.model.base import BaseModelClass, JaxTrainingMixin
19
19
  from scvi.utils import setup_anndata_dsp
20
20
 
21
+ from pertpy._doc import _doc_params, doc_common_plot_args
22
+
21
23
  from ._scgenvae import JaxSCGENVAE
22
24
  from ._utils import balancer, extractor
23
25
 
24
26
  if TYPE_CHECKING:
25
27
  from collections.abc import Sequence
26
28
 
29
+ from matplotlib.pyplot import Figure
30
+
27
31
  font = {"family": "Arial", "size": 14}
28
32
 
29
33
 
@@ -377,9 +381,8 @@ class Scgen(JaxTrainingMixin, BaseModelClass):
377
381
  condition_key: str,
378
382
  axis_keys: dict[str, str],
379
383
  labels: dict[str, str],
380
- save: str | bool | None = None,
384
+ *,
381
385
  gene_list: list[str] = None,
382
- show: bool = False,
383
386
  top_100_genes: list[str] = None,
384
387
  verbose: bool = False,
385
388
  legend: bool = True,
@@ -387,6 +390,8 @@ class Scgen(JaxTrainingMixin, BaseModelClass):
387
390
  x_coeff: float = 0.30,
388
391
  y_coeff: float = 0.8,
389
392
  fontsize: float = 14,
393
+ show: bool = False,
394
+ save: str | bool | None = None,
390
395
  **kwargs,
391
396
  ) -> tuple[float, float] | float:
392
397
  """Plots mean matching for a set of specified genes.
@@ -397,21 +402,23 @@ class Scgen(JaxTrainingMixin, BaseModelClass):
397
402
  corresponding to batch and cell type metadata, respectively.
398
403
  condition_key: The key for the condition
399
404
  axis_keys: Dictionary of `adata.obs` keys that are used by the axes of the plot. Has to be in the following form:
400
- `{"x": "Key for x-axis", "y": "Key for y-axis"}`.
401
- labels: Dictionary of axes labels of the form `{"x": "x-axis-name", "y": "y-axis name"}`.
402
- path_to_save: path to save the plot.
403
- save: Specify if the plot should be saved or not.
405
+ {`x`: `Key for x-axis`, `y`: `Key for y-axis`}.
406
+ labels: Dictionary of axes labels of the form {`x`: `x-axis-name`, `y`: `y-axis name`}.
404
407
  gene_list: list of gene names to be plotted.
405
- show: if `True`: will show to the plot after saving it.
406
408
  top_100_genes: List of the top 100 differentially expressed genes. Specify if you want the top 100 DEGs to be assessed extra.
407
- verbose: Specify if you want information to be printed while creating the plot.,
409
+ verbose: Specify if you want information to be printed while creating the plot.
408
410
  legend: Whether to plot a legend.
409
411
  title: Set if you want the plot to display a title.
410
412
  x_coeff: Offset to print the R^2 value in x-direction.
411
413
  y_coeff: Offset to print the R^2 value in y-direction.
412
414
  fontsize: Fontsize used for text in the plot.
415
+ show: if `True`, will show to the plot after saving it.
416
+ save: Specify if the plot should be saved or not.
413
417
  **kwargs:
414
418
 
419
+ Returns:
420
+ Returns R^2 value for all genes and R^2 value for top 100 DEGs if `top_100_genes` is not `None`.
421
+
415
422
  Examples:
416
423
  >>> import pertpy as pt
417
424
  >>> data = pt.dt.kang_2018()
@@ -498,6 +505,7 @@ class Scgen(JaxTrainingMixin, BaseModelClass):
498
505
  r"$\mathrm{R^2_{\mathrm{\mathsf{top\ 100\ DEGs}}}}$= " + f"{r_value_diff ** 2:.2f}",
499
506
  fontsize=kwargs.get("textsize", fontsize),
500
507
  )
508
+
501
509
  if save:
502
510
  plt.savefig(save, bbox_inches="tight")
503
511
  if show:
@@ -514,16 +522,17 @@ class Scgen(JaxTrainingMixin, BaseModelClass):
514
522
  condition_key: str,
515
523
  axis_keys: dict[str, str],
516
524
  labels: dict[str, str],
517
- save: str | bool | None = None,
525
+ *,
518
526
  gene_list: list[str] = None,
519
527
  top_100_genes: list[str] = None,
520
- show: bool = False,
521
528
  legend: bool = True,
522
529
  title: str = None,
523
530
  verbose: bool = False,
524
531
  x_coeff: float = 0.3,
525
532
  y_coeff: float = 0.8,
526
533
  fontsize: float = 14,
534
+ show: bool = True,
535
+ save: str | bool | None = None,
527
536
  **kwargs,
528
537
  ) -> tuple[float, float] | float:
529
538
  """Plots variance matching for a set of specified genes.
@@ -534,19 +543,18 @@ class Scgen(JaxTrainingMixin, BaseModelClass):
534
543
  corresponding to batch and cell type metadata, respectively.
535
544
  condition_key: Key of the condition.
536
545
  axis_keys: Dictionary of `adata.obs` keys that are used by the axes of the plot. Has to be in the following form:
537
- `{"x": "Key for x-axis", "y": "Key for y-axis"}`.
538
- labels: Dictionary of axes labels of the form `{"x": "x-axis-name", "y": "y-axis name"}`.
539
- path_to_save: path to save the plot.
540
- save: Specify if the plot should be saved or not.
546
+ {"x": "Key for x-axis", "y": "Key for y-axis"}.
547
+ labels: Dictionary of axes labels of the form {"x": "x-axis-name", "y": "y-axis name"}.
541
548
  gene_list: list of gene names to be plotted.
542
- show: if `True`: will show to the plot after saving it.
543
549
  top_100_genes: List of the top 100 differentially expressed genes. Specify if you want the top 100 DEGs to be assessed extra.
544
- legend: Whether to plot a elgend
550
+ legend: Whether to plot a legend.
545
551
  title: Set if you want the plot to display a title.
546
552
  verbose: Specify if you want information to be printed while creating the plot.
547
553
  x_coeff: Offset to print the R^2 value in x-direction.
548
554
  y_coeff: Offset to print the R^2 value in y-direction.
549
555
  fontsize: Fontsize used for text in the plot.
556
+ show: if `True`, will show to the plot after saving it.
557
+ save: Specify if the plot should be saved or not.
550
558
  """
551
559
  import seaborn as sns
552
560
 
@@ -636,6 +644,7 @@ class Scgen(JaxTrainingMixin, BaseModelClass):
636
644
  else:
637
645
  return r_value**2
638
646
 
647
+ @_doc_params(common_plot_args=doc_common_plot_args)
639
648
  def plot_binary_classifier(
640
649
  self,
641
650
  scgen: Scgen,
@@ -643,10 +652,10 @@ class Scgen(JaxTrainingMixin, BaseModelClass):
643
652
  delta: np.ndarray,
644
653
  ctrl_key: str,
645
654
  stim_key: str,
646
- show: bool = False,
647
- save: str | bool | None = None,
655
+ *,
648
656
  fontsize: float = 14,
649
- ) -> plt.Axes | None:
657
+ return_fig: bool = False,
658
+ ) -> Figure | None:
650
659
  """Plots the dot product between delta and latent representation of a linear classifier.
651
660
 
652
661
  Builds a linear classifier based on the dot product between
@@ -661,9 +670,11 @@ class Scgen(JaxTrainingMixin, BaseModelClass):
661
670
  delta: Difference between stimulated and control cells in latent space
662
671
  ctrl_key: Key for `control` part of the `data` found in `condition_key`.
663
672
  stim_key: Key for `stimulated` part of the `data` found in `condition_key`.
664
- path_to_save: Path to save the plot.
665
- save: Specify if the plot should be saved or not.
666
673
  fontsize: Set the font size of the plot.
674
+ {common_plot_args}
675
+
676
+ Returns:
677
+ If `return_fig` is `True`, returns the figure, otherwise `None`.
667
678
  """
668
679
  plt.close("all")
669
680
  adata = scgen._validate_anndata(adata)
@@ -693,12 +704,9 @@ class Scgen(JaxTrainingMixin, BaseModelClass):
693
704
  ax = plt.gca()
694
705
  ax.grid(False)
695
706
 
696
- if save:
697
- plt.savefig(save, bbox_inches="tight")
698
- if show:
699
- plt.show()
700
- if not (show or save):
701
- return ax
707
+ if return_fig:
708
+ return plt.gcf()
709
+ plt.show()
702
710
  return None
703
711
 
704
712
 
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.4
2
2
  Name: pertpy
3
- Version: 0.9.4
3
+ Version: 0.10.0
4
4
  Summary: Perturbation Analysis in the scverse ecosystem.
5
5
  Project-URL: Documentation, https://pertpy.readthedocs.io
6
6
  Project-URL: Source, https://github.com/scverse/pertpy
@@ -44,9 +44,8 @@ Classifier: Programming Language :: Python :: 3.11
44
44
  Classifier: Programming Language :: Python :: 3.12
45
45
  Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
46
46
  Classifier: Topic :: Scientific/Engineering :: Visualization
47
- Requires-Python: >=3.10
47
+ Requires-Python: <3.13,>=3.10
48
48
  Requires-Dist: adjusttext
49
- Requires-Dist: anndata<0.10.9
50
49
  Requires-Dist: blitzgsea
51
50
  Requires-Dist: decoupler
52
51
  Requires-Dist: lamin-utils
@@ -58,8 +57,8 @@ Requires-Dist: pyarrow
58
57
  Requires-Dist: requests
59
58
  Requires-Dist: rich
60
59
  Requires-Dist: scanpy[leiden]
60
+ Requires-Dist: scikit-learn>=1.4
61
61
  Requires-Dist: scikit-misc
62
- Requires-Dist: scipy
63
62
  Requires-Dist: scvi-tools
64
63
  Requires-Dist: sparsecca
65
64
  Provides-Extra: coda
@@ -69,7 +68,8 @@ Requires-Dist: pyqt5; extra == 'coda'
69
68
  Requires-Dist: toytree; extra == 'coda'
70
69
  Provides-Extra: de
71
70
  Requires-Dist: formulaic; extra == 'de'
72
- Requires-Dist: pydeseq2; extra == 'de'
71
+ Requires-Dist: formulaic-contrasts>=0.2.0; extra == 'de'
72
+ Requires-Dist: pydeseq2>=v0.5.0pre1; extra == 'de'
73
73
  Provides-Extra: dev
74
74
  Requires-Dist: pre-commit; extra == 'dev'
75
75
  Provides-Extra: doc
@@ -1,57 +1,58 @@
1
- pertpy/__init__.py,sha256=k0tPuH0DdvQraT7I-zYrI1TwJHK3GnBx-Nvi-cMobvM,658
1
+ pertpy/__init__.py,sha256=SGZpJmqp7CRJfINcZ8YFM8pIR2LKPQ7wlMttiaJAQ5g,659
2
+ pertpy/_doc.py,sha256=jT8GIw3DVk-wLnX5qPEPaAH3Y_Jv2KAoXBX2jlCkJKY,437
2
3
  pertpy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
4
  pertpy/data/__init__.py,sha256=ah3yvoxkgbdMUNAWxS3SyqcUuVamBOSeuWkF2QRAEwM,2703
4
5
  pertpy/data/_dataloader.py,sha256=ENbk1T3w3N6tVI11V4FVUxuWFEwOHP8_kIB-ehiMlVQ,2428
5
- pertpy/data/_datasets.py,sha256=OwI0HSSXnUPnUw_lAG9w5jNMILjLnPZS2Wj_LfrXSoI,65616
6
+ pertpy/data/_datasets.py,sha256=c_U2U2NvncPZc6vs6w_s77zmWqr8ywDpzmkx6edCfUE,65616
6
7
  pertpy/metadata/__init__.py,sha256=zoE_VXNyuKa4nlXlUk2nTgsHRW3jSQSpDEulcCnzOT0,222
7
- pertpy/metadata/_cell_line.py,sha256=-8KSqmP5XjmLEmNX3TavxSM_MtIHwLWS_x3MVkk6JEw,38595
8
- pertpy/metadata/_compound.py,sha256=JEFwP_TOTyMzfd2qFMb2VkJJvPhCVIvu6gs9Bq_stgs,4756
8
+ pertpy/metadata/_cell_line.py,sha256=RKRxm91PBAjx2S4ou5MGoSjEIkO5PV_okZT5HBdMO_M,38937
9
+ pertpy/metadata/_compound.py,sha256=ywNNqtib0exHv0z8ctmTRf1Hk64tSGWSiUEffycxf6A,4755
9
10
  pertpy/metadata/_drug.py,sha256=8QDSyxiFl25JdS80EQJC_krg6fEe5LIQEE6BsV1r8nY,9006
10
11
  pertpy/metadata/_look_up.py,sha256=DoWp6OxIk_HyyyOhW1p8z5E68IZ31_nZDnqxk1rJqps,28778
11
- pertpy/metadata/_metadata.py,sha256=pvarnv3X5pblnvG8AQ8Omu5jQcC5ORzCxRk3FRhOLgs,3276
12
+ pertpy/metadata/_metadata.py,sha256=hV2LTFrExddLNU_RsDkZju6lQUSRoP4OIn_dumCyQao,3277
12
13
  pertpy/metadata/_moa.py,sha256=u_OcMonjOeeoW5P9xOltquVSoTH3Vs80ztHsXf-X1DY,4701
13
14
  pertpy/plot/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
15
  pertpy/preprocessing/__init__.py,sha256=VAPFaeq2_qCvdFkQTCj_Hm460HC4Tersu8Rig_tnp_Y,71
15
- pertpy/preprocessing/_guide_rna.py,sha256=IgKhXEyfRwEA7ccKJNLA_aIxKHm09QJINM09KaIwn68,7644
16
- pertpy/tools/__init__.py,sha256=guh4QL8ac_CKP8S2nFHmxWJ6epCFB_Jfga4eK9HYGnE,2598
17
- pertpy/tools/_augur.py,sha256=UWro1nIEZe_rWtjlQCBv4ucqeh3Vt1m8IRzKlux72Z8,55683
18
- pertpy/tools/_cinemaot.py,sha256=vMm9oTNW6pb8HBe993-BvkVKjSHbfbqlZY1SSCvj12Y,39521
19
- pertpy/tools/_dialogue.py,sha256=f2fbhKWdm4Co79ZzVgtVq9xYwjYWFLdGNDeGFOO_pfM,51990
20
- pertpy/tools/_enrichment.py,sha256=rjPHK9YBCJZfpa5Rvfxo3Ii7W5Mvm5dOdolAD7QazVg,21440
16
+ pertpy/preprocessing/_guide_rna.py,sha256=72NbKsgvbA9AgVU0l0pkwKH2KKX4qdAth32lRTGl9hA,12319
17
+ pertpy/preprocessing/_guide_rna_mixture.py,sha256=NJYU6gUJp_lKHKf_P5kS8QzAnkOnmX8snECmqvoNprM,6458
18
+ pertpy/tools/__init__.py,sha256=NUTwCGxRdzUzLTgsS3r7MywENwPAdcGZDKrl83sU8mo,2599
19
+ pertpy/tools/_augur.py,sha256=tZXlVeXvF7oGWXTEeVhN-5mbaNUSD1xIo40tKD_l1rg,54633
20
+ pertpy/tools/_cinemaot.py,sha256=jkJCoTX2m-xVqQs4Iq8LbHWvQyH06-SCMBYczYXUzLE,39573
21
+ pertpy/tools/_dialogue.py,sha256=NGf3yiUntWp5P0WmXHErgqietw1eyXqr40QCpHUkMZM,52076
22
+ pertpy/tools/_enrichment.py,sha256=NYBVvnGDAeoWfTEhezWBUWeNugZDRisMpZMsU0lpA_s,21592
21
23
  pertpy/tools/_kernel_pca.py,sha256=_EJ9WlBLjHOafF34sZGdyBgZL6Fj0WiJ1elVT1XMmo4,1579
22
- pertpy/tools/_milo.py,sha256=FDFGmGMkJiVrvATEnOeAMCe-Q2w7F0nbBMuACVbyIQI,43699
23
- pertpy/tools/_mixscape.py,sha256=FtH3PKvbLTe03LPgN4O9sS70oj_6AHz4Mz5otzEwRl8,52406
24
+ pertpy/tools/_milo.py,sha256=Z87RETCz7loUVov5WhrT0ieqJQrAHgknWcpU6qci_VM,43619
25
+ pertpy/tools/_mixscape.py,sha256=nNFWVJeudEiDQ7i5FTXF0xWdOILh2rIF2YyFbZuz6jE,57015
24
26
  pertpy/tools/decoupler_LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
25
27
  pertpy/tools/transferlearning_MMD_LICENSE,sha256=MUvDA-o_j9htRpI8fStVdCRuyLdPkQUuIH0a_EIc57w,1069
26
28
  pertpy/tools/_coda/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
- pertpy/tools/_coda/_base_coda.py,sha256=jnoLPFfluxB0_CK8-T-qolPa7xPIEb6NpeEpGwHPiNg,113058
29
+ pertpy/tools/_coda/_base_coda.py,sha256=w5Tgd73tUYJ9209xncM_QhcnGfeDEgRHss8M_1NQSoM,111630
28
30
  pertpy/tools/_coda/_sccoda.py,sha256=gGmyd0MGpchulV9d4PxKSmGORyZ8fCDS9tQVPOuF_Og,22622
29
31
  pertpy/tools/_coda/_tasccoda.py,sha256=vNk43OQHn7pBLsez2rmSj0bMZKOf8jZTI7G8TfBByRg,30665
30
- pertpy/tools/_differential_gene_expression/__init__.py,sha256=sabAXym8mMLwp19ZjyBN7wp-oJh32iVj9plvJ-AbXlE,521
31
- pertpy/tools/_differential_gene_expression/_base.py,sha256=qnQkK_hyIcViHBSkgJcAazC26JQ72bEyafKiytZikCY,23624
32
+ pertpy/tools/_differential_gene_expression/__init__.py,sha256=SEydWg0iT3Y1pApjnCAOuHxFeI6xVUfgyBHv2s3LADU,487
33
+ pertpy/tools/_differential_gene_expression/_base.py,sha256=4BTJx1bfvDdFpJPFA_jMBVqVFWAYASM01Ec0ObIRgeE,38322
32
34
  pertpy/tools/_differential_gene_expression/_checks.py,sha256=SxNHJDsCYZ6rWLTMEymEBpigs_B9cnXyw0kkAe1l6e0,1675
33
35
  pertpy/tools/_differential_gene_expression/_dge_comparison.py,sha256=9HjmWkrqZhj_ZJeR-ymyEDzpRJNx7JiYJoStvCfKuCU,4188
34
- pertpy/tools/_differential_gene_expression/_edger.py,sha256=JziiW5rkXuQBJISAD_LvB2HOZUgJ1_qoqiR5Q4hEoP0,4321
35
- pertpy/tools/_differential_gene_expression/_formulaic.py,sha256=X4rPv4j8SDu5VJnf6_AIYJCCquUQka7G2LGtDLa8FhE,8715
36
- pertpy/tools/_differential_gene_expression/_pydeseq2.py,sha256=JK7H7u4va0q_TLE_sqi4JEzoPBd_xNRycYGu1507HS4,4117
36
+ pertpy/tools/_differential_gene_expression/_edger.py,sha256=ttgTocAYnr8BTDcixwHGjRZew6zeja-U77TLKkSdd1Y,4857
37
+ pertpy/tools/_differential_gene_expression/_pydeseq2.py,sha256=aOqsdu8hKp8_h2HhjkxS0B_itxRBnzEU2oSnU2PYiQ4,2942
37
38
  pertpy/tools/_differential_gene_expression/_simple_tests.py,sha256=tTSr0Z2Qbpxdy9bcO8Gi_up6R616IcoK_e4_rlanyx4,6621
38
- pertpy/tools/_differential_gene_expression/_statsmodels.py,sha256=zSOwJYDJyrl3hsEhMI5Q9Pyw2XLuEuj7T0zSAVcP6tQ,2585
39
+ pertpy/tools/_differential_gene_expression/_statsmodels.py,sha256=jBCtaCglOvvVjkIBGXuTCTDB6g2AJsZMCf7iOlDyn48,2195
39
40
  pertpy/tools/_distances/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
41
  pertpy/tools/_distances/_distance_tests.py,sha256=mNmNu5cX0Wj5IegR6x5K-CbBSid8EhrH2jZPQxuvK4U,13521
41
- pertpy/tools/_distances/_distances.py,sha256=iuHpBtWZbJhMZNSEjQkZUu6KPJXCjs_fX6YjopIWvwY,50343
42
+ pertpy/tools/_distances/_distances.py,sha256=h0FHkWF4MwfXO2ZbFHicgwVXsit-24z8PtfFzRrky2E,50497
42
43
  pertpy/tools/_perturbation_space/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
44
  pertpy/tools/_perturbation_space/_clustering.py,sha256=m52-J8c8OnIXRCf3NoFabIO2yMHIuy1X0m0amtsK2vE,3556
44
45
  pertpy/tools/_perturbation_space/_comparison.py,sha256=rLO-EGU0I7t5MnLw4k1gYU-ypRu-JsDPLat1t4h2U2M,4329
45
46
  pertpy/tools/_perturbation_space/_discriminator_classifiers.py,sha256=OA2eZeG_4iuW1T5ilsRIkS0rU-azmwEch7IuB546KSY,21617
46
47
  pertpy/tools/_perturbation_space/_metrics.py,sha256=y8-baP8WRdB1iDgvP3uuQxSCDxA2lcxvEHHM2C_vWHY,3248
47
- pertpy/tools/_perturbation_space/_perturbation_space.py,sha256=cZPPzzK4_UZV7ktcD5BQVXEy6ITHrfkg1CLFov3TzsY,18497
48
- pertpy/tools/_perturbation_space/_simple.py,sha256=LH5EYvcAbzFMvgd9bH7AUPKFmdioPiy2xG8xGaXzmq0,12624
48
+ pertpy/tools/_perturbation_space/_perturbation_space.py,sha256=F-F-_pMCTWxjkVQSLre6hrE6PeRfCRscpt2ug3NlfuU,19531
49
+ pertpy/tools/_perturbation_space/_simple.py,sha256=tgIDXcJ-uG59BpU64gAq_RbCb_AQn3UxvJi4Gjm48BY,14190
49
50
  pertpy/tools/_scgen/__init__.py,sha256=uERFlFyF88TH0uLiwmsUGEfHfLVCiZMFuk8gO5f7164,45
50
51
  pertpy/tools/_scgen/_base_components.py,sha256=Qq8myRUm43q9XBrZ9gBggfa2cSV2wbz_KYoLgH7iF1A,3009
51
- pertpy/tools/_scgen/_scgen.py,sha256=HPvFVjY9SS9bGqgTkCDuPYjmA4QHW7rKgHnI2yuI_Q4,30608
52
+ pertpy/tools/_scgen/_scgen.py,sha256=vPpCXUGVvrP5UxuaHuEaYK7D_A27HZcbFYpSCjMUcao,30708
52
53
  pertpy/tools/_scgen/_scgenvae.py,sha256=v_6tZ4wY-JjdMH1QVd_wG4_N0PoaqB-FM8zC2JsDu1o,3935
53
54
  pertpy/tools/_scgen/_utils.py,sha256=1upgOt1FpadfvNG05YpMjYYG-IAlxrC3l_ZxczmIczo,2841
54
- pertpy-0.9.4.dist-info/METADATA,sha256=0gKL9NKX-_hyYAGZvXqTNZySfUSG-VuJdOL_zNCBDrs,6882
55
- pertpy-0.9.4.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
56
- pertpy-0.9.4.dist-info/licenses/LICENSE,sha256=OZ-ZkXM5CmExJiEMM90b_7dGNNvRpj7kdE-49AnrLuI,1070
57
- pertpy-0.9.4.dist-info/RECORD,,
55
+ pertpy-0.10.0.dist-info/METADATA,sha256=U-9KOM65HXc4uHjsfbpQfu68sizlsKxsBQQGNNBAmFs,6940
56
+ pertpy-0.10.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
57
+ pertpy-0.10.0.dist-info/licenses/LICENSE,sha256=OZ-ZkXM5CmExJiEMM90b_7dGNNvRpj7kdE-49AnrLuI,1070
58
+ pertpy-0.10.0.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.25.0
2
+ Generator: hatchling 1.27.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any