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 CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  __author__ = "Lukas Heumos"
4
4
  __email__ = "lukas.heumos@posteo.net"
5
- __version__ = "1.0.1"
5
+ __version__ = "1.0.2"
6
6
 
7
7
  import warnings
8
8
 
@@ -195,7 +195,9 @@ class CellLine(MetaData):
195
195
  block_size=4096,
196
196
  is_zip=False,
197
197
  )
198
- df = pd.read_csv(drug_response_prism_file_path, index_col=0)[["depmap_id", "name", "ic50", "ec50", "auc"]]
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
- old_index_name = "index" if adata.obs.index.name is None else adata.obs.index.name
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
- old_index_name = "index" if adata.obs.index.name is None else adata.obs.index.name
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"])
@@ -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
- prior = None
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
- """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
- """ # noqa: D205
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
- """Examples:
490
- >>> import pertpy as pt
491
- >>> haber_cells = pt.dt.haber_2017_regions()
492
- >>> sccoda = pt.tl.Sccoda()
493
- >>> mdata = sccoda.load(haber_cells,
494
- >>> type="cell_level",
495
- >>> generate_sample_level=True,
496
- >>> cell_type_identifier="cell_label",
497
- >>> sample_identifier="batch",
498
- >>> covariate_obs=["condition"])
499
- >>> mdata = sccoda.prepare(mdata, formula="condition", reference_cell_type="Endocrine")
500
- >>> sccoda.run_nuts(mdata, num_warmup=100, num_samples=1000, rng_key=42)
501
- >>> credible_effects = sccoda.credible_effects(mdata).
502
- """ # noqa: D205
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
- """Examples:
509
- >>> import pertpy as pt
510
- >>> haber_cells = pt.dt.haber_2017_regions()
511
- >>> sccoda = pt.tl.Sccoda()
512
- >>> mdata = sccoda.load(haber_cells,
513
- >>> type="cell_level",
514
- >>> generate_sample_level=True,
515
- >>> cell_type_identifier="cell_label",
516
- >>> sample_identifier="batch",
517
- >>> covariate_obs=["condition"])
518
- >>> mdata = sccoda.prepare(mdata, formula="condition", reference_cell_type="Endocrine")
519
- >>> sccoda.run_nuts(mdata, num_warmup=100, num_samples=1000, rng_key=42)
520
- >>> sccoda.summary(mdata).
521
- """ # noqa: D205
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
- """Examples:
528
- >>> import pertpy as pt
529
- >>> haber_cells = pt.dt.haber_2017_regions()
530
- >>> sccoda = pt.tl.Sccoda()
531
- >>> mdata = sccoda.load(haber_cells,
532
- >>> type="cell_level",
533
- >>> generate_sample_level=True,
534
- >>> cell_type_identifier="cell_label",
535
- >>> sample_identifier="batch",
536
- >>> covariate_obs=["condition"])
537
- >>> mdata = sccoda.prepare(mdata, formula="condition", reference_cell_type="Endocrine")
538
- >>> sccoda.run_nuts(mdata, num_warmup=100, num_samples=1000, rng_key=42)
539
- >>> sccoda.set_fdr(mdata, est_fdr=0.4).
540
- """ # noqa: D205
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__
@@ -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
- else:
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
- """Examples:
596
- >>> import pertpy as pt
597
- >>> adata = pt.dt.tasccoda_example()
598
- >>> tasccoda = pt.tl.Tasccoda()
599
- >>> mdata = tasccoda.load(
600
- >>> adata, type="sample_level",
601
- >>> levels_agg=["Major_l1", "Major_l2", "Major_l3", "Major_l4", "Cluster"],
602
- >>> key_added="lineage", add_level_name=True
603
- >>> )
604
- >>> mdata = tasccoda.prepare(
605
- >>> mdata, formula="Health", reference_cell_type="automatic", tree_key="lineage", pen_args={"phi": 0}
606
- >>> )
607
- >>> tasccoda.run_nuts(mdata, num_samples=1000, num_warmup=100, rng_key=42).
608
- """ # noqa: D205
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
- """Examples:
615
- >>> import pertpy as pt
616
- >>> adata = pt.dt.tasccoda_example()
617
- >>> tasccoda = pt.tl.Tasccoda()
618
- >>> mdata = tasccoda.load(
619
- >>> adata, type="sample_level",
620
- >>> levels_agg=["Major_l1", "Major_l2", "Major_l3", "Major_l4", "Cluster"],
621
- >>> key_added="lineage", add_level_name=True
622
- >>> )
623
- >>> mdata = tasccoda.prepare(
624
- >>> mdata, formula="Health", reference_cell_type="automatic", tree_key="lineage", pen_args={"phi": 0}
625
- >>> )
626
- >>> tasccoda.run_nuts(mdata, num_samples=1000, num_warmup=100, rng_key=42)
627
- >>> tasccoda.summary(mdata).
628
- """ # noqa: D205
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
- """Examples:
635
- >>> import pertpy as pt
636
- >>> adata = pt.dt.tasccoda_example()
637
- >>> tasccoda = pt.tl.Tasccoda()
638
- >>> mdata = tasccoda.load(
639
- >>> adata, type="sample_level",
640
- >>> levels_agg=["Major_l1", "Major_l2", "Major_l3", "Major_l4", "Cluster"],
641
- >>> key_added="lineage", add_level_name=True
642
- >>> )
643
- >>> mdata = tasccoda.prepare(
644
- >>> mdata, formula="Health", reference_cell_type="automatic", tree_key="lineage", pen_args={"phi": 0}
645
- >>> )
646
- >>> tasccoda.run_nuts(mdata, num_samples=1000, num_warmup=100, rng_key=42)
647
- >>> tasccoda.credible_effects(mdata).
648
- """ # noqa: D205
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
- """Examples:
655
- >>> import pertpy as pt
656
- >>> adata = pt.dt.tasccoda_example()
657
- >>> tasccoda = pt.tl.Tasccoda()
658
- >>> mdata = tasccoda.load(
659
- >>> adata, type="sample_level",
660
- >>> levels_agg=["Major_l1", "Major_l2", "Major_l3", "Major_l4", "Cluster"],
661
- >>> key_added="lineage", add_level_name=True
662
- >>> )
663
- >>> mdata = tasccoda.prepare(
664
- >>> mdata, formula="Health", reference_cell_type="automatic", tree_key="lineage", pen_args={"phi": 0}
665
- >>> )
666
- >>> tasccoda.run_nuts(mdata, num_samples=1000, num_warmup=100, rng_key=42)
667
- >>> tasccoda.set_fdr(mdata, est_fdr=0.4).
668
- """ # noqa: D205
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.1
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
- License: MIT License
11
-
12
- Copyright (c) 2021, Lukas Heumos
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
- Requires-Python: <3.14,>=3.11
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: scikit-learn>=1.4
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
  [![Build](https://github.com/scverse/pertpy/actions/workflows/build.yml/badge.svg)](https://github.com/scverse/pertpy/actions/workflows/build.yml)
104
82
  [![codecov](https://codecov.io/gh/scverse/pertpy/graph/badge.svg?token=1dTpIPBShv)](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=R-RrfgZrhMfn7G60kmTDN88ECqS90AyY9Ed5615hQEg,972
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=hKmaZvjIsQ3wHo__0aKo3JlWvsf8-4OD-gIBNQnW8_E,42716
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=FaXn20K4ROYtbrZop_dWRokfwX0vlCizKV02V3Cf7zo,24611
31
- pertpy/tools/_coda/_tasccoda.py,sha256=BTaOAmL458zQ_og3x4ENlDnJHD6_F4YkdCoXWsF4i1U,30465
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.1.dist-info/METADATA,sha256=U9XINrPTrqx9UfLIsUt1X9p6LQLvNSV89GGAZnEHnks,8939
56
- pertpy-1.0.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
57
- pertpy-1.0.1.dist-info/licenses/LICENSE,sha256=XuiT2hxeRInhquEIBKMZ5M21n5syhDQ4XbABoposIAg,1100
58
- pertpy-1.0.1.dist-info/RECORD,,
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,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.27.0
2
+ Generator: flit 3.12.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any