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.
- {decoupler-2.0.0 → decoupler-2.0.2}/.github/workflows/test.yaml +3 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/CHANGELOG.md +4 -4
- {decoupler-2.0.0 → decoupler-2.0.2}/LICENSE +1 -1
- {decoupler-2.0.0 → decoupler-2.0.2}/PKG-INFO +4 -3
- {decoupler-2.0.0 → decoupler-2.0.2}/README.md +1 -1
- decoupler-2.0.2/docs/api/bm.md +44 -0
- decoupler-2.0.2/docs/api/ds.md +48 -0
- decoupler-2.0.2/docs/api/index.md +24 -0
- decoupler-2.0.2/docs/api/mt.md +34 -0
- decoupler-2.0.2/docs/api/op.md +28 -0
- decoupler-2.0.2/docs/api/pl.md +23 -0
- decoupler-2.0.2/docs/api/pp.md +40 -0
- decoupler-2.0.2/docs/api/tl.md +13 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/docs/index.md +1 -1
- {decoupler-2.0.0 → decoupler-2.0.2}/docs/notebooks/bench/index.md +2 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/docs/notebooks/bulk/index.md +2 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/docs/notebooks/index.md +2 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/docs/notebooks/omnipath/index.md +2 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/docs/notebooks/scell/index.md +2 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/docs/notebooks/spatial/index.md +2 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/pyproject.toml +2 -1
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/bm/_run.py +23 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/bm/metric/_auc.py +9 -10
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/bm/metric/_hmean.py +8 -1
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/mt/_aucell.py +1 -1
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/mt/_consensus.py +33 -1
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/mt/_gsea.py +2 -2
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/mt/_mdt.py +4 -1
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/mt/_ora.py +1 -1
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/mt/_udt.py +4 -1
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/mt/_viper.py +92 -1
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/mt/_waggr.py +47 -1
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/mt/_zscore.py +34 -2
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/pl/_leading_edge.py +15 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/pl/_order.py +4 -4
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/pl/_order_targets.py +6 -4
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/pl/_volcano.py +2 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/pp/anndata.py +20 -16
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/tl/_rankby_order.py +5 -1
- decoupler-2.0.2/tests/bm/test_benchmark.py +59 -0
- decoupler-2.0.2/tests/bm/test_pl.py +89 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/conftest.py +7 -0
- decoupler-2.0.2/tests/mt/test_decouple.py +34 -0
- decoupler-2.0.2/tests/pl/test_Plotter.py +26 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/pl/test_barplot.py +5 -3
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/pl/test_order_targets.py +1 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/pp/test_anndata.py +24 -2
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/pp/test_data.py +8 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/tl/test_rankby_obsm.py +3 -0
- decoupler-2.0.0/docs/api.md +0 -188
- decoupler-2.0.0/tests/mt/test_decouple.py +0 -26
- {decoupler-2.0.0 → decoupler-2.0.2}/.codecov.yaml +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/.cruft.json +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/.editorconfig +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/.github/workflows/build.yaml +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/.github/workflows/release.yaml +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/.gitignore +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/.pre-commit-config.yaml +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/.readthedocs.yaml +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/.vscode/extensions.json +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/.vscode/launch.json +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/.vscode/settings.json +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/biome.jsonc +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/docs/_static/.gitkeep +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/docs/_static/css/custom.css +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/docs/_static/images/logo.png +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/docs/_static/images/mlm.png +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/docs/_static/images/ora.png +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/docs/_static/images/ulm.png +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/docs/_templates/.gitkeep +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/docs/_templates/autosummary/class.rst +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/docs/changelog.md +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/docs/conf.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/docs/extensions/typed_returns.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/docs/notebooks/bench/rna.ipynb +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/docs/notebooks/bulk/rna.ipynb +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/docs/notebooks/example.ipynb +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/docs/notebooks/omnipath/licenses.ipynb +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/docs/notebooks/omnipath/orthologs.ipynb +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/docs/notebooks/scell/rna_psbk.ipynb +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/docs/notebooks/scell/rna_pstime.ipynb +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/docs/notebooks/scell/rna_sc.ipynb +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/docs/notebooks/spatial/rna_visium.ipynb +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/docs/references.bib +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/docs/references.md +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/_Method.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/_Plotter.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/__init__.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/_datatype.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/_docs.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/_download.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/_log.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/bm/__init__.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/bm/_pp.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/bm/metric/__init__.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/bm/metric/_fscore.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/bm/metric/_qrank.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/bm/pl/__init__.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/bm/pl/_auc.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/bm/pl/_bar.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/bm/pl/_format.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/bm/pl/_fscore.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/bm/pl/_qrank.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/bm/pl/_summary.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/ds/__init__.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/ds/_bulk.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/ds/_scell.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/ds/_spatial.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/ds/_toy.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/ds/_utils.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/mt/__init__.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/mt/_decouple.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/mt/_gsva.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/mt/_methods.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/mt/_mlm.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/mt/_run.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/mt/_ulm.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/op/__init__.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/op/_collectri.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/op/_dorothea.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/op/_dtype.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/op/_hallmark.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/op/_progeny.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/op/_resource.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/op/_translate.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/pl/__init__.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/pl/_barplot.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/pl/_dotplot.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/pl/_filter_by_expr.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/pl/_filter_by_prop.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/pl/_filter_samples.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/pl/_network.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/pl/_obsbar.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/pl/_obsm.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/pl/_source_targets.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/pp/__init__.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/pp/data.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/pp/net.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/tl/__init__.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/tl/_rankby_group.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/src/decoupler/tl/_rankby_obsm.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/ds/test_bulk.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/ds/test_scell.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/ds/test_spatial.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/ds/test_toy.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/ds/test_utils.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/mt/test_aucell.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/mt/test_consensus.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/mt/test_gsea.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/mt/test_gsva.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/mt/test_mdt.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/mt/test_methods.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/mt/test_mlm.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/mt/test_ora.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/mt/test_run.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/mt/test_udt.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/mt/test_ulm.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/mt/test_viper.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/mt/test_waggr.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/mt/test_zscore.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/op/test_collectri.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/op/test_dorothea.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/op/test_dtype.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/op/test_hallmark.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/op/test_progeny.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/op/test_resource.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/op/test_translate.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/pl/test_dotplot.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/pl/test_filter_by_expr.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/pl/test_filter_by_prop.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/pl/test_filter_samples.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/pl/test_leading_edge.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/pl/test_network.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/pl/test_obsbar.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/pl/test_obsm.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/pl/test_order.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/pl/test_source_targets.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/pl/test_volcano.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/pp/test_net.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/test_download.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/test_version.py +0 -0
- {decoupler-2.0.0 → decoupler-2.0.2}/tests/tl/test_rankby_group.py +0 -0
- {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
|
|
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
|
-
-
|
|
24
|
-
- `mdt` and `udt` are now based on `xgboost` instead of `sklearn` for better scalability. `udt` statistic is now the coefficient of determination
|
|
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
|
|
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
|
Metadata-Version: 2.4
|
|
2
2
|
Name: decoupler
|
|
3
|
-
Version: 2.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,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
|
+
```
|
|
@@ -4,7 +4,7 @@ requires = [ "hatchling" ]
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "decoupler"
|
|
7
|
-
version = "2.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
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
@@ -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
|
-
|
|
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
|