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 +1 -1
- pertpy/data/_dataloader.py +2 -2
- pertpy/metadata/_cell_line.py +21 -37
- pertpy/metadata/_compound.py +2 -1
- pertpy/metadata/_look_up.py +1 -1
- pertpy/metadata/_metadata.py +4 -9
- pertpy/metadata/_moa.py +0 -2
- pertpy/tools/__init__.py +4 -3
- pertpy/tools/_augur.py +0 -1
- pertpy/tools/_coda/_base_coda.py +5 -3
- pertpy/tools/_coda/_sccoda.py +3 -1
- pertpy/tools/_coda/_tasccoda.py +3 -1
- pertpy/tools/_dialogue.py +0 -1
- pertpy/tools/_distances/_distances.py +0 -1
- pertpy/tools/_mixscape.py +3 -4
- {pertpy-0.11.0.dist-info → pertpy-0.11.2.dist-info}/METADATA +9 -7
- {pertpy-0.11.0.dist-info → pertpy-0.11.2.dist-info}/RECORD +19 -19
- {pertpy-0.11.0.dist-info → pertpy-0.11.2.dist-info}/WHEEL +0 -0
- {pertpy-0.11.0.dist-info → pertpy-0.11.2.dist-info}/licenses/LICENSE +0 -0
pertpy/__init__.py
CHANGED
pertpy/data/_dataloader.py
CHANGED
@@ -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,
|
pertpy/metadata/_cell_line.py
CHANGED
@@ -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
|
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
|
315
|
-
"Refer to the available reference identifier in the chosen database
|
316
|
-
"
|
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"
|
366
|
-
"
|
367
|
-
"
|
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
|
-
"
|
380
|
-
"
|
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
|
-
"
|
391
|
-
"
|
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}
|
476
|
-
"
|
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"
|
486
|
-
"
|
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"
|
555
|
-
"
|
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"
|
630
|
-
"
|
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
|
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'.
|
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":
|
pertpy/metadata/_compound.py
CHANGED
@@ -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():
|
pertpy/metadata/_look_up.py
CHANGED
@@ -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
|
-
|
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":
|
pertpy/metadata/_metadata.py
CHANGED
@@ -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"
|
53
|
-
"
|
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"
|
65
|
-
f"
|
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", "
|
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
pertpy/tools/_coda/_base_coda.py
CHANGED
@@ -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
|
-
|
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,
|
pertpy/tools/_coda/_sccoda.py
CHANGED
@@ -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
|
pertpy/tools/_coda/_tasccoda.py
CHANGED
@@ -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
|
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
|
-
"""
|
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, it
|
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.
|
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.
|
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>=
|
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
|
-
[](https://github.com/psf/black)
|
105
104
|
[](https://github.com/scverse/pertpy/actions/workflows/build.yml)
|
106
105
|
[](https://codecov.io/gh/scverse/pertpy)
|
107
106
|
[](https://opensource.org/licenses/Apache2.0)
|
@@ -111,13 +110,16 @@ Description-Content-Type: text/markdown
|
|
111
110
|
[](https://github.com/scverse/pertpy/actions/workflows/test.yml)
|
112
111
|
[](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
|

|
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
|
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=
|
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=
|
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=
|
10
|
-
pertpy/metadata/_compound.py,sha256=
|
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=
|
13
|
-
pertpy/metadata/_metadata.py,sha256=
|
14
|
-
pertpy/metadata/_moa.py,sha256=
|
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=
|
20
|
-
pertpy/tools/_augur.py,sha256=
|
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=
|
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=
|
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
|
30
|
-
pertpy/tools/_coda/_sccoda.py,sha256=
|
31
|
-
pertpy/tools/_coda/_tasccoda.py,sha256=
|
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=
|
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.
|
56
|
-
pertpy-0.11.
|
57
|
-
pertpy-0.11.
|
58
|
-
pertpy-0.11.
|
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,,
|
File without changes
|
File without changes
|