pertpy 1.0.1__py3-none-any.whl → 1.0.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/metadata/_cell_line.py +9 -3
- pertpy/tools/_coda/_sccoda.py +68 -82
- pertpy/tools/_coda/_tasccoda.py +91 -61
- {pertpy-1.0.1.dist-info → pertpy-1.0.2.dist-info}/METADATA +51 -72
- {pertpy-1.0.1.dist-info → pertpy-1.0.2.dist-info}/RECORD +8 -8
- {pertpy-1.0.1.dist-info → pertpy-1.0.2.dist-info}/WHEEL +1 -1
- {pertpy-1.0.1.dist-info → pertpy-1.0.2.dist-info}/licenses/LICENSE +0 -0
pertpy/__init__.py
CHANGED
pertpy/metadata/_cell_line.py
CHANGED
@@ -195,7 +195,9 @@ class CellLine(MetaData):
|
|
195
195
|
block_size=4096,
|
196
196
|
is_zip=False,
|
197
197
|
)
|
198
|
-
df = pd.read_csv(
|
198
|
+
df = pd.read_csv(
|
199
|
+
drug_response_prism_file_path, index_col=0, usecols=["broad_id", "depmap_id", "name", "ic50", "ec50", "auc"]
|
200
|
+
)
|
199
201
|
df = df.dropna(subset=["depmap_id", "name"])
|
200
202
|
df = df.groupby(["depmap_id", "name"]).mean().reset_index()
|
201
203
|
self.drug_response_prism = df
|
@@ -568,7 +570,9 @@ class CellLine(MetaData):
|
|
568
570
|
verbosity=verbosity,
|
569
571
|
)
|
570
572
|
|
571
|
-
|
573
|
+
if adata.obs.index.name is None:
|
574
|
+
adata.obs.index.name = "original_index"
|
575
|
+
old_index_name = adata.obs.index.name
|
572
576
|
adata.obs = (
|
573
577
|
adata.obs.reset_index()
|
574
578
|
.set_index([query_id, query_perturbation])
|
@@ -635,7 +639,9 @@ class CellLine(MetaData):
|
|
635
639
|
verbosity=verbosity,
|
636
640
|
)
|
637
641
|
|
638
|
-
|
642
|
+
if adata.obs.index.name is None:
|
643
|
+
adata.obs.index.name = "original_index"
|
644
|
+
old_index_name = adata.obs.index.name
|
639
645
|
adata.obs = (
|
640
646
|
adata.obs.reset_index()
|
641
647
|
.set_index([query_id, "perturbation_lower"])
|
pertpy/tools/_coda/_sccoda.py
CHANGED
@@ -303,7 +303,7 @@ class Sccoda(CompositionalModel2):
|
|
303
303
|
self,
|
304
304
|
data: AnnData | MuData,
|
305
305
|
modality_key: str = "coda",
|
306
|
-
rng_key=None,
|
306
|
+
rng_key: int | None = None,
|
307
307
|
num_prior_samples: int = 500,
|
308
308
|
use_posterior_predictive: bool = True,
|
309
309
|
) -> az.InferenceData:
|
@@ -381,34 +381,9 @@ class Sccoda(CompositionalModel2):
|
|
381
381
|
if rng_key is None:
|
382
382
|
rng = np.random.default_rng()
|
383
383
|
rng_key = random.key(rng.integers(0, 10000))
|
384
|
-
|
385
|
-
if use_posterior_predictive:
|
386
|
-
posterior_predictive = Predictive(self.model, self.mcmc.get_samples())(
|
387
|
-
rng_key,
|
388
|
-
counts=None,
|
389
|
-
covariates=numpyro_covariates,
|
390
|
-
n_total=numpyro_n_total,
|
391
|
-
ref_index=ref_index,
|
392
|
-
sample_adata=sample_adata,
|
393
|
-
)
|
394
|
-
else:
|
395
|
-
posterior_predictive = None
|
396
|
-
|
397
|
-
if num_prior_samples > 0:
|
398
|
-
prior = Predictive(self.model, num_samples=num_prior_samples)(
|
399
|
-
rng_key,
|
400
|
-
counts=None,
|
401
|
-
covariates=numpyro_covariates,
|
402
|
-
n_total=numpyro_n_total,
|
403
|
-
ref_index=ref_index,
|
404
|
-
sample_adata=sample_adata,
|
405
|
-
)
|
406
384
|
else:
|
407
|
-
|
408
|
-
|
409
|
-
import arviz as az
|
385
|
+
rng_key = random.key(rng_key)
|
410
386
|
|
411
|
-
# Create arviz object
|
412
387
|
if use_posterior_predictive:
|
413
388
|
posterior_predictive = Predictive(self.model, self.mcmc.get_samples())(
|
414
389
|
rng_key,
|
@@ -451,6 +426,9 @@ class Sccoda(CompositionalModel2):
|
|
451
426
|
else:
|
452
427
|
prior = None
|
453
428
|
|
429
|
+
import arviz as az
|
430
|
+
|
431
|
+
# Create arviz object
|
454
432
|
arviz_data = az.from_numpyro(
|
455
433
|
self.mcmc, prior=prior, posterior_predictive=posterior_predictive, dims=dims, coords=coords
|
456
434
|
)
|
@@ -468,76 +446,84 @@ class Sccoda(CompositionalModel2):
|
|
468
446
|
*args,
|
469
447
|
**kwargs,
|
470
448
|
):
|
471
|
-
"""
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
449
|
+
"""
|
450
|
+
|
451
|
+
Examples:
|
452
|
+
>>> import pertpy as pt
|
453
|
+
>>> haber_cells = pt.dt.haber_2017_regions()
|
454
|
+
>>> sccoda = pt.tl.Sccoda()
|
455
|
+
>>> mdata = sccoda.load(haber_cells,
|
456
|
+
>>> type="cell_level",
|
457
|
+
>>> generate_sample_level=True,
|
458
|
+
>>> cell_type_identifier="cell_label",
|
459
|
+
>>> sample_identifier="batch",
|
460
|
+
>>> covariate_obs=["condition"])
|
461
|
+
>>> mdata = sccoda.prepare(mdata, formula="condition", reference_cell_type="Endocrine")
|
462
|
+
>>> sccoda.run_nuts(mdata, num_warmup=100, num_samples=1000, rng_key=42).
|
463
|
+
""" # noqa: D205, D212
|
484
464
|
return super().run_nuts(data, modality_key, num_samples, num_warmup, rng_key, copy, *args, **kwargs)
|
485
465
|
|
486
466
|
run_nuts.__doc__ = CompositionalModel2.run_nuts.__doc__ + run_nuts.__doc__
|
487
467
|
|
488
468
|
def credible_effects(self, data: AnnData | MuData, modality_key: str = "coda", est_fdr: float = None) -> pd.Series:
|
489
|
-
"""
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
469
|
+
"""
|
470
|
+
|
471
|
+
Examples:
|
472
|
+
>>> import pertpy as pt
|
473
|
+
>>> haber_cells = pt.dt.haber_2017_regions()
|
474
|
+
>>> sccoda = pt.tl.Sccoda()
|
475
|
+
>>> mdata = sccoda.load(haber_cells,
|
476
|
+
>>> type="cell_level",
|
477
|
+
>>> generate_sample_level=True,
|
478
|
+
>>> cell_type_identifier="cell_label",
|
479
|
+
>>> sample_identifier="batch",
|
480
|
+
>>> covariate_obs=["condition"])
|
481
|
+
>>> mdata = sccoda.prepare(mdata, formula="condition", reference_cell_type="Endocrine")
|
482
|
+
>>> sccoda.run_nuts(mdata, num_warmup=100, num_samples=1000, rng_key=42)
|
483
|
+
>>> credible_effects = sccoda.credible_effects(mdata).
|
484
|
+
""" # noqa: D205, D212
|
503
485
|
return super().credible_effects(data, modality_key, est_fdr)
|
504
486
|
|
505
487
|
credible_effects.__doc__ = CompositionalModel2.credible_effects.__doc__ + credible_effects.__doc__
|
506
488
|
|
507
489
|
def summary(self, data: AnnData | MuData, extended: bool = False, modality_key: str = "coda", *args, **kwargs):
|
508
|
-
"""
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
490
|
+
"""
|
491
|
+
|
492
|
+
Examples:
|
493
|
+
>>> import pertpy as pt
|
494
|
+
>>> haber_cells = pt.dt.haber_2017_regions()
|
495
|
+
>>> sccoda = pt.tl.Sccoda()
|
496
|
+
>>> mdata = sccoda.load(haber_cells,
|
497
|
+
>>> type="cell_level",
|
498
|
+
>>> generate_sample_level=True,
|
499
|
+
>>> cell_type_identifier="cell_label",
|
500
|
+
>>> sample_identifier="batch",
|
501
|
+
>>> covariate_obs=["condition"])
|
502
|
+
>>> mdata = sccoda.prepare(mdata, formula="condition", reference_cell_type="Endocrine")
|
503
|
+
>>> sccoda.run_nuts(mdata, num_warmup=100, num_samples=1000, rng_key=42)
|
504
|
+
>>> sccoda.summary(mdata).
|
505
|
+
""" # noqa: D205, D212
|
522
506
|
return super().summary(data, extended, modality_key, *args, **kwargs)
|
523
507
|
|
524
508
|
summary.__doc__ = CompositionalModel2.summary.__doc__ + summary.__doc__
|
525
509
|
|
526
510
|
def set_fdr(self, data: AnnData | MuData, est_fdr: float, modality_key: str = "coda", *args, **kwargs):
|
527
|
-
"""
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
|
538
|
-
|
539
|
-
|
540
|
-
|
511
|
+
"""
|
512
|
+
|
513
|
+
Examples:
|
514
|
+
>>> import pertpy as pt
|
515
|
+
>>> haber_cells = pt.dt.haber_2017_regions()
|
516
|
+
>>> sccoda = pt.tl.Sccoda()
|
517
|
+
>>> mdata = sccoda.load(haber_cells,
|
518
|
+
>>> type="cell_level",
|
519
|
+
>>> generate_sample_level=True,
|
520
|
+
>>> cell_type_identifier="cell_label",
|
521
|
+
>>> sample_identifier="batch",
|
522
|
+
>>> covariate_obs=["condition"])
|
523
|
+
>>> mdata = sccoda.prepare(mdata, formula="condition", reference_cell_type="Endocrine")
|
524
|
+
>>> sccoda.run_nuts(mdata, num_warmup=100, num_samples=1000, rng_key=42)
|
525
|
+
>>> sccoda.set_fdr(mdata, est_fdr=0.4).
|
526
|
+
""" # noqa: D205, D212
|
541
527
|
return super().set_fdr(data, est_fdr, modality_key, *args, **kwargs)
|
542
528
|
|
543
529
|
set_fdr.__doc__ = CompositionalModel2.set_fdr.__doc__ + set_fdr.__doc__
|
pertpy/tools/_coda/_tasccoda.py
CHANGED
@@ -120,8 +120,10 @@ class Tasccoda(CompositionalModel2):
|
|
120
120
|
covariate_df=covariate_df,
|
121
121
|
)
|
122
122
|
mdata = MuData({modality_key_1: adata, modality_key_2: adata_coda})
|
123
|
-
|
123
|
+
elif type == "sample_level":
|
124
124
|
mdata = MuData({modality_key_1: AnnData(), modality_key_2: adata})
|
125
|
+
else:
|
126
|
+
raise ValueError(f'{type} is not a supported type, expected "cell_level" or "sample_level".')
|
125
127
|
import_tree(
|
126
128
|
data=mdata,
|
127
129
|
modality_1=modality_key_1,
|
@@ -464,7 +466,7 @@ class Tasccoda(CompositionalModel2):
|
|
464
466
|
self,
|
465
467
|
data: AnnData | MuData,
|
466
468
|
modality_key: str = "coda",
|
467
|
-
rng_key=None,
|
469
|
+
rng_key: int | None = None,
|
468
470
|
num_prior_samples: int = 500,
|
469
471
|
use_posterior_predictive: bool = True,
|
470
472
|
) -> az.InferenceData:
|
@@ -547,6 +549,8 @@ class Tasccoda(CompositionalModel2):
|
|
547
549
|
if rng_key is None:
|
548
550
|
rng = np.random.default_rng()
|
549
551
|
rng_key = random.key(rng.integers(0, 10000))
|
552
|
+
else:
|
553
|
+
rng_key = random.key(rng_key)
|
550
554
|
|
551
555
|
if use_posterior_predictive:
|
552
556
|
posterior_predictive = Predictive(self.model, self.mcmc.get_samples())(
|
@@ -557,6 +561,15 @@ class Tasccoda(CompositionalModel2):
|
|
557
561
|
ref_index=ref_index,
|
558
562
|
sample_adata=sample_adata,
|
559
563
|
)
|
564
|
+
# Remove problematic posterior predictive arrays with wrong dimensions
|
565
|
+
if posterior_predictive and "counts" in posterior_predictive:
|
566
|
+
counts_shape = posterior_predictive["counts"].shape
|
567
|
+
expected_dims = 2 # ['sample', 'cell_type']
|
568
|
+
if len(counts_shape) != expected_dims:
|
569
|
+
posterior_predictive = {k: v for k, v in posterior_predictive.items() if k != "counts"}
|
570
|
+
logger.warning(
|
571
|
+
f"Removed 'counts' from posterior_predictive due to dimension mismatch: got {len(counts_shape)}D, expected {expected_dims}D"
|
572
|
+
)
|
560
573
|
else:
|
561
574
|
posterior_predictive = None
|
562
575
|
|
@@ -569,6 +582,15 @@ class Tasccoda(CompositionalModel2):
|
|
569
582
|
ref_index=ref_index,
|
570
583
|
sample_adata=sample_adata,
|
571
584
|
)
|
585
|
+
# Remove problematic prior arrays with wrong dimensions
|
586
|
+
if prior and "counts" in prior:
|
587
|
+
counts_shape = prior["counts"].shape
|
588
|
+
expected_dims = 2 # ['sample', 'cell_type']
|
589
|
+
if len(counts_shape) != expected_dims:
|
590
|
+
prior = {k: v for k, v in prior.items() if k != "counts"}
|
591
|
+
logger.warning(
|
592
|
+
f"Removed 'counts' from prior due to dimension mismatch: got {len(counts_shape)}D, expected {expected_dims}D"
|
593
|
+
)
|
572
594
|
else:
|
573
595
|
prior = None
|
574
596
|
|
@@ -592,80 +614,88 @@ class Tasccoda(CompositionalModel2):
|
|
592
614
|
*args,
|
593
615
|
**kwargs,
|
594
616
|
):
|
595
|
-
"""
|
596
|
-
|
597
|
-
|
598
|
-
|
599
|
-
|
600
|
-
|
601
|
-
|
602
|
-
|
603
|
-
|
604
|
-
|
605
|
-
|
606
|
-
|
607
|
-
|
608
|
-
|
617
|
+
"""
|
618
|
+
|
619
|
+
Examples:
|
620
|
+
>>> import pertpy as pt
|
621
|
+
>>> adata = pt.dt.tasccoda_example()
|
622
|
+
>>> tasccoda = pt.tl.Tasccoda()
|
623
|
+
>>> mdata = tasccoda.load(
|
624
|
+
>>> adata, type="sample_level",
|
625
|
+
>>> levels_agg=["Major_l1", "Major_l2", "Major_l3", "Major_l4", "Cluster"],
|
626
|
+
>>> key_added="lineage", add_level_name=True
|
627
|
+
>>> )
|
628
|
+
>>> mdata = tasccoda.prepare(
|
629
|
+
>>> mdata, formula="Health", reference_cell_type="automatic", tree_key="lineage", pen_args={"phi": 0}
|
630
|
+
>>> )
|
631
|
+
>>> tasccoda.run_nuts(mdata, num_samples=1000, num_warmup=100, rng_key=42).
|
632
|
+
""" # noqa: D205, D212
|
609
633
|
return super().run_nuts(data, modality_key, num_samples, num_warmup, rng_key, copy, *args, **kwargs)
|
610
634
|
|
611
635
|
run_nuts.__doc__ = CompositionalModel2.run_nuts.__doc__ + run_nuts.__doc__
|
612
636
|
|
613
637
|
def summary(self, data: AnnData | MuData, extended: bool = False, modality_key: str = "coda", *args, **kwargs):
|
614
|
-
"""
|
615
|
-
|
616
|
-
|
617
|
-
|
618
|
-
|
619
|
-
|
620
|
-
|
621
|
-
|
622
|
-
|
623
|
-
|
624
|
-
|
625
|
-
|
626
|
-
|
627
|
-
|
628
|
-
|
638
|
+
"""
|
639
|
+
|
640
|
+
Examples:
|
641
|
+
>>> import pertpy as pt
|
642
|
+
>>> adata = pt.dt.tasccoda_example()
|
643
|
+
>>> tasccoda = pt.tl.Tasccoda()
|
644
|
+
>>> mdata = tasccoda.load(
|
645
|
+
>>> adata, type="sample_level",
|
646
|
+
>>> levels_agg=["Major_l1", "Major_l2", "Major_l3", "Major_l4", "Cluster"],
|
647
|
+
>>> key_added="lineage", add_level_name=True
|
648
|
+
>>> )
|
649
|
+
>>> mdata = tasccoda.prepare(
|
650
|
+
>>> mdata, formula="Health", reference_cell_type="automatic", tree_key="lineage", pen_args={"phi": 0}
|
651
|
+
>>> )
|
652
|
+
>>> tasccoda.run_nuts(mdata, num_samples=1000, num_warmup=100, rng_key=42)
|
653
|
+
>>> tasccoda.summary(mdata).
|
654
|
+
""" # noqa: D205, D212
|
629
655
|
return super().summary(data, extended, modality_key, *args, **kwargs)
|
630
656
|
|
631
657
|
summary.__doc__ = CompositionalModel2.summary.__doc__ + summary.__doc__
|
632
658
|
|
633
659
|
def credible_effects(self, data: AnnData | MuData, modality_key: str = "coda", est_fdr: float = None) -> pd.Series:
|
634
|
-
"""
|
635
|
-
|
636
|
-
|
637
|
-
|
638
|
-
|
639
|
-
|
640
|
-
|
641
|
-
|
642
|
-
|
643
|
-
|
644
|
-
|
645
|
-
|
646
|
-
|
647
|
-
|
648
|
-
|
660
|
+
"""
|
661
|
+
|
662
|
+
Examples:
|
663
|
+
>>> import pertpy as pt
|
664
|
+
>>> adata = pt.dt.tasccoda_example()
|
665
|
+
>>> tasccoda = pt.tl.Tasccoda()
|
666
|
+
>>> mdata = tasccoda.load(
|
667
|
+
>>> adata, type="sample_level",
|
668
|
+
>>> levels_agg=["Major_l1", "Major_l2", "Major_l3", "Major_l4", "Cluster"],
|
669
|
+
>>> key_added="lineage", add_level_name=True
|
670
|
+
>>> )
|
671
|
+
>>> mdata = tasccoda.prepare(
|
672
|
+
>>> mdata, formula="Health", reference_cell_type="automatic", tree_key="lineage", pen_args={"phi": 0}
|
673
|
+
>>> )
|
674
|
+
>>> tasccoda.run_nuts(mdata, num_samples=1000, num_warmup=100, rng_key=42)
|
675
|
+
>>> tasccoda.credible_effects(mdata).
|
676
|
+
""" # noqa: D205, D212
|
649
677
|
return super().credible_effects(data, modality_key, est_fdr)
|
650
678
|
|
651
679
|
credible_effects.__doc__ = CompositionalModel2.credible_effects.__doc__ + credible_effects.__doc__
|
652
680
|
|
653
681
|
def set_fdr(self, data: AnnData | MuData, est_fdr: float, modality_key: str = "coda", *args, **kwargs):
|
654
|
-
"""
|
655
|
-
|
656
|
-
|
657
|
-
|
658
|
-
|
659
|
-
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
|
666
|
-
|
667
|
-
|
668
|
-
|
682
|
+
"""
|
683
|
+
|
684
|
+
Examples:
|
685
|
+
>>> import pertpy as pt
|
686
|
+
>>> adata = pt.dt.tasccoda_example()
|
687
|
+
>>> tasccoda = pt.tl.Tasccoda()
|
688
|
+
>>> mdata = tasccoda.load(
|
689
|
+
>>> adata, type="sample_level",
|
690
|
+
>>> levels_agg=["Major_l1", "Major_l2", "Major_l3", "Major_l4", "Cluster"],
|
691
|
+
>>> key_added="lineage", add_level_name=True
|
692
|
+
>>> )
|
693
|
+
>>> mdata = tasccoda.prepare(
|
694
|
+
>>> mdata, formula="Health", reference_cell_type="automatic", tree_key="lineage", pen_args={"phi": 0}
|
695
|
+
>>> )
|
696
|
+
>>> tasccoda.run_nuts(mdata, num_samples=1000, num_warmup=100, rng_key=42)
|
697
|
+
>>> tasccoda.set_fdr(mdata, est_fdr=0.4).
|
698
|
+
""" # noqa: D205, D212
|
669
699
|
return super().set_fdr(data, est_fdr, modality_key, *args, **kwargs)
|
670
700
|
|
671
701
|
set_fdr.__doc__ = CompositionalModel2.set_fdr.__doc__ + set_fdr.__doc__
|
@@ -1,41 +1,17 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: pertpy
|
3
|
-
Version: 1.0.
|
3
|
+
Version: 1.0.2
|
4
4
|
Summary: Perturbation Analysis in the scverse ecosystem.
|
5
|
-
Project-URL: Documentation, https://pertpy.readthedocs.io
|
6
|
-
Project-URL: Source, https://github.com/scverse/pertpy
|
7
|
-
Project-URL: Home-page, https://github.com/scverse/pertpy
|
8
5
|
Author: Lukas Heumos, Lilly May, Stefan Peidli, Johannes Ostner, Gregor Sturm, Emma Dann, Yuge Ji, Xinyue Zhang, Xichen Wu, Tessa Green, Antonia Schumacher
|
9
6
|
Maintainer-email: Lukas Heumos <lukas.heumos@posteo.net>
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
Copyright (c) 2025, scverse®
|
14
|
-
|
15
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
16
|
-
of this software and associated documentation files (the "Software"), to deal
|
17
|
-
in the Software without restriction, including without limitation the rights
|
18
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
19
|
-
copies of the Software, and to permit persons to whom the Software is
|
20
|
-
furnished to do so, subject to the following conditions:
|
21
|
-
|
22
|
-
The above copyright notice and this permission notice shall be included in all
|
23
|
-
copies or substantial portions of the Software.
|
24
|
-
|
25
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
26
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
27
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
28
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
29
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
30
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
31
|
-
SOFTWARE.
|
32
|
-
License-File: LICENSE
|
7
|
+
Requires-Python: >=3.11,<3.14
|
8
|
+
Description-Content-Type: text/markdown
|
9
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
33
10
|
Classifier: Development Status :: 5 - Production/Stable
|
34
11
|
Classifier: Environment :: Console
|
35
12
|
Classifier: Framework :: Jupyter
|
36
13
|
Classifier: Intended Audience :: Developers
|
37
14
|
Classifier: Intended Audience :: Science/Research
|
38
|
-
Classifier: License :: OSI Approved :: Apache Software License
|
39
15
|
Classifier: Natural Language :: English
|
40
16
|
Classifier: Operating System :: MacOS :: MacOS X
|
41
17
|
Classifier: Operating System :: POSIX :: Linux
|
@@ -45,60 +21,62 @@ Classifier: Programming Language :: Python :: 3.12
|
|
45
21
|
Classifier: Programming Language :: Python :: 3.13
|
46
22
|
Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
|
47
23
|
Classifier: Topic :: Scientific/Engineering :: Visualization
|
48
|
-
|
49
|
-
Requires-Dist: adjusttext
|
50
|
-
Requires-Dist: arviz
|
51
|
-
Requires-Dist: blitzgsea
|
52
|
-
Requires-Dist: fast-array-utils[accel,sparse]
|
53
|
-
Requires-Dist: lamin-utils
|
54
|
-
Requires-Dist: mudata
|
55
|
-
Requires-Dist: openpyxl
|
56
|
-
Requires-Dist: ott-jax
|
57
|
-
Requires-Dist: pubchempy
|
58
|
-
Requires-Dist: pyarrow
|
59
|
-
Requires-Dist: requests
|
24
|
+
License-File: LICENSE
|
60
25
|
Requires-Dist: rich
|
61
26
|
Requires-Dist: scanpy
|
62
|
-
Requires-Dist:
|
27
|
+
Requires-Dist: mudata
|
28
|
+
Requires-Dist: requests
|
63
29
|
Requires-Dist: scikit-misc
|
64
30
|
Requires-Dist: scvi-tools
|
31
|
+
Requires-Dist: adjusttext
|
32
|
+
Requires-Dist: ott-jax
|
65
33
|
Requires-Dist: sparsecca
|
34
|
+
Requires-Dist: openpyxl
|
35
|
+
Requires-Dist: pubchempy
|
36
|
+
Requires-Dist: pyarrow
|
37
|
+
Requires-Dist: blitzgsea
|
38
|
+
Requires-Dist: scikit-learn>=1.4
|
39
|
+
Requires-Dist: fast-array-utils[accel, sparse]
|
40
|
+
Requires-Dist: lamin_utils
|
41
|
+
Requires-Dist: arviz
|
42
|
+
Requires-Dist: formulaic-contrasts>=0.2.0 ; extra == "de"
|
43
|
+
Requires-Dist: formulaic ; extra == "de"
|
44
|
+
Requires-Dist: pydeseq2>=v0.5.0 ; extra == "de"
|
45
|
+
Requires-Dist: pre-commit ; extra == "dev"
|
46
|
+
Requires-Dist: docutils>=0.8 ; extra == "doc"
|
47
|
+
Requires-Dist: sphinx>=8.1 ; extra == "doc"
|
48
|
+
Requires-Dist: scanpydoc ; extra == "doc"
|
49
|
+
Requires-Dist: sphinx-book-theme ; extra == "doc"
|
50
|
+
Requires-Dist: myst-nb ; extra == "doc"
|
51
|
+
Requires-Dist: sphinxcontrib-bibtex>=1.0.0 ; extra == "doc"
|
52
|
+
Requires-Dist: sphinx-issues ; extra == "doc"
|
53
|
+
Requires-Dist: sphinx-gallery ; extra == "doc"
|
54
|
+
Requires-Dist: sphinx-autodoc-typehints ; extra == "doc"
|
55
|
+
Requires-Dist: sphinx-copybutton ; extra == "doc"
|
56
|
+
Requires-Dist: sphinx-remove-toctrees ; extra == "doc"
|
57
|
+
Requires-Dist: sphinx-design ; extra == "doc"
|
58
|
+
Requires-Dist: sphinx-last-updated-by-git ; extra == "doc"
|
59
|
+
Requires-Dist: sphinx-automodapi ; extra == "doc"
|
60
|
+
Requires-Dist: sphinxext-opengraph ; extra == "doc"
|
61
|
+
Requires-Dist: pygments ; extra == "doc"
|
62
|
+
Requires-Dist: nbsphinx ; extra == "doc"
|
63
|
+
Requires-Dist: nbsphinx-link ; extra == "doc"
|
64
|
+
Requires-Dist: ipykernel ; extra == "doc"
|
65
|
+
Requires-Dist: ipython ; extra == "doc"
|
66
|
+
Requires-Dist: toytree>=3.0 ; extra == "tcoda"
|
67
|
+
Requires-Dist: ete4 ; extra == "tcoda"
|
68
|
+
Requires-Dist: pyqt6 ; extra == "tcoda"
|
69
|
+
Requires-Dist: pytest ; extra == "test"
|
70
|
+
Requires-Dist: coverage ; extra == "test"
|
71
|
+
Requires-Dist: leidenalg ; extra == "test"
|
72
|
+
Project-URL: Documentation, https://pertpy.readthedocs.io
|
73
|
+
Project-URL: Home-page, https://github.com/scverse/pertpy
|
74
|
+
Project-URL: Source, https://github.com/scverse/pertpy
|
66
75
|
Provides-Extra: de
|
67
|
-
Requires-Dist: formulaic; extra == 'de'
|
68
|
-
Requires-Dist: formulaic-contrasts>=0.2.0; extra == 'de'
|
69
|
-
Requires-Dist: pydeseq2>=v0.5.0; extra == 'de'
|
70
76
|
Provides-Extra: dev
|
71
|
-
Requires-Dist: pre-commit; extra == 'dev'
|
72
77
|
Provides-Extra: doc
|
73
|
-
Requires-Dist: docutils>=0.8; extra == 'doc'
|
74
|
-
Requires-Dist: ipykernel; extra == 'doc'
|
75
|
-
Requires-Dist: ipython; extra == 'doc'
|
76
|
-
Requires-Dist: myst-nb; extra == 'doc'
|
77
|
-
Requires-Dist: nbsphinx; extra == 'doc'
|
78
|
-
Requires-Dist: nbsphinx-link; extra == 'doc'
|
79
|
-
Requires-Dist: pygments; extra == 'doc'
|
80
|
-
Requires-Dist: scanpydoc; extra == 'doc'
|
81
|
-
Requires-Dist: sphinx-autodoc-typehints; extra == 'doc'
|
82
|
-
Requires-Dist: sphinx-automodapi; extra == 'doc'
|
83
|
-
Requires-Dist: sphinx-book-theme; extra == 'doc'
|
84
|
-
Requires-Dist: sphinx-copybutton; extra == 'doc'
|
85
|
-
Requires-Dist: sphinx-design; extra == 'doc'
|
86
|
-
Requires-Dist: sphinx-gallery; extra == 'doc'
|
87
|
-
Requires-Dist: sphinx-issues; extra == 'doc'
|
88
|
-
Requires-Dist: sphinx-last-updated-by-git; extra == 'doc'
|
89
|
-
Requires-Dist: sphinx-remove-toctrees; extra == 'doc'
|
90
|
-
Requires-Dist: sphinx>=8.1; extra == 'doc'
|
91
|
-
Requires-Dist: sphinxcontrib-bibtex>=1.0.0; extra == 'doc'
|
92
|
-
Requires-Dist: sphinxext-opengraph; extra == 'doc'
|
93
78
|
Provides-Extra: tcoda
|
94
|
-
Requires-Dist: ete4; extra == 'tcoda'
|
95
|
-
Requires-Dist: pyqt6; extra == 'tcoda'
|
96
|
-
Requires-Dist: toytree>=3.0; extra == 'tcoda'
|
97
79
|
Provides-Extra: test
|
98
|
-
Requires-Dist: coverage; extra == 'test'
|
99
|
-
Requires-Dist: leidenalg; extra == 'test'
|
100
|
-
Requires-Dist: pytest; extra == 'test'
|
101
|
-
Description-Content-Type: text/markdown
|
102
80
|
|
103
81
|
[](https://github.com/scverse/pertpy/actions/workflows/build.yml)
|
104
82
|
[](https://codecov.io/gh/scverse/pertpy)
|
@@ -205,3 +183,4 @@ If you like scverse® and want to support our mission, please consider making a
|
|
205
183
|
>
|
206
184
|
</a>
|
207
185
|
</div>
|
186
|
+
|
@@ -1,4 +1,4 @@
|
|
1
|
-
pertpy/__init__.py,sha256=
|
1
|
+
pertpy/__init__.py,sha256=BTYM-9jQll7SwO4GNHDYKoD5duQXVPwifZYGOvtDD-E,972
|
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
|
@@ -6,7 +6,7 @@ pertpy/data/__init__.py,sha256=ah3yvoxkgbdMUNAWxS3SyqcUuVamBOSeuWkF2QRAEwM,2703
|
|
6
6
|
pertpy/data/_dataloader.py,sha256=Cb08iJj7vH-VishU4NJ5nzPPgviFLY1f5p3K4eVvTeg,4679
|
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=
|
9
|
+
pertpy/metadata/_cell_line.py,sha256=dtHjyFPtVzA31fib3IdURCBbsHDjbKyGDrJo9veSEU8,42854
|
10
10
|
pertpy/metadata/_compound.py,sha256=JsAv_KCcNkgVVrXTyhu-BeM8rBX8a93Wq5Z6avpxN7Y,4764
|
11
11
|
pertpy/metadata/_drug.py,sha256=8QDSyxiFl25JdS80EQJC_krg6fEe5LIQEE6BsV1r8nY,9006
|
12
12
|
pertpy/metadata/_look_up.py,sha256=0nrI_xy-qBZ3tyt4dwhEBwm0A9WP95ZaDiUQFf_88FU,28663
|
@@ -27,8 +27,8 @@ pertpy/tools/decoupler_LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaY
|
|
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
29
|
pertpy/tools/_coda/_base_coda.py,sha256=2YIB7rVf9CxwYyQCpC8e3VYCxfurvyAqUs-4qJ5pubg,111817
|
30
|
-
pertpy/tools/_coda/_sccoda.py,sha256=
|
31
|
-
pertpy/tools/_coda/_tasccoda.py,sha256=
|
30
|
+
pertpy/tools/_coda/_sccoda.py,sha256=BzxR6x8DvyHAYGM9SEeJGh3opm3MfSqals6yOw77tqI,24136
|
31
|
+
pertpy/tools/_coda/_tasccoda.py,sha256=oNMFKdKfY_TUtaaDQpGbzctApQVtDeQUEDovBaXFjD0,32153
|
32
32
|
pertpy/tools/_differential_gene_expression/__init__.py,sha256=8_u7nsHY5GfFITT0Rs3v1p1vXpsGIWcBzwipuhXM3Ww,1653
|
33
33
|
pertpy/tools/_differential_gene_expression/_base.py,sha256=GbBi8o7rTA3wH5DZJ9C1QzfqB5yak4r3xMvKQrizsTY,38274
|
34
34
|
pertpy/tools/_differential_gene_expression/_checks.py,sha256=hH_GP0lWGO-5zrCFX4YiIVCZBCuK0ZJ0jFmdlx2Qm4k,1639
|
@@ -52,7 +52,7 @@ pertpy/tools/_scgen/_base_components.py,sha256=Qq8myRUm43q9XBrZ9gBggfa2cSV2wbz_K
|
|
52
52
|
pertpy/tools/_scgen/_scgen.py,sha256=AQNGsDe-9HEqli3oq7UBDg68ofLCoXm-R_jnLFQ-rlc,30856
|
53
53
|
pertpy/tools/_scgen/_scgenvae.py,sha256=bPk4v7EdJc7ROdLuDitHiX_Pvwa7Flw2qHRUwBvjLJY,3889
|
54
54
|
pertpy/tools/_scgen/_utils.py,sha256=qz5QUn_Bvk2NGyYVzp3jgjWTFOMt1YyHwUo6HWtoThY,2871
|
55
|
-
pertpy-1.0.
|
56
|
-
pertpy-1.0.
|
57
|
-
pertpy-1.0.
|
58
|
-
pertpy-1.0.
|
55
|
+
pertpy-1.0.2.dist-info/licenses/LICENSE,sha256=XuiT2hxeRInhquEIBKMZ5M21n5syhDQ4XbABoposIAg,1100
|
56
|
+
pertpy-1.0.2.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
|
57
|
+
pertpy-1.0.2.dist-info/METADATA,sha256=yWRzoCvdQNhn5sy0rtuPjRHH8H9UKmgKbrogxNWiJmM,7694
|
58
|
+
pertpy-1.0.2.dist-info/RECORD,,
|
File without changes
|