pertpy 0.6.0__py3-none-any.whl → 0.8.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.
- pertpy/__init__.py +4 -2
- pertpy/data/__init__.py +66 -1
- pertpy/data/_dataloader.py +28 -26
- pertpy/data/_datasets.py +261 -92
- pertpy/metadata/__init__.py +6 -0
- pertpy/metadata/_cell_line.py +795 -0
- pertpy/metadata/_compound.py +128 -0
- pertpy/metadata/_drug.py +238 -0
- pertpy/metadata/_look_up.py +569 -0
- pertpy/metadata/_metadata.py +70 -0
- pertpy/metadata/_moa.py +125 -0
- pertpy/plot/__init__.py +0 -13
- pertpy/preprocessing/__init__.py +2 -0
- pertpy/preprocessing/_guide_rna.py +89 -6
- pertpy/tools/__init__.py +48 -15
- pertpy/tools/_augur.py +329 -32
- pertpy/tools/_cinemaot.py +145 -6
- pertpy/tools/_coda/_base_coda.py +1237 -116
- pertpy/tools/_coda/_sccoda.py +66 -36
- pertpy/tools/_coda/_tasccoda.py +46 -39
- pertpy/tools/_dialogue.py +180 -77
- pertpy/tools/_differential_gene_expression/__init__.py +20 -0
- pertpy/tools/_differential_gene_expression/_base.py +657 -0
- pertpy/tools/_differential_gene_expression/_checks.py +41 -0
- pertpy/tools/_differential_gene_expression/_dge_comparison.py +86 -0
- pertpy/tools/_differential_gene_expression/_edger.py +125 -0
- pertpy/tools/_differential_gene_expression/_formulaic.py +189 -0
- pertpy/tools/_differential_gene_expression/_pydeseq2.py +95 -0
- pertpy/tools/_differential_gene_expression/_simple_tests.py +162 -0
- pertpy/tools/_differential_gene_expression/_statsmodels.py +72 -0
- pertpy/tools/_distances/_distance_tests.py +29 -24
- pertpy/tools/_distances/_distances.py +584 -98
- pertpy/tools/_enrichment.py +460 -0
- pertpy/tools/_kernel_pca.py +1 -1
- pertpy/tools/_milo.py +406 -49
- pertpy/tools/_mixscape.py +677 -55
- pertpy/tools/_perturbation_space/_clustering.py +10 -3
- pertpy/tools/_perturbation_space/_comparison.py +112 -0
- pertpy/tools/_perturbation_space/_discriminator_classifiers.py +524 -0
- pertpy/tools/_perturbation_space/_perturbation_space.py +146 -52
- pertpy/tools/_perturbation_space/_simple.py +52 -11
- pertpy/tools/_scgen/__init__.py +1 -1
- pertpy/tools/_scgen/_base_components.py +2 -3
- pertpy/tools/_scgen/_scgen.py +706 -0
- pertpy/tools/_scgen/_utils.py +3 -5
- pertpy/tools/decoupler_LICENSE +674 -0
- {pertpy-0.6.0.dist-info → pertpy-0.8.0.dist-info}/METADATA +48 -20
- pertpy-0.8.0.dist-info/RECORD +57 -0
- {pertpy-0.6.0.dist-info → pertpy-0.8.0.dist-info}/WHEEL +1 -1
- pertpy/plot/_augur.py +0 -234
- pertpy/plot/_cinemaot.py +0 -81
- pertpy/plot/_coda.py +0 -1001
- pertpy/plot/_dialogue.py +0 -91
- pertpy/plot/_guide_rna.py +0 -82
- pertpy/plot/_milopy.py +0 -284
- pertpy/plot/_mixscape.py +0 -594
- pertpy/plot/_scgen.py +0 -337
- pertpy/tools/_differential_gene_expression.py +0 -99
- pertpy/tools/_metadata/__init__.py +0 -0
- pertpy/tools/_metadata/_cell_line.py +0 -613
- pertpy/tools/_metadata/_look_up.py +0 -342
- pertpy/tools/_perturbation_space/_discriminator_classifier.py +0 -381
- pertpy/tools/_scgen/_jax_scgen.py +0 -370
- pertpy-0.6.0.dist-info/RECORD +0 -50
- /pertpy/tools/_scgen/{_jax_scgenvae.py → _scgenvae.py} +0 -0
- {pertpy-0.6.0.dist-info → pertpy-0.8.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,11 +1,11 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.3
|
2
2
|
Name: pertpy
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.8.0
|
4
4
|
Summary: Perturbation Analysis in the scverse ecosystem.
|
5
5
|
Project-URL: Documentation, https://pertpy.readthedocs.io
|
6
|
-
Project-URL: Source, https://github.com/
|
7
|
-
Project-URL: Home-page, https://github.com/
|
8
|
-
Author: Lukas Heumos, Yuge Ji, Alejandro Tejada, Johannes Köster, Emma Dann, Xinyue Zhang, Xichen Wu,
|
6
|
+
Project-URL: Source, https://github.com/scverse/pertpy
|
7
|
+
Project-URL: Home-page, https://github.com/scverse/pertpy
|
8
|
+
Author: Lukas Heumos, Yuge Ji, Lilly May, Alejandro Tejada, Johannes Köster, Emma Dann, Xinyue Zhang, Xichen Wu, Tessa Green, Stefan Peidli, Antonia Schumacher, Gregor Sturm
|
9
9
|
Maintainer-email: Lukas Heumos <lukas.heumos@posteo.net>
|
10
10
|
License: MIT License
|
11
11
|
|
@@ -29,18 +29,30 @@ License: MIT License
|
|
29
29
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
30
30
|
SOFTWARE.
|
31
31
|
License-File: LICENSE
|
32
|
-
|
32
|
+
Classifier: Development Status :: 4 - Beta
|
33
|
+
Classifier: Environment :: Console
|
34
|
+
Classifier: Framework :: Jupyter
|
35
|
+
Classifier: Intended Audience :: Developers
|
36
|
+
Classifier: Intended Audience :: Science/Research
|
37
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
38
|
+
Classifier: Natural Language :: English
|
39
|
+
Classifier: Operating System :: MacOS :: MacOS X
|
40
|
+
Classifier: Operating System :: POSIX :: Linux
|
41
|
+
Classifier: Programming Language :: Python :: 3
|
42
|
+
Classifier: Programming Language :: Python :: 3.10
|
43
|
+
Classifier: Programming Language :: Python :: 3.11
|
44
|
+
Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
|
45
|
+
Classifier: Topic :: Scientific/Engineering :: Visualization
|
46
|
+
Requires-Python: >=3.10
|
33
47
|
Requires-Dist: adjusttext
|
34
|
-
Requires-Dist:
|
35
|
-
Requires-Dist: arviz
|
48
|
+
Requires-Dist: blitzgsea
|
36
49
|
Requires-Dist: decoupler
|
37
|
-
Requires-Dist:
|
50
|
+
Requires-Dist: lamin-utils
|
38
51
|
Requires-Dist: muon
|
39
|
-
Requires-Dist: numba
|
40
|
-
Requires-Dist: numpyro
|
41
52
|
Requires-Dist: openpyxl
|
42
53
|
Requires-Dist: ott-jax
|
43
|
-
Requires-Dist:
|
54
|
+
Requires-Dist: pubchempy
|
55
|
+
Requires-Dist: pyarrow
|
44
56
|
Requires-Dist: requests
|
45
57
|
Requires-Dist: rich
|
46
58
|
Requires-Dist: scanpy[leiden]
|
@@ -48,10 +60,14 @@ Requires-Dist: scikit-misc
|
|
48
60
|
Requires-Dist: scipy
|
49
61
|
Requires-Dist: scvi-tools
|
50
62
|
Requires-Dist: sparsecca
|
51
|
-
Requires-Dist: toytree
|
52
63
|
Provides-Extra: coda
|
64
|
+
Requires-Dist: arviz; extra == 'coda'
|
53
65
|
Requires-Dist: ete3; extra == 'coda'
|
54
66
|
Requires-Dist: pyqt5; extra == 'coda'
|
67
|
+
Requires-Dist: toytree; extra == 'coda'
|
68
|
+
Provides-Extra: de
|
69
|
+
Requires-Dist: formulaic; extra == 'de'
|
70
|
+
Requires-Dist: pydeseq2; extra == 'de'
|
55
71
|
Provides-Extra: dev
|
56
72
|
Requires-Dist: pre-commit; extra == 'dev'
|
57
73
|
Provides-Extra: doc
|
@@ -76,23 +92,23 @@ Requires-Dist: sphinx>=4; extra == 'doc'
|
|
76
92
|
Requires-Dist: sphinxcontrib-bibtex>=1.0.0; extra == 'doc'
|
77
93
|
Requires-Dist: sphinxext-opengraph; extra == 'doc'
|
78
94
|
Provides-Extra: test
|
95
|
+
Requires-Dist: coverage; extra == 'test'
|
79
96
|
Requires-Dist: pytest; extra == 'test'
|
80
|
-
Requires-Dist: pytest-cov; extra == 'test'
|
81
97
|
Description-Content-Type: text/markdown
|
82
98
|
|
83
99
|
[](https://github.com/psf/black)
|
84
|
-
[](https://github.com/scverse/pertpy/actions/workflows/build.yml)
|
101
|
+
[](https://codecov.io/gh/scverse/pertpy)
|
102
|
+
[](https://opensource.org/licenses/Apache2.0)
|
87
103
|
[](https://pypi.org/project/pertpy/)
|
88
104
|
[](https://pypi.org/project/pertpy)
|
89
105
|
[](https://pertpy.readthedocs.io/)
|
90
|
-
[](https://github.com/scverse/pertpy/actions/workflows/test.yml)
|
91
107
|
[](https://github.com/pre-commit/pre-commit)
|
92
108
|
|
93
109
|
# pertpy
|
94
110
|
|
95
|
-

|
96
112
|
|
97
113
|
## Documentation
|
98
114
|
|
@@ -103,7 +119,19 @@ Please read the [documentation](https://pertpy.readthedocs.io/en/latest).
|
|
103
119
|
You can install _pertpy_ via [pip] from [PyPI]:
|
104
120
|
|
105
121
|
```console
|
106
|
-
|
122
|
+
pip install pertpy
|
123
|
+
```
|
124
|
+
|
125
|
+
if you want to use scCODA or tascCODA, please install pertpy as follows:
|
126
|
+
|
127
|
+
```console
|
128
|
+
pip install pertpy[coda]
|
129
|
+
```
|
130
|
+
|
131
|
+
If you want to use the differential gene expression interface, please install pertpy by running:
|
132
|
+
|
133
|
+
```console
|
134
|
+
pip install pertpy[de]
|
107
135
|
```
|
108
136
|
|
109
137
|
[pip]: https://pip.pypa.io/
|
@@ -0,0 +1,57 @@
|
|
1
|
+
pertpy/__init__.py,sha256=GMFyfRErEysnlkYKMqQxtO7QbqjGki7SpvgtLxIuG6o,658
|
2
|
+
pertpy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
3
|
+
pertpy/data/__init__.py,sha256=ah3yvoxkgbdMUNAWxS3SyqcUuVamBOSeuWkF2QRAEwM,2703
|
4
|
+
pertpy/data/_dataloader.py,sha256=fl16n82nun01gGiP7qhr5sShfcDchp0szzZp7aXkfBI,2495
|
5
|
+
pertpy/data/_datasets.py,sha256=I-keaJSTsRBySCPjiVonKmC9rRIM0AEgo0_0UlEX804,65616
|
6
|
+
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
|
9
|
+
pertpy/metadata/_drug.py,sha256=8QDSyxiFl25JdS80EQJC_krg6fEe5LIQEE6BsV1r8nY,9006
|
10
|
+
pertpy/metadata/_look_up.py,sha256=DoWp6OxIk_HyyyOhW1p8z5E68IZ31_nZDnqxk1rJqps,28778
|
11
|
+
pertpy/metadata/_metadata.py,sha256=pvarnv3X5pblnvG8AQ8Omu5jQcC5ORzCxRk3FRhOLgs,3276
|
12
|
+
pertpy/metadata/_moa.py,sha256=u_OcMonjOeeoW5P9xOltquVSoTH3Vs80ztHsXf-X1DY,4701
|
13
|
+
pertpy/plot/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
14
|
+
pertpy/preprocessing/__init__.py,sha256=VAPFaeq2_qCvdFkQTCj_Hm460HC4Tersu8Rig_tnp_Y,71
|
15
|
+
pertpy/preprocessing/_guide_rna.py,sha256=Xrv0cN16Ub1U1z-3LDNTkm98zs9JOjc2h1N7IAt_FaE,7612
|
16
|
+
pertpy/tools/__init__.py,sha256=yhDyv5J-nd3SDqc3T08Nzca8dzj3SpoVG2m9VU1rFUk,1481
|
17
|
+
pertpy/tools/_augur.py,sha256=UWro1nIEZe_rWtjlQCBv4ucqeh3Vt1m8IRzKlux72Z8,55683
|
18
|
+
pertpy/tools/_cinemaot.py,sha256=BD_oYC1TktbFMX7fpp0A57QAF6frLEgNQ_2wFUpxjyo,39509
|
19
|
+
pertpy/tools/_dialogue.py,sha256=f2fbhKWdm4Co79ZzVgtVq9xYwjYWFLdGNDeGFOO_pfM,51990
|
20
|
+
pertpy/tools/_enrichment.py,sha256=rjPHK9YBCJZfpa5Rvfxo3Ii7W5Mvm5dOdolAD7QazVg,21440
|
21
|
+
pertpy/tools/_kernel_pca.py,sha256=_EJ9WlBLjHOafF34sZGdyBgZL6Fj0WiJ1elVT1XMmo4,1579
|
22
|
+
pertpy/tools/_milo.py,sha256=kGnfx-CMOpYSl85fOW62J2X3utVjOsQFne7ixEptDmI,43691
|
23
|
+
pertpy/tools/_mixscape.py,sha256=FtH3PKvbLTe03LPgN4O9sS70oj_6AHz4Mz5otzEwRl8,52406
|
24
|
+
pertpy/tools/decoupler_LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
25
|
+
pertpy/tools/transferlearning_MMD_LICENSE,sha256=MUvDA-o_j9htRpI8fStVdCRuyLdPkQUuIH0a_EIc57w,1069
|
26
|
+
pertpy/tools/_coda/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
27
|
+
pertpy/tools/_coda/_base_coda.py,sha256=jnoLPFfluxB0_CK8-T-qolPa7xPIEb6NpeEpGwHPiNg,113058
|
28
|
+
pertpy/tools/_coda/_sccoda.py,sha256=gGmyd0MGpchulV9d4PxKSmGORyZ8fCDS9tQVPOuF_Og,22622
|
29
|
+
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/_checks.py,sha256=SxNHJDsCYZ6rWLTMEymEBpigs_B9cnXyw0kkAe1l6e0,1675
|
33
|
+
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
|
37
|
+
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/_distances/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
40
|
+
pertpy/tools/_distances/_distance_tests.py,sha256=mNmNu5cX0Wj5IegR6x5K-CbBSid8EhrH2jZPQxuvK4U,13521
|
41
|
+
pertpy/tools/_distances/_distances.py,sha256=iuHpBtWZbJhMZNSEjQkZUu6KPJXCjs_fX6YjopIWvwY,50343
|
42
|
+
pertpy/tools/_perturbation_space/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
43
|
+
pertpy/tools/_perturbation_space/_clustering.py,sha256=m52-J8c8OnIXRCf3NoFabIO2yMHIuy1X0m0amtsK2vE,3556
|
44
|
+
pertpy/tools/_perturbation_space/_comparison.py,sha256=rLO-EGU0I7t5MnLw4k1gYU-ypRu-JsDPLat1t4h2U2M,4329
|
45
|
+
pertpy/tools/_perturbation_space/_discriminator_classifiers.py,sha256=BNMP-2g4X_9jhs3Vf2rwlIjSCAcADkxBAFYGlsQ5Irw,21609
|
46
|
+
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
|
49
|
+
pertpy/tools/_scgen/__init__.py,sha256=uERFlFyF88TH0uLiwmsUGEfHfLVCiZMFuk8gO5f7164,45
|
50
|
+
pertpy/tools/_scgen/_base_components.py,sha256=Qq8myRUm43q9XBrZ9gBggfa2cSV2wbz_KYoLgH7iF1A,3009
|
51
|
+
pertpy/tools/_scgen/_scgen.py,sha256=HPvFVjY9SS9bGqgTkCDuPYjmA4QHW7rKgHnI2yuI_Q4,30608
|
52
|
+
pertpy/tools/_scgen/_scgenvae.py,sha256=v_6tZ4wY-JjdMH1QVd_wG4_N0PoaqB-FM8zC2JsDu1o,3935
|
53
|
+
pertpy/tools/_scgen/_utils.py,sha256=1upgOt1FpadfvNG05YpMjYYG-IAlxrC3l_ZxczmIczo,2841
|
54
|
+
pertpy-0.8.0.dist-info/METADATA,sha256=cLAhPubizJ7vgCThHv-kHsAAvepUyRTnTHTKRKX9kYQ,6054
|
55
|
+
pertpy-0.8.0.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
|
56
|
+
pertpy-0.8.0.dist-info/licenses/LICENSE,sha256=OZ-ZkXM5CmExJiEMM90b_7dGNNvRpj7kdE-49AnrLuI,1070
|
57
|
+
pertpy-0.8.0.dist-info/RECORD,,
|
pertpy/plot/_augur.py
DELETED
@@ -1,234 +0,0 @@
|
|
1
|
-
from __future__ import annotations
|
2
|
-
|
3
|
-
from typing import TYPE_CHECKING, Any
|
4
|
-
|
5
|
-
from anndata import AnnData
|
6
|
-
from matplotlib import pyplot as plt
|
7
|
-
|
8
|
-
if TYPE_CHECKING:
|
9
|
-
import pandas as pd
|
10
|
-
from matplotlib.axes import Axes
|
11
|
-
from matplotlib.figure import Figure
|
12
|
-
|
13
|
-
|
14
|
-
class AugurpyPlot:
|
15
|
-
"""Plotting functions for Augurpy."""
|
16
|
-
|
17
|
-
@staticmethod
|
18
|
-
def dp_scatter(results: pd.DataFrame, top_n=None, ax: Axes = None, return_figure: bool = False) -> Figure | Axes:
|
19
|
-
"""Plot result of differential prioritization.
|
20
|
-
|
21
|
-
Args:
|
22
|
-
results: Results after running differential prioritization.
|
23
|
-
top_n: optionally, the number of top prioritized cell types to label in the plot
|
24
|
-
ax: optionally, axes used to draw plot
|
25
|
-
return_figure: if `True` returns figure of the plot
|
26
|
-
|
27
|
-
Returns:
|
28
|
-
Axes of the plot.
|
29
|
-
|
30
|
-
Examples:
|
31
|
-
>>> import pertpy as pt
|
32
|
-
>>> adata = pt.dt.bhattacherjee()
|
33
|
-
>>> ag_rfc = pt.tl.Augur("random_forest_classifier")
|
34
|
-
|
35
|
-
>>> data_15 = ag_rfc.load(adata, condition_label="Maintenance_Cocaine", treatment_label="withdraw_15d_Cocaine")
|
36
|
-
>>> adata_15, results_15 = ag_rfc.predict(data_15, random_state=None, n_threads=4)
|
37
|
-
>>> adata_15_permute, results_15_permute = ag_rfc.predict(data_15, augur_mode="permute", n_subsamples=100, random_state=None, n_threads=4)
|
38
|
-
|
39
|
-
>>> data_48 = ag_rfc.load(adata, condition_label="Maintenance_Cocaine", treatment_label="withdraw_48h_Cocaine")
|
40
|
-
>>> adata_48, results_48 = ag_rfc.predict(data_48, random_state=None, n_threads=4)
|
41
|
-
>>> adata_48_permute, results_48_permute = ag_rfc.predict(data_48, augur_mode="permute", n_subsamples=100, random_state=None, n_threads=4)
|
42
|
-
|
43
|
-
>>> pvals = ag_rfc.predict_differential_prioritization(augur_results1=results_15, augur_results2=results_48, \
|
44
|
-
permuted_results1=results_15_permute, permuted_results2=results_48_permute)
|
45
|
-
>>> pt.pl.ag.dp_scatter(pvals)
|
46
|
-
"""
|
47
|
-
x = results["mean_augur_score1"]
|
48
|
-
y = results["mean_augur_score2"]
|
49
|
-
|
50
|
-
if ax is None:
|
51
|
-
fig, ax = plt.subplots()
|
52
|
-
scatter = ax.scatter(x, y, c=results.z, cmap="Greens")
|
53
|
-
|
54
|
-
# adding optional labels
|
55
|
-
top_n_index = results.sort_values(by="pval").index[:top_n]
|
56
|
-
for idx in top_n_index:
|
57
|
-
ax.annotate(
|
58
|
-
results.loc[idx, "cell_type"],
|
59
|
-
(results.loc[idx, "mean_augur_score1"], results.loc[idx, "mean_augur_score2"]),
|
60
|
-
)
|
61
|
-
|
62
|
-
# add diagonal
|
63
|
-
limits = max(ax.get_xlim(), ax.get_ylim())
|
64
|
-
(diag_line,) = ax.plot(limits, limits, ls="--", c=".3")
|
65
|
-
|
66
|
-
# formatting and details
|
67
|
-
plt.xlabel("Augur scores 1")
|
68
|
-
plt.ylabel("Augur scores 2")
|
69
|
-
legend1 = ax.legend(*scatter.legend_elements(), loc="center left", title="z-scores", bbox_to_anchor=(1, 0.5))
|
70
|
-
ax.add_artist(legend1)
|
71
|
-
|
72
|
-
return fig if return_figure else ax
|
73
|
-
|
74
|
-
@staticmethod
|
75
|
-
def important_features(
|
76
|
-
data: dict[str, Any], key: str = "augurpy_results", top_n=10, ax: Axes = None, return_figure: bool = False
|
77
|
-
) -> Figure | Axes:
|
78
|
-
"""Plot a lollipop plot of the n features with largest feature importances.
|
79
|
-
|
80
|
-
Args:
|
81
|
-
results: results after running `predict()` as dictionary or the AnnData object.
|
82
|
-
key: Key in the AnnData object of the results
|
83
|
-
top_n: n number feature importance values to plot. Default is 10.
|
84
|
-
ax: optionally, axes used to draw plot
|
85
|
-
return_figure: if `True` returns figure of the plot, default is `False`
|
86
|
-
|
87
|
-
Returns:
|
88
|
-
Axes of the plot.
|
89
|
-
|
90
|
-
Examples:
|
91
|
-
>>> import pertpy as pt
|
92
|
-
>>> adata = pt.dt.sc_sim_augur()
|
93
|
-
>>> ag_rfc = pt.tl.Augur("random_forest_classifier")
|
94
|
-
>>> loaded_data = ag_rfc.load(adata)
|
95
|
-
>>> v_adata, v_results = ag_rfc.predict(loaded_data, subsample_size=20, select_variance_features=True, n_threads=4)
|
96
|
-
>>> pt.pl.ag.important_features(v_results)
|
97
|
-
"""
|
98
|
-
if isinstance(data, AnnData):
|
99
|
-
results = data.uns[key]
|
100
|
-
else:
|
101
|
-
results = data
|
102
|
-
# top_n features to plot
|
103
|
-
n_features = (
|
104
|
-
results["feature_importances"]
|
105
|
-
.groupby("genes", as_index=False)
|
106
|
-
.feature_importances.mean()
|
107
|
-
.sort_values(by="feature_importances")[-top_n:]
|
108
|
-
)
|
109
|
-
|
110
|
-
if ax is None:
|
111
|
-
fig, ax = plt.subplots()
|
112
|
-
y_axes_range = range(1, top_n + 1)
|
113
|
-
ax.hlines(
|
114
|
-
y_axes_range,
|
115
|
-
xmin=0,
|
116
|
-
xmax=n_features["feature_importances"],
|
117
|
-
)
|
118
|
-
|
119
|
-
# drawing the markers (circle)
|
120
|
-
ax.plot(n_features["feature_importances"], y_axes_range, "o")
|
121
|
-
|
122
|
-
# formatting and details
|
123
|
-
plt.xlabel("Mean Feature Importance")
|
124
|
-
plt.ylabel("Gene")
|
125
|
-
plt.yticks(y_axes_range, n_features["genes"])
|
126
|
-
|
127
|
-
return fig if return_figure else ax
|
128
|
-
|
129
|
-
@staticmethod
|
130
|
-
def lollipop(
|
131
|
-
data: dict[str, Any], key: str = "augurpy_results", ax: Axes = None, return_figure: bool = False
|
132
|
-
) -> Figure | Axes:
|
133
|
-
"""Plot a lollipop plot of the mean augur values.
|
134
|
-
|
135
|
-
Args:
|
136
|
-
results: results after running `predict()` as dictionary or the AnnData object.
|
137
|
-
key: Key in the AnnData object of the results
|
138
|
-
ax: optionally, axes used to draw plot
|
139
|
-
return_figure: if `True` returns figure of the plot
|
140
|
-
|
141
|
-
Returns:
|
142
|
-
Axes of the plot.
|
143
|
-
|
144
|
-
Examples:
|
145
|
-
>>> import pertpy as pt
|
146
|
-
>>> adata = pt.dt.sc_sim_augur()
|
147
|
-
>>> ag_rfc = pt.tl.Augur("random_forest_classifier")
|
148
|
-
>>> loaded_data = ag_rfc.load(adata)
|
149
|
-
>>> v_adata, v_results = ag_rfc.predict(loaded_data, subsample_size=20, select_variance_features=True, n_threads=4)
|
150
|
-
>>> pt.pl.ag.lollipop(v_results)
|
151
|
-
"""
|
152
|
-
if isinstance(data, AnnData):
|
153
|
-
results = data.uns[key]
|
154
|
-
else:
|
155
|
-
results = data
|
156
|
-
if ax is None:
|
157
|
-
fig, ax = plt.subplots()
|
158
|
-
y_axes_range = range(1, len(results["summary_metrics"].columns) + 1)
|
159
|
-
ax.hlines(
|
160
|
-
y_axes_range,
|
161
|
-
xmin=0,
|
162
|
-
xmax=results["summary_metrics"].sort_values("mean_augur_score", axis=1).loc["mean_augur_score"],
|
163
|
-
)
|
164
|
-
|
165
|
-
# drawing the markers (circle)
|
166
|
-
ax.plot(
|
167
|
-
results["summary_metrics"].sort_values("mean_augur_score", axis=1).loc["mean_augur_score"],
|
168
|
-
y_axes_range,
|
169
|
-
"o",
|
170
|
-
)
|
171
|
-
|
172
|
-
# formatting and details
|
173
|
-
plt.xlabel("Mean Augur Score")
|
174
|
-
plt.ylabel("Cell Type")
|
175
|
-
plt.yticks(y_axes_range, results["summary_metrics"].sort_values("mean_augur_score", axis=1).columns)
|
176
|
-
|
177
|
-
return fig if return_figure else ax
|
178
|
-
|
179
|
-
@staticmethod
|
180
|
-
def scatterplot(
|
181
|
-
results1: dict[str, Any], results2: dict[str, Any], top_n=None, return_figure: bool = False
|
182
|
-
) -> Figure | Axes:
|
183
|
-
"""Create scatterplot with two augur results.
|
184
|
-
|
185
|
-
Args:
|
186
|
-
results1: results after running `predict()`
|
187
|
-
results2: results after running `predict()`
|
188
|
-
top_n: optionally, the number of top prioritized cell types to label in the plot
|
189
|
-
return_figure: if `True` returns figure of the plot
|
190
|
-
|
191
|
-
Returns:
|
192
|
-
Axes of the plot.
|
193
|
-
|
194
|
-
Examples:
|
195
|
-
>>> import pertpy as pt
|
196
|
-
>>> adata = pt.dt.sc_sim_augur()
|
197
|
-
>>> ag_rfc = pt.tl.Augur("random_forest_classifier")
|
198
|
-
>>> loaded_data = ag_rfc.load(adata)
|
199
|
-
>>> h_adata, h_results = ag_rfc.predict(loaded_data, subsample_size=20, n_threads=4)
|
200
|
-
>>> v_adata, v_results = ag_rfc.predict(loaded_data, subsample_size=20, select_variance_features=True, n_threads=4)
|
201
|
-
>>> pt.pl.ag.scatterplot(v_results, h_results)
|
202
|
-
"""
|
203
|
-
cell_types = results1["summary_metrics"].columns
|
204
|
-
|
205
|
-
fig, ax = plt.subplots()
|
206
|
-
ax.scatter(
|
207
|
-
results1["summary_metrics"].loc["mean_augur_score", cell_types],
|
208
|
-
results2["summary_metrics"].loc["mean_augur_score", cell_types],
|
209
|
-
)
|
210
|
-
|
211
|
-
# adding optional labels
|
212
|
-
top_n_cell_types = (
|
213
|
-
(results1["summary_metrics"].loc["mean_augur_score"] - results2["summary_metrics"].loc["mean_augur_score"])
|
214
|
-
.sort_values(ascending=False)
|
215
|
-
.index[:top_n]
|
216
|
-
)
|
217
|
-
for txt in top_n_cell_types:
|
218
|
-
ax.annotate(
|
219
|
-
txt,
|
220
|
-
(
|
221
|
-
results1["summary_metrics"].loc["mean_augur_score", txt],
|
222
|
-
results2["summary_metrics"].loc["mean_augur_score", txt],
|
223
|
-
),
|
224
|
-
)
|
225
|
-
|
226
|
-
# adding diagonal
|
227
|
-
limits = max(ax.get_xlim(), ax.get_ylim())
|
228
|
-
(diag_line,) = ax.plot(limits, limits, ls="--", c=".3")
|
229
|
-
|
230
|
-
# formatting and details
|
231
|
-
plt.xlabel("Augur scores 1")
|
232
|
-
plt.ylabel("Augur scores 2")
|
233
|
-
|
234
|
-
return fig if return_figure else ax
|
pertpy/plot/_cinemaot.py
DELETED
@@ -1,81 +0,0 @@
|
|
1
|
-
from typing import Optional
|
2
|
-
|
3
|
-
import matplotlib.pyplot as plt
|
4
|
-
import pandas as pd
|
5
|
-
import scanpy as sc
|
6
|
-
import seaborn as sns
|
7
|
-
from anndata import AnnData
|
8
|
-
from matplotlib.axes import Axes
|
9
|
-
from scanpy.plotting import _utils
|
10
|
-
|
11
|
-
|
12
|
-
class CinemaotPlot:
|
13
|
-
"""Plotting functions for CINEMA-OT. Only includes new functions beyond the scanpy.pl.embedding family."""
|
14
|
-
|
15
|
-
@staticmethod
|
16
|
-
def vis_matching(
|
17
|
-
adata: AnnData,
|
18
|
-
de: AnnData,
|
19
|
-
pert_key: str,
|
20
|
-
control: str,
|
21
|
-
de_label: str,
|
22
|
-
source_label: str,
|
23
|
-
matching_rep: str = "ot",
|
24
|
-
resolution: float = 0.5,
|
25
|
-
normalize: str = "col",
|
26
|
-
title: str = "CINEMA-OT matching matrix",
|
27
|
-
min_val: float = 0.01,
|
28
|
-
show: bool = True,
|
29
|
-
save: Optional[str] = None,
|
30
|
-
ax: Optional[Axes] = None,
|
31
|
-
**kwargs,
|
32
|
-
) -> None:
|
33
|
-
"""Visualize the CINEMA-OT matching matrix.
|
34
|
-
|
35
|
-
Args:
|
36
|
-
adata: the original anndata after running cinemaot.causaleffect or cinemaot.causaleffect_weighted.
|
37
|
-
de: The anndata output from Cinemaot.causaleffect() or Cinemaot.causaleffect_weighted().
|
38
|
-
pert_key: The column of `.obs` with perturbation categories, should also contain `control`.
|
39
|
-
control: Control category from the `pert_key` column.
|
40
|
-
de_label: the label for differential response. If none, use leiden cluster labels at resolution 1.0.
|
41
|
-
source_label: the confounder / cell type label.
|
42
|
-
matching_rep: the place that stores the matching matrix. default de.obsm['ot'].
|
43
|
-
normalize: normalize the coarse-grained matching matrix by row / column.
|
44
|
-
title: the title for the figure.
|
45
|
-
min_val: The min value to truncate the matching matrix.
|
46
|
-
show: Show the plot, do not return axis.
|
47
|
-
save: If `True` or a `str`, save the figure. A string is appended to the default filename.
|
48
|
-
Infer the filetype if ending on {`'.pdf'`, `'.png'`, `'.svg'`}.
|
49
|
-
**kwargs: Other parameters to input for seaborn.heatmap.
|
50
|
-
"""
|
51
|
-
adata_ = adata[adata.obs[pert_key] == control]
|
52
|
-
|
53
|
-
df = pd.DataFrame(de.obsm[matching_rep])
|
54
|
-
if de_label is None:
|
55
|
-
de_label = "leiden"
|
56
|
-
sc.pp.neighbors(de, use_rep="X_embedding")
|
57
|
-
sc.tl.leiden(de, resolution=resolution)
|
58
|
-
df["de_label"] = de.obs[de_label].astype(str).values
|
59
|
-
df["de_label"] = "Response " + df["de_label"]
|
60
|
-
df = df.groupby("de_label").sum().T
|
61
|
-
df["source_label"] = adata_.obs[source_label].astype(str).values
|
62
|
-
df = df.groupby("source_label").sum()
|
63
|
-
|
64
|
-
if normalize == "col":
|
65
|
-
df = df / df.sum(axis=0)
|
66
|
-
else:
|
67
|
-
df = (df.T / df.sum(axis=1)).T
|
68
|
-
df = df.clip(lower=min_val) - min_val
|
69
|
-
if normalize == "col":
|
70
|
-
df = df / df.sum(axis=0)
|
71
|
-
else:
|
72
|
-
df = (df.T / df.sum(axis=1)).T
|
73
|
-
|
74
|
-
g = sns.heatmap(df, annot=True, ax=ax, **kwargs)
|
75
|
-
plt.title(title)
|
76
|
-
_utils.savefig_or_show("matching_heatmap", show=show, save=save)
|
77
|
-
if not show:
|
78
|
-
if ax is not None:
|
79
|
-
return ax
|
80
|
-
else:
|
81
|
-
return g
|