decoupler 2.0.0__tar.gz → 2.0.2__tar.gz

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.
Files changed (186) hide show
  1. {decoupler-2.0.0 → decoupler-2.0.2}/.github/workflows/test.yaml +3 -0
  2. {decoupler-2.0.0 → decoupler-2.0.2}/CHANGELOG.md +4 -4
  3. {decoupler-2.0.0 → decoupler-2.0.2}/LICENSE +1 -1
  4. {decoupler-2.0.0 → decoupler-2.0.2}/PKG-INFO +4 -3
  5. {decoupler-2.0.0 → decoupler-2.0.2}/README.md +1 -1
  6. decoupler-2.0.2/docs/api/bm.md +44 -0
  7. decoupler-2.0.2/docs/api/ds.md +48 -0
  8. decoupler-2.0.2/docs/api/index.md +24 -0
  9. decoupler-2.0.2/docs/api/mt.md +34 -0
  10. decoupler-2.0.2/docs/api/op.md +28 -0
  11. decoupler-2.0.2/docs/api/pl.md +23 -0
  12. decoupler-2.0.2/docs/api/pp.md +40 -0
  13. decoupler-2.0.2/docs/api/tl.md +13 -0
  14. {decoupler-2.0.0 → decoupler-2.0.2}/docs/index.md +1 -1
  15. {decoupler-2.0.0 → decoupler-2.0.2}/docs/notebooks/bench/index.md +2 -0
  16. {decoupler-2.0.0 → decoupler-2.0.2}/docs/notebooks/bulk/index.md +2 -0
  17. {decoupler-2.0.0 → decoupler-2.0.2}/docs/notebooks/index.md +2 -0
  18. {decoupler-2.0.0 → decoupler-2.0.2}/docs/notebooks/omnipath/index.md +2 -0
  19. {decoupler-2.0.0 → decoupler-2.0.2}/docs/notebooks/scell/index.md +2 -0
  20. {decoupler-2.0.0 → decoupler-2.0.2}/docs/notebooks/spatial/index.md +2 -0
  21. {decoupler-2.0.0 → decoupler-2.0.2}/pyproject.toml +2 -1
  22. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/bm/_run.py +23 -0
  23. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/bm/metric/_auc.py +9 -10
  24. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/bm/metric/_hmean.py +8 -1
  25. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/mt/_aucell.py +1 -1
  26. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/mt/_consensus.py +33 -1
  27. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/mt/_gsea.py +2 -2
  28. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/mt/_mdt.py +4 -1
  29. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/mt/_ora.py +1 -1
  30. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/mt/_udt.py +4 -1
  31. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/mt/_viper.py +92 -1
  32. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/mt/_waggr.py +47 -1
  33. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/mt/_zscore.py +34 -2
  34. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/pl/_leading_edge.py +15 -0
  35. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/pl/_order.py +4 -4
  36. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/pl/_order_targets.py +6 -4
  37. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/pl/_volcano.py +2 -0
  38. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/pp/anndata.py +20 -16
  39. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/tl/_rankby_order.py +5 -1
  40. decoupler-2.0.2/tests/bm/test_benchmark.py +59 -0
  41. decoupler-2.0.2/tests/bm/test_pl.py +89 -0
  42. {decoupler-2.0.0 → decoupler-2.0.2}/tests/conftest.py +7 -0
  43. decoupler-2.0.2/tests/mt/test_decouple.py +34 -0
  44. decoupler-2.0.2/tests/pl/test_Plotter.py +26 -0
  45. {decoupler-2.0.0 → decoupler-2.0.2}/tests/pl/test_barplot.py +5 -3
  46. {decoupler-2.0.0 → decoupler-2.0.2}/tests/pl/test_order_targets.py +1 -0
  47. {decoupler-2.0.0 → decoupler-2.0.2}/tests/pp/test_anndata.py +24 -2
  48. {decoupler-2.0.0 → decoupler-2.0.2}/tests/pp/test_data.py +8 -0
  49. {decoupler-2.0.0 → decoupler-2.0.2}/tests/tl/test_rankby_obsm.py +3 -0
  50. decoupler-2.0.0/docs/api.md +0 -188
  51. decoupler-2.0.0/tests/mt/test_decouple.py +0 -26
  52. {decoupler-2.0.0 → decoupler-2.0.2}/.codecov.yaml +0 -0
  53. {decoupler-2.0.0 → decoupler-2.0.2}/.cruft.json +0 -0
  54. {decoupler-2.0.0 → decoupler-2.0.2}/.editorconfig +0 -0
  55. {decoupler-2.0.0 → decoupler-2.0.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  56. {decoupler-2.0.0 → decoupler-2.0.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  57. {decoupler-2.0.0 → decoupler-2.0.2}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  58. {decoupler-2.0.0 → decoupler-2.0.2}/.github/workflows/build.yaml +0 -0
  59. {decoupler-2.0.0 → decoupler-2.0.2}/.github/workflows/release.yaml +0 -0
  60. {decoupler-2.0.0 → decoupler-2.0.2}/.gitignore +0 -0
  61. {decoupler-2.0.0 → decoupler-2.0.2}/.pre-commit-config.yaml +0 -0
  62. {decoupler-2.0.0 → decoupler-2.0.2}/.readthedocs.yaml +0 -0
  63. {decoupler-2.0.0 → decoupler-2.0.2}/.vscode/extensions.json +0 -0
  64. {decoupler-2.0.0 → decoupler-2.0.2}/.vscode/launch.json +0 -0
  65. {decoupler-2.0.0 → decoupler-2.0.2}/.vscode/settings.json +0 -0
  66. {decoupler-2.0.0 → decoupler-2.0.2}/biome.jsonc +0 -0
  67. {decoupler-2.0.0 → decoupler-2.0.2}/docs/_static/.gitkeep +0 -0
  68. {decoupler-2.0.0 → decoupler-2.0.2}/docs/_static/css/custom.css +0 -0
  69. {decoupler-2.0.0 → decoupler-2.0.2}/docs/_static/images/logo.png +0 -0
  70. {decoupler-2.0.0 → decoupler-2.0.2}/docs/_static/images/mlm.png +0 -0
  71. {decoupler-2.0.0 → decoupler-2.0.2}/docs/_static/images/ora.png +0 -0
  72. {decoupler-2.0.0 → decoupler-2.0.2}/docs/_static/images/ulm.png +0 -0
  73. {decoupler-2.0.0 → decoupler-2.0.2}/docs/_templates/.gitkeep +0 -0
  74. {decoupler-2.0.0 → decoupler-2.0.2}/docs/_templates/autosummary/class.rst +0 -0
  75. {decoupler-2.0.0 → decoupler-2.0.2}/docs/changelog.md +0 -0
  76. {decoupler-2.0.0 → decoupler-2.0.2}/docs/conf.py +0 -0
  77. {decoupler-2.0.0 → decoupler-2.0.2}/docs/extensions/typed_returns.py +0 -0
  78. {decoupler-2.0.0 → decoupler-2.0.2}/docs/notebooks/bench/rna.ipynb +0 -0
  79. {decoupler-2.0.0 → decoupler-2.0.2}/docs/notebooks/bulk/rna.ipynb +0 -0
  80. {decoupler-2.0.0 → decoupler-2.0.2}/docs/notebooks/example.ipynb +0 -0
  81. {decoupler-2.0.0 → decoupler-2.0.2}/docs/notebooks/omnipath/licenses.ipynb +0 -0
  82. {decoupler-2.0.0 → decoupler-2.0.2}/docs/notebooks/omnipath/orthologs.ipynb +0 -0
  83. {decoupler-2.0.0 → decoupler-2.0.2}/docs/notebooks/scell/rna_psbk.ipynb +0 -0
  84. {decoupler-2.0.0 → decoupler-2.0.2}/docs/notebooks/scell/rna_pstime.ipynb +0 -0
  85. {decoupler-2.0.0 → decoupler-2.0.2}/docs/notebooks/scell/rna_sc.ipynb +0 -0
  86. {decoupler-2.0.0 → decoupler-2.0.2}/docs/notebooks/spatial/rna_visium.ipynb +0 -0
  87. {decoupler-2.0.0 → decoupler-2.0.2}/docs/references.bib +0 -0
  88. {decoupler-2.0.0 → decoupler-2.0.2}/docs/references.md +0 -0
  89. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/_Method.py +0 -0
  90. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/_Plotter.py +0 -0
  91. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/__init__.py +0 -0
  92. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/_datatype.py +0 -0
  93. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/_docs.py +0 -0
  94. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/_download.py +0 -0
  95. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/_log.py +0 -0
  96. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/bm/__init__.py +0 -0
  97. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/bm/_pp.py +0 -0
  98. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/bm/metric/__init__.py +0 -0
  99. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/bm/metric/_fscore.py +0 -0
  100. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/bm/metric/_qrank.py +0 -0
  101. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/bm/pl/__init__.py +0 -0
  102. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/bm/pl/_auc.py +0 -0
  103. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/bm/pl/_bar.py +0 -0
  104. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/bm/pl/_format.py +0 -0
  105. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/bm/pl/_fscore.py +0 -0
  106. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/bm/pl/_qrank.py +0 -0
  107. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/bm/pl/_summary.py +0 -0
  108. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/ds/__init__.py +0 -0
  109. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/ds/_bulk.py +0 -0
  110. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/ds/_scell.py +0 -0
  111. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/ds/_spatial.py +0 -0
  112. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/ds/_toy.py +0 -0
  113. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/ds/_utils.py +0 -0
  114. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/mt/__init__.py +0 -0
  115. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/mt/_decouple.py +0 -0
  116. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/mt/_gsva.py +0 -0
  117. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/mt/_methods.py +0 -0
  118. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/mt/_mlm.py +0 -0
  119. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/mt/_run.py +0 -0
  120. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/mt/_ulm.py +0 -0
  121. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/op/__init__.py +0 -0
  122. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/op/_collectri.py +0 -0
  123. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/op/_dorothea.py +0 -0
  124. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/op/_dtype.py +0 -0
  125. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/op/_hallmark.py +0 -0
  126. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/op/_progeny.py +0 -0
  127. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/op/_resource.py +0 -0
  128. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/op/_translate.py +0 -0
  129. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/pl/__init__.py +0 -0
  130. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/pl/_barplot.py +0 -0
  131. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/pl/_dotplot.py +0 -0
  132. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/pl/_filter_by_expr.py +0 -0
  133. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/pl/_filter_by_prop.py +0 -0
  134. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/pl/_filter_samples.py +0 -0
  135. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/pl/_network.py +0 -0
  136. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/pl/_obsbar.py +0 -0
  137. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/pl/_obsm.py +0 -0
  138. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/pl/_source_targets.py +0 -0
  139. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/pp/__init__.py +0 -0
  140. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/pp/data.py +0 -0
  141. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/pp/net.py +0 -0
  142. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/tl/__init__.py +0 -0
  143. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/tl/_rankby_group.py +0 -0
  144. {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/tl/_rankby_obsm.py +0 -0
  145. {decoupler-2.0.0 → decoupler-2.0.2}/tests/ds/test_bulk.py +0 -0
  146. {decoupler-2.0.0 → decoupler-2.0.2}/tests/ds/test_scell.py +0 -0
  147. {decoupler-2.0.0 → decoupler-2.0.2}/tests/ds/test_spatial.py +0 -0
  148. {decoupler-2.0.0 → decoupler-2.0.2}/tests/ds/test_toy.py +0 -0
  149. {decoupler-2.0.0 → decoupler-2.0.2}/tests/ds/test_utils.py +0 -0
  150. {decoupler-2.0.0 → decoupler-2.0.2}/tests/mt/test_aucell.py +0 -0
  151. {decoupler-2.0.0 → decoupler-2.0.2}/tests/mt/test_consensus.py +0 -0
  152. {decoupler-2.0.0 → decoupler-2.0.2}/tests/mt/test_gsea.py +0 -0
  153. {decoupler-2.0.0 → decoupler-2.0.2}/tests/mt/test_gsva.py +0 -0
  154. {decoupler-2.0.0 → decoupler-2.0.2}/tests/mt/test_mdt.py +0 -0
  155. {decoupler-2.0.0 → decoupler-2.0.2}/tests/mt/test_methods.py +0 -0
  156. {decoupler-2.0.0 → decoupler-2.0.2}/tests/mt/test_mlm.py +0 -0
  157. {decoupler-2.0.0 → decoupler-2.0.2}/tests/mt/test_ora.py +0 -0
  158. {decoupler-2.0.0 → decoupler-2.0.2}/tests/mt/test_run.py +0 -0
  159. {decoupler-2.0.0 → decoupler-2.0.2}/tests/mt/test_udt.py +0 -0
  160. {decoupler-2.0.0 → decoupler-2.0.2}/tests/mt/test_ulm.py +0 -0
  161. {decoupler-2.0.0 → decoupler-2.0.2}/tests/mt/test_viper.py +0 -0
  162. {decoupler-2.0.0 → decoupler-2.0.2}/tests/mt/test_waggr.py +0 -0
  163. {decoupler-2.0.0 → decoupler-2.0.2}/tests/mt/test_zscore.py +0 -0
  164. {decoupler-2.0.0 → decoupler-2.0.2}/tests/op/test_collectri.py +0 -0
  165. {decoupler-2.0.0 → decoupler-2.0.2}/tests/op/test_dorothea.py +0 -0
  166. {decoupler-2.0.0 → decoupler-2.0.2}/tests/op/test_dtype.py +0 -0
  167. {decoupler-2.0.0 → decoupler-2.0.2}/tests/op/test_hallmark.py +0 -0
  168. {decoupler-2.0.0 → decoupler-2.0.2}/tests/op/test_progeny.py +0 -0
  169. {decoupler-2.0.0 → decoupler-2.0.2}/tests/op/test_resource.py +0 -0
  170. {decoupler-2.0.0 → decoupler-2.0.2}/tests/op/test_translate.py +0 -0
  171. {decoupler-2.0.0 → decoupler-2.0.2}/tests/pl/test_dotplot.py +0 -0
  172. {decoupler-2.0.0 → decoupler-2.0.2}/tests/pl/test_filter_by_expr.py +0 -0
  173. {decoupler-2.0.0 → decoupler-2.0.2}/tests/pl/test_filter_by_prop.py +0 -0
  174. {decoupler-2.0.0 → decoupler-2.0.2}/tests/pl/test_filter_samples.py +0 -0
  175. {decoupler-2.0.0 → decoupler-2.0.2}/tests/pl/test_leading_edge.py +0 -0
  176. {decoupler-2.0.0 → decoupler-2.0.2}/tests/pl/test_network.py +0 -0
  177. {decoupler-2.0.0 → decoupler-2.0.2}/tests/pl/test_obsbar.py +0 -0
  178. {decoupler-2.0.0 → decoupler-2.0.2}/tests/pl/test_obsm.py +0 -0
  179. {decoupler-2.0.0 → decoupler-2.0.2}/tests/pl/test_order.py +0 -0
  180. {decoupler-2.0.0 → decoupler-2.0.2}/tests/pl/test_source_targets.py +0 -0
  181. {decoupler-2.0.0 → decoupler-2.0.2}/tests/pl/test_volcano.py +0 -0
  182. {decoupler-2.0.0 → decoupler-2.0.2}/tests/pp/test_net.py +0 -0
  183. {decoupler-2.0.0 → decoupler-2.0.2}/tests/test_download.py +0 -0
  184. {decoupler-2.0.0 → decoupler-2.0.2}/tests/test_version.py +0 -0
  185. {decoupler-2.0.0 → decoupler-2.0.2}/tests/tl/test_rankby_group.py +0 -0
  186. {decoupler-2.0.0 → decoupler-2.0.2}/tests/tl/test_rankby_order.py +0 -0
@@ -78,11 +78,14 @@ jobs:
78
78
  MPLBACKEND: agg
79
79
  PLATFORM: ${{ matrix.os }}
80
80
  DISPLAY: :42
81
+ NUMBA_JIT_COVERAGE: "1"
81
82
  run: uvx hatch run ${{ matrix.env.name }}:run-cov
82
83
  - name: generate coverage report
83
84
  run: uvx hatch run ${{ matrix.env.name }}:coverage xml
84
85
  - name: Upload coverage
85
86
  uses: codecov/codecov-action@v4
87
+ with:
88
+ token: ${{ secrets.CODECOV_TOKEN }}
86
89
 
87
90
  # Check that all tests defined above pass. This makes it easy to set a single "required" test in branch
88
91
  # protection instead of having to update it frequently. See https://github.com/re-actors/alls-green#why.
@@ -10,7 +10,7 @@ and this project adheres to [Semantic Versioning][].
10
10
 
11
11
  ## 2.0.0
12
12
 
13
- Major update to accomodate the scverse :cite:`scverse` template.
13
+ Major update to accomodate the scverse template {cite}`scverse`.
14
14
 
15
15
  All functions have been rewritten to follow the new API, errors when running previous versions (`1.X.X`) are expected if `decoupler >= 2.0.0` is installed.
16
16
 
@@ -20,8 +20,8 @@ All functions have been rewritten to follow the new API, errors when running pre
20
20
  - Use `decoupler.mt.<method_name>` to call a method
21
21
  - `min_n` argument has been renamed `tmin`
22
22
  - New argument `bsize` allows to run a method with batches in case excessive memory usage is an issue
23
- - :math:`p_{values}` of the enrichment scores are now corrected by Benjamini-Hochberg
24
- - `mdt` and `udt` are now based on `xgboost` instead of `sklearn` for better scalability. `udt` statistic is now the coefficient of determination :math:`R^2` instead of the importance of a single decision tree.
23
+ - $p_{values}$ of the enrichment scores are now corrected by Benjamini-Hochberg
24
+ - `mdt` and `udt` are now based on `xgboost` instead of `sklearn` for better scalability. `udt` statistic is now the coefficient of determination $R^2$ instead of the importance of a single decision tree.
25
25
  - `ora` now returns the odds ratio of the contingency table as a statistic, and computes a two-sided Fisher exact test instead of a one-sided one
26
26
  - `viper` now correctly estimates shadow regulons when network weights are values other than -1 or +1
27
27
  - `wsum` and `wmean` are deprecated, instead now the method `waggr` allows to run both methods and any custom function. This makes it easier to quickly test new enrichment methods without having to deal with `decoupler`'s implementation
@@ -40,7 +40,7 @@ All functions have been rewritten to follow the new API, errors when running pre
40
40
  - `plot_associations` to `obsm`
41
41
  - `plot_targets` to `source_targets`
42
42
  - Preprocessing functions are now in the new `pp` module
43
- - Renamed `check_corr` to `net_corr`, now also returns adjusted :math:`p_{values}`
43
+ - Renamed `check_corr` to `net_corr`, now also returns adjusted $p_{values}$
44
44
  - Renamed `get_acts` to `get_obsm`
45
45
  - Renamed `get_pseudobulk` to `pseudobulk`. Now it does not automatically remove low quality samples, this is now done with the function `filter_samples`
46
46
  - Deprecated `get_contrast`, `get_top_targets` and `format_contrast_results`. `PyDESeq2` should be used instead
@@ -1,6 +1,6 @@
1
1
  BSD 3-Clause License
2
2
 
3
- Copyright (c) 2025, Pau Badia i Mompel
3
+ Copyright (c) 2025, Pau Badia i Mompel, Saez lab
4
4
  All rights reserved.
5
5
 
6
6
  Redistribution and use in source and binary forms, with or without
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: decoupler
3
- Version: 2.0.0
3
+ Version: 2.0.2
4
4
  Summary: Python package to perform enrichment analysis from omics data.
5
5
  Project-URL: Documentation, https://decoupler.readthedocs.io/
6
6
  Project-URL: Homepage, https://github.com/PauBadiaM/decoupler
@@ -9,7 +9,7 @@ Author: Pau Badia i Mompel
9
9
  Maintainer-email: Pau Badia i Mompel <pau.badia@uni-heidelberg.de>
10
10
  License: BSD 3-Clause License
11
11
 
12
- Copyright (c) 2025, Pau Badia i Mompel
12
+ Copyright (c) 2025, Pau Badia i Mompel, Saez lab
13
13
  All rights reserved.
14
14
 
15
15
  Redistribution and use in source and binary forms, with or without
@@ -47,6 +47,7 @@ Requires-Dist: adjusttext
47
47
  Requires-Dist: anndata
48
48
  Requires-Dist: docrep
49
49
  Requires-Dist: igraph
50
+ Requires-Dist: ipywidgets
50
51
  Requires-Dist: marsilea
51
52
  Requires-Dist: numba
52
53
  Requires-Dist: requests
@@ -134,7 +135,7 @@ There are several alternative options to install decoupler:
134
135
  pip install decoupler
135
136
  ```
136
137
 
137
- 2. Install the latest stable version from [conda-forge][conda] using mamba or conda:
138
+ 2. Install the latest stable version from [conda-forge][conda] using mamba or conda (pay attention to the `-py` suffix at the end):
138
139
 
139
140
  ```bash
140
141
  mamba create -n=dcp conda-forge::decoupler-py
@@ -53,7 +53,7 @@ There are several alternative options to install decoupler:
53
53
  pip install decoupler
54
54
  ```
55
55
 
56
- 2. Install the latest stable version from [conda-forge][conda] using mamba or conda:
56
+ 2. Install the latest stable version from [conda-forge][conda] using mamba or conda (pay attention to the `-py` suffix at the end):
57
57
 
58
58
  ```bash
59
59
  mamba create -n=dcp conda-forge::decoupler-py
@@ -0,0 +1,44 @@
1
+ # Benchmark
2
+
3
+
4
+ ## Pipeline
5
+ ```{eval-rst}
6
+ .. module:: decoupler.bm
7
+ .. currentmodule:: decoupler
8
+
9
+ .. autosummary::
10
+ :toctree: generated
11
+
12
+ bm.benchmark
13
+ ```
14
+
15
+ ## Metrics
16
+
17
+ ```{eval-rst}
18
+ .. module:: decoupler.bm.metric
19
+ .. currentmodule:: decoupler
20
+
21
+ .. autosummary::
22
+ :toctree: generated
23
+
24
+ bm.metric.auc
25
+ bm.metric.fscore
26
+ bm.metric.qrank
27
+ bm.metric.hmean
28
+ ```
29
+
30
+ ## Plotting
31
+
32
+ ```{eval-rst}
33
+ .. module:: decoupler.bm.pl
34
+ .. currentmodule:: decoupler
35
+
36
+ .. autosummary::
37
+ :toctree: generated
38
+
39
+ bm.pl.auc
40
+ bm.pl.fscore
41
+ bm.pl.qrank
42
+ bm.pl.bar
43
+ bm.pl.summary
44
+ ```
@@ -0,0 +1,48 @@
1
+ # Datasets
2
+
3
+ ## Bulk
4
+ ```{eval-rst}
5
+ .. module:: decoupler.ds
6
+ .. currentmodule:: decoupler
7
+
8
+ .. autosummary::
9
+ :toctree: generated
10
+
11
+ ds.hsctgfb
12
+ ds.knocktf
13
+ ```
14
+
15
+ ## Single-cell
16
+ ```{eval-rst}
17
+ .. autosummary::
18
+ :toctree: generated
19
+
20
+ ds.covid5k
21
+ ds.erygast1k
22
+ ds.pbmc3k
23
+ ```
24
+
25
+ ## Spatial
26
+ ```{eval-rst}
27
+ .. autosummary::
28
+ :toctree: generated
29
+
30
+ ds.msvisium
31
+ ```
32
+
33
+ ## Toy
34
+ ```{eval-rst}
35
+ .. autosummary::
36
+ :toctree: generated
37
+
38
+ ds.toy
39
+ ds.toy_bench
40
+ ```
41
+
42
+ ## Utils
43
+ ```{eval-rst}
44
+ .. autosummary::
45
+ :toctree: generated
46
+
47
+ ds.ensmbl_to_symbol
48
+ ```
@@ -0,0 +1,24 @@
1
+ # API
2
+
3
+ Import decoupler as:
4
+
5
+ ```
6
+ import decoupler as dc
7
+ ```
8
+
9
+ ```{toctree}
10
+ :maxdepth: 2
11
+
12
+ bm
13
+ ds
14
+ mt
15
+ op
16
+ pp
17
+ ```
18
+
19
+ ```{toctree}
20
+ :maxdepth: 1
21
+
22
+ pl
23
+ tl
24
+ ```
@@ -0,0 +1,34 @@
1
+ # Methods
2
+
3
+ ## Single methods
4
+
5
+ ```{eval-rst}
6
+ .. module:: decoupler.mt
7
+ .. currentmodule:: decoupler
8
+
9
+ .. autosummary::
10
+ :toctree: generated
11
+
12
+ mt.aucell
13
+ mt.gsea
14
+ mt.gsva
15
+ mt.mdt
16
+ mt.mlm
17
+ mt.ora
18
+ mt.udt
19
+ mt.udt
20
+ mt.ulm
21
+ mt.viper
22
+ mt.waggr
23
+ mt.zscore
24
+ ```
25
+
26
+ ## Multiple methods
27
+
28
+ ```{eval-rst}
29
+ .. autosummary::
30
+ :toctree: generated
31
+
32
+ mt.decouple
33
+ mt.consensus
34
+ ```
@@ -0,0 +1,28 @@
1
+ # OmniPath
2
+
3
+ ## Resources
4
+
5
+ ```{eval-rst}
6
+ .. module:: decoupler.op
7
+ .. currentmodule:: decoupler
8
+
9
+ .. autosummary::
10
+ :toctree: generated
11
+
12
+ op.collectri
13
+ op.dorothea
14
+ op.hallmark
15
+ op.progeny
16
+ op.resource
17
+ ```
18
+
19
+ ## Utils
20
+
21
+ ```{eval-rst}
22
+ .. autosummary::
23
+ :toctree: generated
24
+
25
+ op.show_resources
26
+ op.show_organisms
27
+ op.translate
28
+ ```
@@ -0,0 +1,23 @@
1
+ # Plotting
2
+
3
+ ```{eval-rst}
4
+ .. module:: decoupler.pl
5
+ .. currentmodule:: decoupler
6
+
7
+ .. autosummary::
8
+ :toctree: generated
9
+
10
+ pl.barplot
11
+ pl.dotplot
12
+ pl.filter_by_expr
13
+ pl.filter_by_prop
14
+ pl.filter_samples
15
+ pl.leading_edge
16
+ pl.network
17
+ pl.obsbar
18
+ pl.obsm
19
+ pl.order_targets
20
+ pl.order
21
+ pl.source_targets
22
+ pl.volcano
23
+ ```
@@ -0,0 +1,40 @@
1
+ # Preprocessing
2
+
3
+ ## Data
4
+ ```{eval-rst}
5
+ .. module:: decoupler.pp
6
+ .. currentmodule:: decoupler
7
+
8
+ .. autosummary::
9
+ :toctree: generated
10
+
11
+ pp.extract
12
+ ```
13
+
14
+ ## Network
15
+ ```{eval-rst}
16
+ .. autosummary::
17
+ :toctree: generated
18
+
19
+ pp.read_gmt
20
+ pp.prune
21
+ pp.adjmat
22
+ pp.idxmat
23
+ pp.shuffle_net
24
+ pp.net_corr
25
+ ```
26
+
27
+ ## AnnData
28
+ ```{eval-rst}
29
+ .. autosummary::
30
+ :toctree: generated
31
+
32
+ pp.get_obsm
33
+ pp.swap_layer
34
+ pp.pseudobulk
35
+ pp.filter_samples
36
+ pp.filter_by_expr
37
+ pp.filter_by_prop
38
+ pp.knn
39
+ pp.bin_order
40
+ ```
@@ -0,0 +1,13 @@
1
+ # Tools
2
+
3
+ ```{eval-rst}
4
+ .. module:: decoupler.tl
5
+ .. currentmodule:: decoupler
6
+
7
+ .. autosummary::
8
+ :toctree: generated
9
+
10
+ tl.rankby_group
11
+ tl.rankby_obsm
12
+ tl.rankby_order
13
+ ```
@@ -6,7 +6,7 @@
6
6
  :maxdepth: 1
7
7
  :hidden: true
8
8
 
9
- api
9
+ api/index
10
10
  notebooks/index
11
11
  changelog
12
12
  references
@@ -1,4 +1,6 @@
1
1
  # Benchmark
2
2
  ```{toctree}
3
+ :maxdepth: 1
4
+
3
5
  rna
4
6
  ```
@@ -1,4 +1,6 @@
1
1
  # Bulk
2
2
  ```{toctree}
3
+ :maxdepth: 1
4
+
3
5
  rna
4
6
  ```
@@ -1,5 +1,7 @@
1
1
  # Tutorials
2
2
  ```{toctree}
3
+ :maxdepth: 1
4
+
3
5
  example
4
6
  scell/index
5
7
  spatial/index
@@ -1,5 +1,7 @@
1
1
  # OmniPath
2
2
  ```{toctree}
3
+ :maxdepth: 1
4
+
3
5
  licenses
4
6
  orthologs
5
7
  ```
@@ -1,5 +1,7 @@
1
1
  # Single-cell
2
2
  ```{toctree}
3
+ :maxdepth: 1
4
+
3
5
  rna_sc
4
6
  rna_psbk
5
7
  rna_pstime
@@ -1,4 +1,6 @@
1
1
  # Spatial
2
2
  ```{toctree}
3
+ :maxdepth: 1
4
+
3
5
  rna_visium
4
6
  ```
@@ -4,7 +4,7 @@ requires = [ "hatchling" ]
4
4
 
5
5
  [project]
6
6
  name = "decoupler"
7
- version = "2.0.0"
7
+ version = "2.0.2"
8
8
  description = "Python package to perform enrichment analysis from omics data."
9
9
  readme = "README.md"
10
10
  license = { file = "LICENSE" }
@@ -27,6 +27,7 @@ dependencies = [
27
27
  "numba",
28
28
  "docrep",
29
29
  "tqdm",
30
+ "ipywidgets",
30
31
  "xgboost",
31
32
  "seaborn",
32
33
  "requests",
@@ -4,6 +4,7 @@ import pandas as pd
4
4
  import numpy as np
5
5
  from anndata import AnnData
6
6
 
7
+ from decoupler._docs import docs
7
8
  from decoupler._log import _log
8
9
  from decoupler.pp.net import prune
9
10
  from decoupler.mt._methods import _methods
@@ -151,6 +152,9 @@ def _metric_scores(
151
152
  verbose: bool,
152
153
  **kwargs
153
154
  ) -> None:
155
+ assert isinstance(metrics, (str, list)), 'metrics must be str or list'
156
+ if isinstance(metrics, str):
157
+ metrics = [metrics]
154
158
  if runby == 'expr':
155
159
  m = ('benchmark - evaluating by experiment on:\n' +
156
160
  f'n_expr={score.shape[0]}, n_sources={score.shape[1]} across metrics={metrics}')
@@ -277,6 +281,7 @@ def _eval_scores(
277
281
  return df
278
282
 
279
283
 
284
+ @docs.dedent
280
285
  def benchmark(
281
286
  adata: AnnData,
282
287
  net: pd.DataFrame | dict,
@@ -295,6 +300,24 @@ def benchmark(
295
300
 
296
301
  Parameters
297
302
  ----------
303
+ %(adata)s
304
+ %(net)s
305
+ metrics
306
+ Which metrics to use to evaluate classification performance.
307
+ groupby
308
+ Whether to group experiments by a metadata column in ``anndata.AnnData.obs``.
309
+ runby
310
+ Whether to evaluate performances at the experiment (``"expr"``) or at the source (``"source"``) level.
311
+ sfilt
312
+ Whether to fitler out sources in net for which there are not perturbation data.
313
+ thr
314
+ Threshold of significance.
315
+ Methods that generate no p-value will be consider significant if the ``thr`` > :math:`1 - quantile`
316
+ emin
317
+ Minimum number of experiments per group.
318
+ %(verbose)s
319
+ kws_decouple
320
+ Keyword arguments to pass to ``decoupler.mt.decouple``.
298
321
 
299
322
  Returns
300
323
  -------
@@ -63,16 +63,13 @@ def auprc(
63
63
  # Compute prc
64
64
  ps = tps + fps
65
65
  msk = ps != 0
66
- if pi0 > 0 and pi0 < 1:
67
- # Siblini W., Fréry J., He-Guelton L., Oblé F., Wang YQ. (2020) Master
68
- # Your Metrics with Calibration. In: Berthold M., Feelders A., Krempl G.
69
- # (eds) Advances in Intelligent Data Analysis XVIII. IDA 2020. Lecture
70
- # Notes in Computer Science, vol 12080. Springer, Cham
71
- pi = np.sum(y_true) / y_true.size
72
- ratio = pi * (1 - pi0) / (pi0 * (1 - pi))
73
- prc = tps[msk] / (tps[msk] + ratio * fps[msk])
74
- else:
75
- prc = np.divide(tps[msk], ps[msk])
66
+ # Siblini W., Fréry J., He-Guelton L., Oblé F., Wang YQ. (2020) Master
67
+ # Your Metrics with Calibration. In: Berthold M., Feelders A., Krempl G.
68
+ # (eds) Advances in Intelligent Data Analysis XVIII. IDA 2020. Lecture
69
+ # Notes in Computer Science, vol 12080. Springer, Cham
70
+ pi = np.sum(y_true) / y_true.size
71
+ ratio = pi * (1 - pi0) / (pi0 * (1 - pi))
72
+ prc = tps[msk] / (tps[msk] + ratio * fps[msk])
76
73
  # Compute rcl
77
74
  rcl = tps / tps[-1]
78
75
  # Flip and add limits
@@ -94,6 +91,8 @@ def auc(
94
91
  """
95
92
  # Normalize to make comparable
96
93
  norm = np.nanmax(np.abs(y_score), axis=1)
94
+ msk = norm == 0.
95
+ norm[msk] = 1.
97
96
  y_score = y_score / norm.reshape(-1, 1)
98
97
  assert ((-1. <= y_score) & (y_score <= 1.)).all()
99
98
  # Flatten and remove nans
@@ -1,6 +1,7 @@
1
1
  import pandas as pd
2
2
  import numpy as np
3
3
 
4
+ from decoupler._docs import docs
4
5
  from decoupler.bm.pl._format import _format
5
6
 
6
7
 
@@ -17,6 +18,7 @@ def _hmean(
17
18
  return h
18
19
 
19
20
 
21
+ @docs.dedent
20
22
  def hmean(
21
23
  df: pd.DataFrame,
22
24
  metrics: str | list = ['auc', 'fscore', 'qrank'],
@@ -38,6 +40,12 @@ def hmean(
38
40
  -------
39
41
  Dataframe containing the harmonic mean per metric.
40
42
  """
43
+ # Validate
44
+ assert isinstance(df, pd.DataFrame), 'df must be pandas.DataFrame'
45
+ assert isinstance(metrics, (str, list)), 'metrics must be str or list'
46
+ if isinstance(metrics, str):
47
+ metrics = [metrics]
48
+ # Run
41
49
  d_metrics = {
42
50
  'auc': {
43
51
  'name': 'H(auroc, auprc)',
@@ -61,7 +69,6 @@ def hmean(
61
69
  # Compute harmonic mean
62
70
  name = d_metrics[metric]['name']
63
71
  tmp[name] = _hmean(tmp[cols[0]], tmp[cols[1]], beta=beta)
64
- #tmp = tmp.drop(columns=cols)
65
72
  if i == 0:
66
73
  hdf.append(tmp)
67
74
  else:
@@ -64,7 +64,7 @@ def _func_aucell(
64
64
  n_up: int | float | None = None,
65
65
  verbose: bool = False,
66
66
  ) -> Tuple[np.ndarray, None]:
67
- """
67
+ r"""
68
68
  Area Under the Curve for set enrichment within single cells (AUCell) :cite:`aucell`.
69
69
 
70
70
  Given a ranked list of features per observation, AUCell calculates the AUC by measuring how early the features in
@@ -60,13 +60,45 @@ def _mean_zscores(
60
60
  return cons
61
61
 
62
62
 
63
+ @docs.dedent
63
64
  def consensus(
64
65
  result: dict | AnnData,
65
66
  verbose: bool = False,
66
67
  ) -> Tuple[pd.DataFrame, pd.DataFrame] | None:
67
- """
68
+ r"""
68
69
  Consensus score across methods.
69
70
 
71
+ For each method, enrichment scores are split into positive and negative subsets
72
+ and transformed independently into z-scores.
73
+
74
+ 1. Subset values based on sign (direction).
75
+ 2. Mirror each subset into positive and negative values with the same magnitude.
76
+ 3. Compute z-scores for each subset: :math:`z_i = \frac{x_i - \mu}{\sigma}`.
77
+ 4. Restore the original signs to the z-scored values
78
+
79
+ This transformation ensures comparability across methods while preserving the
80
+ biological interpretation of activation (positive) and inhibition (negative).
81
+ The final consensus enrichment score :math:`ES` is computed as the mean of
82
+ these signed z-scores across methods.
83
+
84
+ .. math::
85
+
86
+ ES = \frac{\sum_{m=1}^{M} z_{i}^{(m)}}{M}
87
+
88
+ Where:
89
+
90
+ - :math:`M` is the number of methods
91
+ - :math:`z_{i}^{(m)}` is the z-score from method :math:`m`.
92
+
93
+ A two-sided :math:`p_{value}` is then calculated from the consensus score using
94
+ the survival function :math:`sf` of the standard normal distribution.
95
+
96
+ .. math::
97
+
98
+ p = 2 \times \mathrm{sf}\bigl(\lvert \mathrm{ES} \rvert \bigr)
99
+
100
+ %(yestest)s
101
+
70
102
  Parameters
71
103
  ----------
72
104
  result
@@ -198,7 +198,7 @@ def _func_gsea(
198
198
 
199
199
  ES = L_{arg max |L|}
200
200
 
201
- When multiple random permutations are done, statistical significance is assessed via empirical testing.
201
+ When multiple random permutations are done (``times > 1``), statistical significance is assessed via empirical testing.
202
202
 
203
203
  .. math::
204
204
 
@@ -220,7 +220,7 @@ def _func_gsea(
220
220
  - :math:`\mu{+}` is the mean of positive values in :math:`ES_{rand}`
221
221
  - :math:`\mu{-}` is the mean of negative values in :math:`ES_{rand}`
222
222
 
223
- Finally, the obtained math:`p_value` are adjusted by Benjamini-Hochberg correction.
223
+ %(yestest)s
224
224
 
225
225
  %(params)s
226
226
  %(times)s
@@ -1,9 +1,12 @@
1
+ import warnings
1
2
  from typing import Tuple
2
3
 
3
4
  import numpy as np
4
5
  import scipy.sparse as sps
5
6
  from tqdm.auto import tqdm
6
- from xgboost import XGBRegressor
7
+ with warnings.catch_warnings():
8
+ warnings.filterwarnings("ignore", category=FutureWarning, module="xgboost")
9
+ from xgboost import XGBRegressor
7
10
 
8
11
  from decoupler._docs import docs
9
12
  from decoupler._log import _log
@@ -176,7 +176,7 @@ def _func_ora(
176
176
  .. figure:: /_static/images/ora.png
177
177
  :alt: Over Representation Analysis (ORA) schematic.
178
178
  :align: center
179
- :width: 75%
179
+ :width: 100%
180
180
 
181
181
  Over Representation Analysis (ORA) scheme.
182
182
 
@@ -1,9 +1,12 @@
1
+ import warnings
1
2
  from typing import Tuple
2
3
 
3
4
  import numpy as np
4
5
  import scipy.sparse as sps
5
6
  from tqdm.auto import tqdm
6
- from xgboost import XGBRegressor
7
+ with warnings.catch_warnings():
8
+ warnings.filterwarnings("ignore", category=FutureWarning, module="xgboost")
9
+ from xgboost import XGBRegressor
7
10
 
8
11
  from decoupler._docs import docs
9
12
  from decoupler._log import _log