pertpy 0.11.0__py3-none-any.whl → 0.11.2__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.
pertpy/__init__.py CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  __author__ = "Lukas Heumos"
4
4
  __email__ = "lukas.heumos@posteo.net"
5
- __version__ = "0.11.0"
5
+ __version__ = "0.11.2"
6
6
 
7
7
  import warnings
8
8
 
@@ -15,8 +15,8 @@ from rich.progress import Progress
15
15
 
16
16
  def _download( # pragma: no cover
17
17
  url: str,
18
- output_file_name: str = None,
19
- output_path: str | Path = None,
18
+ output_file_name: str | None = None,
19
+ output_path: str | Path | None = None,
20
20
  block_size: int = 1024,
21
21
  overwrite: bool = False,
22
22
  is_zip: bool = False,
@@ -215,7 +215,7 @@ class CellLine(MetaData):
215
215
  For each cell, we fetch cell line annotation from either the Dependency Map (DepMap) or The Genomics of Drug Sensitivity in Cancer Project (Cancerxgene).
216
216
 
217
217
  Args:
218
- adata: The data object to annotate.
218
+ adata: The AnnData object to annotate.
219
219
  query_id: The column of ``.obs`` with cell line information.
220
220
  reference_id: The type of cell line identifier in the metadata, e.g. ModelID, CellLineName or StrippedCellLineName.
221
221
  If fetching cell line metadata from Cancerrxgene, it is recommended to choose "stripped_cell_line_name".
@@ -311,11 +311,9 @@ class CellLine(MetaData):
311
311
 
312
312
  else:
313
313
  raise ValueError(
314
- f"The requested cell line type {reference_id} is currently unavailable in the database.\n"
315
- "Refer to the available reference identifier in the chosen database.\n"
316
- "DepMap_ID is compared by default.\n"
317
- "Alternatively, create a `CellLineMetaData.lookup()` object to "
318
- "obtain the available reference identifiers in the metadata."
314
+ f"The requested cell line type {reference_id} is unavailable."
315
+ "Refer to the available reference identifier in the chosen database."
316
+ "Alternatively, create a `CellLineMetaData.lookup()` object to obtain the available reference identifiers in the metadata."
319
317
  )
320
318
 
321
319
  return adata
@@ -362,11 +360,9 @@ class CellLine(MetaData):
362
360
  # then we can compare these keys and fetch the corresponding metadata.
363
361
  if query_id not in adata.obs.columns and query_id is not None:
364
362
  raise ValueError(
365
- f"The specified `query_id` {query_id} can't be found in the `adata.obs`. \n"
366
- "Ensure that you are using one of the available query IDs present in the adata.obs for the annotation."
367
- "If the desired query ID is not available, you can fetch the cell line metadata "
368
- "using the `annotate()` function before calling 'annotate_bulk_rna()'. "
369
- "This ensures that the required query ID is included in your data, e.g. stripped_cell_line_name, DepMap ID."
363
+ f"Specified `query_id` {query_id} can't be found in `adata.obs`. \n"
364
+ "If the desired query ID is not available, fetch the cell line metadata "
365
+ "using the `annotate()` function before calling 'annotate_bulk_rna()'."
370
366
  )
371
367
  if query_id is None:
372
368
  query_id = "cell_line_name" if cell_line_source == "sanger" else "DepMap_ID"
@@ -376,9 +372,8 @@ class CellLine(MetaData):
376
372
  if cell_line_source == "sanger":
377
373
  if query_id not in adata.obs.columns:
378
374
  raise ValueError(
379
- "To annotate bulk RNA data from Wellcome Sanger Institute, `cell_line_name` is used as default reference and query identifier if no `query_id` is given."
380
- "Ensure that you have column `cell_line_name` in `adata.obs` or specify column name in which cell line name is stored."
381
- "If cell line name isn't available in 'adata.obs', use `annotate()` to annotate the cell line first."
375
+ f"Missing '{query_id}' in `adata.obs`. For Sanger, need `cell_line_name` column "
376
+ f"or specify column with cell line names via `query_id` parameter."
382
377
  )
383
378
  if self.bulk_rna_sanger is None:
384
379
  self._download_bulk_rna(cell_line_source="sanger")
@@ -387,9 +382,8 @@ class CellLine(MetaData):
387
382
  else:
388
383
  if query_id not in adata.obs.columns:
389
384
  raise ValueError(
390
- "To annotate bulk RNA data from Broad Institue, `DepMap_ID` is used as default reference and query identifier if no `query_id` is given."
391
- "Ensure that you have column `DepMap_ID` in `adata.obs` or specify column name in which DepMap ID is stored."
392
- "If DepMap ID isn't available in 'adata.obs', use `annotate()` to annotate the cell line first."
385
+ f"Missing '{query_id}' in `adata.obs`. For Broad Institute data, need `DepMap_ID` column "
386
+ f"or specify column with DepMap IDs via `query_id` parameter."
393
387
  )
394
388
  reference_id = "DepMap_ID"
395
389
 
@@ -472,19 +466,16 @@ class CellLine(MetaData):
472
466
  # then we can compare these keys and fetch the corresponding metadata.
473
467
  if query_id not in adata.obs.columns:
474
468
  raise ValueError(
475
- f"The specified `query_id` {query_id} can't be found in `adata.obs`. \n"
476
- "If the desired query ID is not available, you can fetch the cell line metadata \n"
477
- "using the `annotate()` function before calling annotate_protein_expression(). \n"
478
- "This ensures that the required query ID is included in your data."
469
+ f"The specified `query_id` `{query_id}` not found in `adata.obs`. "
470
+ "Fetch cell line metadata with `annotate()` before calling `annotate_protein_expression()`."
479
471
  )
480
472
  # Lazily download the proteomics data
481
473
  if self.proteomics is None:
482
474
  self._download_proteomics()
483
475
  if reference_id not in self.proteomics.columns:
484
476
  raise ValueError(
485
- f"The specified `reference_id`{reference_id} can't be found in the protein expression data. \n"
486
- "To solve the issue, please use the reference identifier available in the metadata. \n"
487
- "Alternatively, create a `CellLineMetaData.lookup()` object to obtain the available reference identifiers in the metadata."
477
+ f"Specified `reference_id` `{reference_id}` not found in protein expression data. "
478
+ f"Use available reference identifiers in metadata or create `CellLineMetaData.lookup()` object."
488
479
  )
489
480
 
490
481
  identifier_num_all = len(adata.obs[query_id].unique())
@@ -551,11 +542,8 @@ class CellLine(MetaData):
551
542
  adata = adata.copy()
552
543
  if query_id not in adata.obs.columns:
553
544
  raise ValueError(
554
- f"The specified `query_id` {query_id} can't be found in the `adata.obs`. \n"
555
- "Ensure that you are using one of the available query IDs present in 'adata.obs' for the annotation.\n"
556
- "If the desired query ID is not available, you can fetch the cell line metadata "
557
- "using the `annotate()` function before calling `annotate_from_gdsc()`. "
558
- "This ensures that the required query ID is included in your data."
545
+ f"Specified `query_id` `{query_id}` not found in `adata.obs`. "
546
+ "Use an available ID or fetch cell line metadata with `annotate()` before calling `annotate_from_gdsc()`."
559
547
  )
560
548
  # Lazily download the GDSC data
561
549
  if gdsc_dataset == "gdsc_1":
@@ -626,11 +614,8 @@ class CellLine(MetaData):
626
614
  adata = adata.copy()
627
615
  if query_id not in adata.obs.columns:
628
616
  raise ValueError(
629
- f"The specified `query_id` {query_id} can't be found in the `adata.obs`. \n"
630
- "Ensure that you are using one of the available query IDs present in 'adata.obs' for the annotation.\n"
631
- "If the desired query ID is not available, you can fetch the cell line metadata "
632
- "using the `annotate()` function before calling `annotate_from_prism()`. "
633
- "This ensures that the required query ID is included in your data."
617
+ f"Specified `query_id` `{query_id}` not found in `adata.obs`. "
618
+ "Use an available ID or fetch cell line metadata with `annotate()` before calling `annotate_from_prism()`."
634
619
  )
635
620
  if self.drug_response_prism is None:
636
621
  self._download_prism()
@@ -700,7 +685,6 @@ class CellLine(MetaData):
700
685
  if self.drug_response_prism is None:
701
686
  self._download_prism()
702
687
 
703
- # Transfer the data
704
688
  return LookUp(
705
689
  type="cell_line",
706
690
  transfer_metadata=[
@@ -775,7 +759,7 @@ class CellLine(MetaData):
775
759
  and sum(adata.obsm[metadata_key].columns != adata.var.index.values) > 0
776
760
  ):
777
761
  raise ValueError(
778
- "Column name of metadata is not the same as the index of adata.var. Ensure that the genes are in the same order."
762
+ "Column name of metadata is not the same as the index of `adata.var`. Ensure that the genes are in the same order."
779
763
  )
780
764
 
781
765
  # Divide cell lines into those are present and not present in the metadata
@@ -832,7 +816,7 @@ class CellLine(MetaData):
832
816
  """
833
817
  if corr is None or pval is None:
834
818
  raise ValueError(
835
- "Missing required input parameter: 'corr' or 'pval'. Please call the function `pt.md.CellLine.correlate()` to generate these outputs before proceeding."
819
+ "Missing required input parameter: 'corr' or 'pval'. Call `pt.md.CellLine.correlate()` before proceeding."
836
820
  )
837
821
 
838
822
  if category == "cell line":
@@ -3,7 +3,6 @@ from __future__ import annotations
3
3
  from typing import TYPE_CHECKING, Literal
4
4
 
5
5
  import pandas as pd
6
- import pubchempy as pcp
7
6
 
8
7
  from ._look_up import LookUp
9
8
  from ._metadata import MetaData
@@ -44,6 +43,8 @@ class Compound(MetaData):
44
43
  if query_id not in adata.obs.columns:
45
44
  raise ValueError(f"The requested query_id {query_id} is not in `adata.obs`.\n Please check again.")
46
45
 
46
+ import pubchempy as pcp
47
+
47
48
  query_dict = {}
48
49
  not_matched_identifiers = []
49
50
  for compound in adata.obs[query_id].dropna().astype(str).unique():
@@ -27,7 +27,7 @@ class LookUp:
27
27
  Args:
28
28
  type: Metadata type for annotation. One of 'cell_line', 'compound', 'moa' or 'drug.
29
29
  transfer_metadata: DataFrames used to generate Lookup object.
30
- This is currently set to None for CompoundMetaData which does not require any dataframes for transfer.
30
+ Currently set to None for CompoundMetaData which does not require any DataFrames for transfer.
31
31
  """
32
32
  self.type = type
33
33
  if type == "cell_line":
@@ -49,11 +49,8 @@ class MetaData:
49
49
  if metadata_type in ["protein expression", "bulk RNA", "drug response"]:
50
50
  hint = "Additionally, call the `CellLineMetaData.annotate()` function to acquire more possible query IDs that can be used for cell line annotation purposes."
51
51
  raise ValueError(
52
- f"Attempting to match the query id {query_id} in 'adata.obs' to the reference id {reference_id} in the metadata.\n"
53
- "However, none of the query IDs could be found in the {metadata_type} annotation data.\n"
54
- "To resolve this issue, call the `lookup()` function to create a LookUp object.\n"
55
- "This enables obtaining the count of matched identifiers in the AnnData object for different types of reference and query IDs.\n"
56
- f"{hint}"
52
+ f"No matches between `{query_id}` in adata.obs and `{reference_id}` in {metadata_type} data. "
53
+ f"Use `lookup()` to check compatible identifier types. {hint}"
57
54
  )
58
55
  if len(unmatched_identifiers) == 0:
59
56
  return
@@ -61,10 +58,8 @@ class MetaData:
61
58
  verbosity = min(verbosity, len(unmatched_identifiers))
62
59
  if verbosity > 0:
63
60
  logger.info(
64
- f"There are {total_identifiers} identifiers in `adata.obs`."
65
- f"However, {len(unmatched_identifiers)} identifiers can't be found in the {metadata_type} annotation, "
66
- "leading to the presence of NA values for their respective metadata.\n"
67
- f"Please check again: *unmatched_identifiers[:verbosity]..."
61
+ f"{total_identifiers} identifiers in `adata.obs`, {len(unmatched_identifiers)} not found in {metadata_type} data. "
62
+ f"NA values present. Unmatched: {unmatched_identifiers[:verbosity]}"
68
63
  )
69
64
  else:
70
65
  raise ValueError("Only 'all' or a non-negative value is accepted.")
pertpy/metadata/_moa.py CHANGED
@@ -110,8 +110,6 @@ class Moa(MetaData):
110
110
  """Generate LookUp object for Moa metadata.
111
111
 
112
112
  The LookUp object provides an overview of the metadata to annotate.
113
- annotate_moa function has a corresponding lookup function in the LookUp object,
114
- where users can search the query_ids and targets in the metadata.
115
113
 
116
114
  Returns:
117
115
  Returns a LookUp object specific for MoA annotation.
pertpy/tools/__init__.py CHANGED
@@ -1,7 +1,7 @@
1
1
  from importlib import import_module
2
2
 
3
3
 
4
- def lazy_import(module_path, class_name, extras):
4
+ def lazy_import(module_path: str, class_name: str, extras: list[str]):
5
5
  try:
6
6
  for extra in extras:
7
7
  import_module(extra)
@@ -21,6 +21,7 @@ def lazy_import(module_path, class_name, extras):
21
21
 
22
22
  from pertpy.tools._augur import Augur
23
23
  from pertpy.tools._cinemaot import Cinemaot
24
+ from pertpy.tools._coda._sccoda import Sccoda
24
25
  from pertpy.tools._dialogue import Dialogue
25
26
  from pertpy.tools._distances._distance_tests import DistanceTest
26
27
  from pertpy.tools._distances._distances import Distance
@@ -41,8 +42,7 @@ from pertpy.tools._perturbation_space._simple import (
41
42
  )
42
43
  from pertpy.tools._scgen import Scgen
43
44
 
44
- CODA_EXTRAS = ["toytree", "arviz", "ete4"] # also pyqt6 technically
45
- Sccoda = lazy_import("pertpy.tools._coda._sccoda", "Sccoda", CODA_EXTRAS)
45
+ CODA_EXTRAS = ["toytree", "ete4"] # also "pyqt6" but it cannot be imported
46
46
  Tasccoda = lazy_import("pertpy.tools._coda._tasccoda", "Tasccoda", CODA_EXTRAS)
47
47
 
48
48
  DE_EXTRAS = ["formulaic", "pydeseq2"]
@@ -69,6 +69,7 @@ __all__ = [
69
69
  "Milo",
70
70
  "Mixscape",
71
71
  "ClusteringSpace",
72
+ "PerturbationComparison",
72
73
  "LRClassifierSpace",
73
74
  "MLPClassifierSpace",
74
75
  "CentroidSpace",
pertpy/tools/_augur.py CHANGED
@@ -2,7 +2,6 @@ from __future__ import annotations
2
2
 
3
3
  import random
4
4
  from collections import defaultdict
5
- from dataclasses import dataclass
6
5
  from math import floor, nan
7
6
  from typing import TYPE_CHECKING, Any, Literal
8
7
 
@@ -4,12 +4,10 @@ from abc import ABC, abstractmethod
4
4
  from pathlib import Path
5
5
  from typing import TYPE_CHECKING, Literal
6
6
 
7
- import arviz as az
8
7
  import jax.numpy as jnp
9
8
  import matplotlib.pyplot as plt
10
9
  import numpy as np
11
10
  import pandas as pd
12
- import patsy as pt
13
11
  import scanpy as sc
14
12
  import seaborn as sns
15
13
  from adjustText import adjust_text
@@ -126,7 +124,9 @@ class CompositionalModel2(ABC):
126
124
  sample_adata.X = sample_adata.X.astype(dtype)
127
125
 
128
126
  # Build covariate matrix from R-like formula, save in obsm
129
- covariate_matrix = pt.dmatrix(formula, sample_adata.obs)
127
+ import patsy
128
+
129
+ covariate_matrix = patsy.dmatrix(formula, sample_adata.obs)
130
130
  covariate_names = covariate_matrix.design_info.column_names[1:]
131
131
  sample_adata.obsm["covariate_matrix"] = np.array(covariate_matrix[:, 1:]).astype(dtype)
132
132
 
@@ -461,6 +461,8 @@ class CompositionalModel2(ABC):
461
461
  else:
462
462
  raise ValueError("No valid model type!")
463
463
 
464
+ import arviz as az
465
+
464
466
  summ = az.summary(
465
467
  data=self.make_arviz(sample_adata, num_prior_samples=0, use_posterior_predictive=False),
466
468
  var_names=var_names,
@@ -2,7 +2,6 @@ from __future__ import annotations
2
2
 
3
3
  from typing import TYPE_CHECKING, Literal
4
4
 
5
- import arviz as az
6
5
  import jax.numpy as jnp
7
6
  import numpy as np
8
7
  import numpyro as npy
@@ -17,6 +16,7 @@ from rich import print
17
16
  from pertpy.tools._coda._base_coda import CompositionalModel2, from_scanpy
18
17
 
19
18
  if TYPE_CHECKING:
19
+ import arviz as az
20
20
  import pandas as pd
21
21
 
22
22
  config.update("jax_enable_x64", True)
@@ -406,6 +406,8 @@ class Sccoda(CompositionalModel2):
406
406
  else:
407
407
  prior = None
408
408
 
409
+ import arviz as az
410
+
409
411
  # Create arviz object
410
412
  arviz_data = az.from_numpyro(
411
413
  self.mcmc, prior=prior, posterior_predictive=posterior_predictive, dims=dims, coords=coords
@@ -2,7 +2,6 @@ from __future__ import annotations
2
2
 
3
3
  from typing import TYPE_CHECKING, Literal
4
4
 
5
- import arviz as az
6
5
  import jax.numpy as jnp
7
6
  import numpy as np
8
7
  import numpyro as npy
@@ -25,6 +24,7 @@ from pertpy.tools._coda._base_coda import (
25
24
  )
26
25
 
27
26
  if TYPE_CHECKING:
27
+ import arviz as az
28
28
  import pandas as pd
29
29
 
30
30
  config.update("jax_enable_x64", True)
@@ -572,6 +572,8 @@ class Tasccoda(CompositionalModel2):
572
572
  else:
573
573
  prior = None
574
574
 
575
+ import arviz as az
576
+
575
577
  # Create arviz object
576
578
  arviz_data = az.from_numpyro(
577
579
  self.mcmc, prior=prior, posterior_predictive=posterior_predictive, dims=dims, coords=coords
pertpy/tools/_dialogue.py CHANGED
@@ -20,7 +20,6 @@ from rich.live import Live
20
20
  from rich.progress import BarColumn, Progress, SpinnerColumn, TaskProgressColumn, TextColumn
21
21
  from scipy import stats
22
22
  from scipy.optimize import nnls
23
- from seaborn import PairGrid
24
23
  from sklearn.linear_model import LinearRegression
25
24
  from sparsecca import lp_pmd, multicca_permute, multicca_pmd
26
25
  from statsmodels.sandbox.stats.multicomp import multipletests
@@ -1,6 +1,5 @@
1
1
  from __future__ import annotations
2
2
 
3
- import multiprocessing
4
3
  from abc import ABC, abstractmethod
5
4
  from typing import TYPE_CHECKING, Literal, NamedTuple
6
5
 
pertpy/tools/_mixscape.py CHANGED
@@ -26,11 +26,10 @@ if TYPE_CHECKING:
26
26
  from matplotlib.axes import Axes
27
27
  from matplotlib.colors import Colormap
28
28
  from matplotlib.pyplot import Figure
29
- from scipy import sparse
30
29
 
31
30
 
32
31
  class Mixscape:
33
- """Python implementation of Mixscape."""
32
+ """identify perturbation effects in CRISPR screens by separating cells into perturbation groups."""
34
33
 
35
34
  def __init__(self):
36
35
  pass
@@ -71,7 +70,7 @@ class Mixscape:
71
70
  use_rep: Use the indicated representation. `'X'` or any key for `.obsm` is valid.
72
71
  If `None`, the representation is chosen automatically:
73
72
  For `.n_vars` < 50, `.X` is used, otherwise 'X_pca' is used.
74
- If 'X_pca' is not present, its computed with default parameters.
73
+ If 'X_pca' is not present, it's computed with default parameters.
75
74
  n_dims: Number of dimensions to use from the representation to calculate the perturbation signature.
76
75
  If `None`, use all dimensions.
77
76
  n_pcs: If PCA representation is used, the number of principal components to compute.
@@ -1189,7 +1188,7 @@ class MixscapeGaussianMixture(GaussianMixture):
1189
1188
  n_components: Number of Gaussian components
1190
1189
  fixed_means: Means to fix (use None for those that should be estimated)
1191
1190
  fixed_covariances: Covariances to fix (use None for those that should be estimated)
1192
- kwargs: Additional arguments passed to scikit-learn's GaussianMixture
1191
+ **kwargs: Additional arguments passed to scikit-learn's GaussianMixture
1193
1192
  """
1194
1193
  super().__init__(n_components=n_components, **kwargs)
1195
1194
  self.fixed_means = fixed_means
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pertpy
3
- Version: 0.11.0
3
+ Version: 0.11.2
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
@@ -67,7 +67,7 @@ Requires-Dist: sparsecca
67
67
  Provides-Extra: de
68
68
  Requires-Dist: formulaic; extra == 'de'
69
69
  Requires-Dist: formulaic-contrasts>=0.2.0; extra == 'de'
70
- Requires-Dist: pydeseq2>=v0.5.0pre1; extra == 'de'
70
+ Requires-Dist: pydeseq2>=v0.5.0; extra == 'de'
71
71
  Provides-Extra: dev
72
72
  Requires-Dist: pre-commit; extra == 'dev'
73
73
  Provides-Extra: doc
@@ -88,7 +88,7 @@ Requires-Dist: sphinx-gallery; extra == 'doc'
88
88
  Requires-Dist: sphinx-issues; extra == 'doc'
89
89
  Requires-Dist: sphinx-last-updated-by-git; extra == 'doc'
90
90
  Requires-Dist: sphinx-remove-toctrees; extra == 'doc'
91
- Requires-Dist: sphinx>=6; extra == 'doc'
91
+ Requires-Dist: sphinx>=8.1; extra == 'doc'
92
92
  Requires-Dist: sphinxcontrib-bibtex>=1.0.0; extra == 'doc'
93
93
  Requires-Dist: sphinxext-opengraph; extra == 'doc'
94
94
  Provides-Extra: tcoda
@@ -101,7 +101,6 @@ Requires-Dist: leidenalg; extra == 'test'
101
101
  Requires-Dist: pytest; extra == 'test'
102
102
  Description-Content-Type: text/markdown
103
103
 
104
- [![Black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
105
104
  [![Build](https://github.com/scverse/pertpy/actions/workflows/build.yml/badge.svg)](https://github.com/scverse/pertpy/actions/workflows/build.yml)
106
105
  [![codecov](https://codecov.io/gh/scverse/pertpy/graph/badge.svg?token=1dTpIPBShv)](https://codecov.io/gh/scverse/pertpy)
107
106
  [![License](https://img.shields.io/github/license/scverse/pertpy)](https://opensource.org/licenses/Apache2.0)
@@ -111,13 +110,16 @@ Description-Content-Type: text/markdown
111
110
  [![Test](https://github.com/scverse/pertpy/actions/workflows/test.yml/badge.svg)](https://github.com/scverse/pertpy/actions/workflows/test.yml)
112
111
  [![PyPI](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)](https://github.com/pre-commit/pre-commit)
113
112
 
114
- # pertpy
113
+ # pertpy - Perturbation Analysis in Python
114
+
115
+ Pertpy is a scverse ecosystem framework for analyzing large-scale single-cell perturbation experiments.
116
+ It provides tools for harmonizing perturbation datasets, automating metadata annotation, calculating perturbation distances, and efficiently analyzing how cells respond to various stimuli like genetic modifications, drug treatments, and environmental changes.
115
117
 
116
118
  ![fig1](https://github.com/user-attachments/assets/d2e32d69-b767-4be3-a938-77a9dce45d3f)
117
119
 
118
120
  ## Documentation
119
121
 
120
- Please read the [documentation](https://pertpy.readthedocs.io/en/latest).
122
+ Please read the [documentation](https://pertpy.readthedocs.io/en/latest) for installation, tutorials, use cases, and more.
121
123
 
122
124
  ## Installation
123
125
 
@@ -149,7 +151,7 @@ bioRxiv 2024.08.04.606516; doi: https://doi.org/10.1101/2024.08.04.606516](https
149
151
 
150
152
  [pip]: https://pip.pypa.io/
151
153
  [pypi]: https://pypi.org/
152
- [api]: https://pertpy.readthedocs.io/en/latest/api/api.html
154
+ [api]: https://pertpy.readthedocs.io/en/latest/api.html
153
155
  [//]: # "numfocus-fiscal-sponsor-attribution"
154
156
 
155
157
  pertpy is part of the scverse® project ([website](https://scverse.org), [governance](https://scverse.org/about/roles)) and is fiscally sponsored by [NumFOCUS](https://numfocus.org/).
@@ -1,34 +1,34 @@
1
- pertpy/__init__.py,sha256=2cNNXWvBztH3KQzxe5WEl_Krfh0tdax4pPg1iUYjhQE,716
1
+ pertpy/__init__.py,sha256=wwZLpjFSDAZzGA0HGNuk8LoxXjWdrD9OKvpJ4fdsHZU,716
2
2
  pertpy/_doc.py,sha256=j5TMNC-DA9yIMqIIUNpjpcVgWfRqyBBfvbRjnCM_OLs,427
3
3
  pertpy/_types.py,sha256=IcHCojCUqx8CapibNkcYf2TUqjBFP2ujeELvn_IBSBQ,154
4
4
  pertpy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  pertpy/data/__init__.py,sha256=ah3yvoxkgbdMUNAWxS3SyqcUuVamBOSeuWkF2QRAEwM,2703
6
- pertpy/data/_dataloader.py,sha256=ZWDDvx8KmqkvMcjXEmGNeDyCceDur_osb-o2dDTHeQU,4397
6
+ pertpy/data/_dataloader.py,sha256=Osml8irOaoL2n2MhKRKre70Poxiv6NfJBKaK8vRe07Q,4411
7
7
  pertpy/data/_datasets.py,sha256=4IceyYURpstZSFRrD6gBjoYg8uRbEPo1QLXTt-SwB5k,65507
8
8
  pertpy/metadata/__init__.py,sha256=wROPCXmJX2v5schJaBTPQtGW-FGCNWPfO_6bpnXwk-c,276
9
- pertpy/metadata/_cell_line.py,sha256=xzlJV_loGS5yA3QaB2xnp0mlEgCWdoG1VPCrfbJKtMw,44494
10
- pertpy/metadata/_compound.py,sha256=ywNNqtib0exHv0z8ctmTRf1Hk64tSGWSiUEffycxf6A,4755
9
+ pertpy/metadata/_cell_line.py,sha256=hKmaZvjIsQ3wHo__0aKo3JlWvsf8-4OD-gIBNQnW8_E,42716
10
+ pertpy/metadata/_compound.py,sha256=JsAv_KCcNkgVVrXTyhu-BeM8rBX8a93Wq5Z6avpxN7Y,4764
11
11
  pertpy/metadata/_drug.py,sha256=8QDSyxiFl25JdS80EQJC_krg6fEe5LIQEE6BsV1r8nY,9006
12
- pertpy/metadata/_look_up.py,sha256=4BuQlff_aAKFOKPojXDdxvH6uOkRlHzGeyxcjBc79OM,28682
13
- pertpy/metadata/_metadata.py,sha256=hV2LTFrExddLNU_RsDkZju6lQUSRoP4OIn_dumCyQao,3277
14
- pertpy/metadata/_moa.py,sha256=cSJimHZsPZ6tAXcl_aHOhyzUayf6fqtgAcJJ5KwRRsA,4698
12
+ pertpy/metadata/_look_up.py,sha256=0nrI_xy-qBZ3tyt4dwhEBwm0A9WP95ZaDiUQFf_88FU,28663
13
+ pertpy/metadata/_metadata.py,sha256=hzaLHRyf6YtEMdkZ7_fqTvnlYhSmjQINHz42FqVYrSU,2805
14
+ pertpy/metadata/_moa.py,sha256=kMpjqReu-WV_tbVJLrKe7gc-WyGkkEX-59V-ZUY3X5g,4536
15
15
  pertpy/plot/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
16
  pertpy/preprocessing/__init__.py,sha256=VAPFaeq2_qCvdFkQTCj_Hm460HC4Tersu8Rig_tnp_Y,71
17
17
  pertpy/preprocessing/_guide_rna.py,sha256=ijL-bjQ-9qn4r3DlhBxzsqk-bD4RqPsFlok-Otj4hg8,15872
18
18
  pertpy/preprocessing/_guide_rna_mixture.py,sha256=pT_YkjmN4iEJ-THBROu_dpbr8E6u8GJw36YoGseikD0,6422
19
- pertpy/tools/__init__.py,sha256=DhjK2mfjbtvg9vG1ox6dF7A7UgiPZ_qmVH5o0QaTQyk,2599
20
- pertpy/tools/_augur.py,sha256=7iB2_xq8knyxtmN0G_a0u37o8WPlMlJXZCwDqxGvoKQ,55296
19
+ pertpy/tools/__init__.py,sha256=xjfw3Dd_KGytjjCID0uEs6Fz7DalH46fCjVL2Zf2kOo,2629
20
+ pertpy/tools/_augur.py,sha256=tc1YKyc0BwzrEGgctsfyy7DsTNKxyvy7ZvWraTWCc1A,55262
21
21
  pertpy/tools/_cinemaot.py,sha256=54-rS0AEj31dMe7iU4kEmLoAunq3jNuhsBE3IEp9hrI,38071
22
- pertpy/tools/_dialogue.py,sha256=ngjDcJK0D6ukJwiyS9cLYjrDU82n1FJru8yx8TvKSt8,52384
22
+ pertpy/tools/_dialogue.py,sha256=cCSwo9ge1pOLoA7QHTPb3b865juCFWUaKX5aD7UoSjo,52355
23
23
  pertpy/tools/_enrichment.py,sha256=55mwotLH9DXQOhl85MCkxXu-MX0RysLyrPheJysAnF0,21369
24
24
  pertpy/tools/_milo.py,sha256=r-kZcpAcoQuhi41AnVuzh-cMIcV3HB3-RGzynHyDc1A,43712
25
- pertpy/tools/_mixscape.py,sha256=ob22FI1hqUtaEZzCqrocy0-k8iUOChItc2tdCDeNDGY,57173
25
+ pertpy/tools/_mixscape.py,sha256=qjXGyH-oeBFte0efuHJfhVEbivnzUVWREwC40ef6Se8,57203
26
26
  pertpy/tools/decoupler_LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
27
27
  pertpy/tools/transferlearning_MMD_LICENSE,sha256=MUvDA-o_j9htRpI8fStVdCRuyLdPkQUuIH0a_EIc57w,1069
28
28
  pertpy/tools/_coda/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
- pertpy/tools/_coda/_base_coda.py,sha256=cITCEWyiPlxqS1Buhs8JzE3yHCdQksFitcXscEK7WX4,111504
30
- pertpy/tools/_coda/_sccoda.py,sha256=UjT9mha14YPk6jIqigAbyb1zqhrtBDV7b3NMWeoMFJ4,22575
31
- pertpy/tools/_coda/_tasccoda.py,sha256=hZBUhqpymFLu-l8CZ0FDLk04kUah9aSyHZwQhvHVm-U,30433
29
+ pertpy/tools/_coda/_base_coda.py,sha256=-rpdipPLFd4cFXyLMN7uFgv-pFJseKaqDmyWRBrGfws,111519
30
+ pertpy/tools/_coda/_sccoda.py,sha256=0Ret6O56kAfCNOdBvtxqiyuj2rUPp18SV1GVK1AvYGU,22607
31
+ pertpy/tools/_coda/_tasccoda.py,sha256=BTaOAmL458zQ_og3x4ENlDnJHD6_F4YkdCoXWsF4i1U,30465
32
32
  pertpy/tools/_differential_gene_expression/__init__.py,sha256=SEydWg0iT3Y1pApjnCAOuHxFeI6xVUfgyBHv2s3LADU,487
33
33
  pertpy/tools/_differential_gene_expression/_base.py,sha256=PpfH_RZXsN79Bu0yBFPE9TXEqNsZ4bSzSbhM0wZou2I,38322
34
34
  pertpy/tools/_differential_gene_expression/_checks.py,sha256=hH_GP0lWGO-5zrCFX4YiIVCZBCuK0ZJ0jFmdlx2Qm4k,1639
@@ -39,7 +39,7 @@ pertpy/tools/_differential_gene_expression/_simple_tests.py,sha256=SfU8s_P2JzEA1
39
39
  pertpy/tools/_differential_gene_expression/_statsmodels.py,sha256=90h9EPuoCtNxAbJ1Xq4j_E4yYJJpk64zTP7GyTdmrxY,2220
40
40
  pertpy/tools/_distances/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
41
  pertpy/tools/_distances/_distance_tests.py,sha256=6_nqfHUfKxkI2Yhkzspq3ujMpq56zV_Ddn7bgPzgjyo,13513
42
- pertpy/tools/_distances/_distances.py,sha256=uzE8IcKPFYYXI0fKSgFHM_UIBZfA6uf9gBTSq8nZmZw,50496
42
+ pertpy/tools/_distances/_distances.py,sha256=89d1zShW_9dhphup2oWx5hMOFC7RdogOY56doMuBFts,50473
43
43
  pertpy/tools/_perturbation_space/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
44
  pertpy/tools/_perturbation_space/_clustering.py,sha256=pNx_SpPkZfCbgF7vzHWqAaiiHdbxPaA-L-hTWTbzFhI,3528
45
45
  pertpy/tools/_perturbation_space/_comparison.py,sha256=-NzCPRT-IlhJ9hOz7NQLSk0riIzr2C0yZvX6zm3kon4,4291
@@ -52,7 +52,7 @@ pertpy/tools/_scgen/_base_components.py,sha256=Qq8myRUm43q9XBrZ9gBggfa2cSV2wbz_K
52
52
  pertpy/tools/_scgen/_scgen.py,sha256=31T8ez0FxABIbunJHCk8xvGulHFb8RHXSsyM_z1WsPY,30850
53
53
  pertpy/tools/_scgen/_scgenvae.py,sha256=bPk4v7EdJc7ROdLuDitHiX_Pvwa7Flw2qHRUwBvjLJY,3889
54
54
  pertpy/tools/_scgen/_utils.py,sha256=qz5QUn_Bvk2NGyYVzp3jgjWTFOMt1YyHwUo6HWtoThY,2871
55
- pertpy-0.11.0.dist-info/METADATA,sha256=k17pDMEOKlDxSvRvG7D8iAA3jGidVvkOGrwuGef1uGc,7706
56
- pertpy-0.11.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
57
- pertpy-0.11.0.dist-info/licenses/LICENSE,sha256=XuiT2hxeRInhquEIBKMZ5M21n5syhDQ4XbABoposIAg,1100
58
- pertpy-0.11.0.dist-info/RECORD,,
55
+ pertpy-0.11.2.dist-info/METADATA,sha256=jlccMD9v37v5vcJJbwpumliEoQR-07sy8vwCKzLL7D0,8047
56
+ pertpy-0.11.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
57
+ pertpy-0.11.2.dist-info/licenses/LICENSE,sha256=XuiT2hxeRInhquEIBKMZ5M21n5syhDQ4XbABoposIAg,1100
58
+ pertpy-0.11.2.dist-info/RECORD,,