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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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