diff --git a/.github/workflows/updt_markdowns.yml b/.github/workflows/updt_markdowns.yml index 4e0d76b..8911149 100644 --- a/.github/workflows/updt_markdowns.yml +++ b/.github/workflows/updt_markdowns.yml @@ -28,7 +28,7 @@ jobs: - name: Install docs dependencies run: | python -m pip install --upgrade pip - pip install ".[docs]" sphinx-markdown-builder==0.6.9 + pip install ".[docs,all]" sphinx-markdown-builder==0.6.9 - name: Build markdown docs working-directory: docs diff --git a/.readthedocs.yaml b/.readthedocs.yaml index fe3b295..bb9584b 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -32,3 +32,4 @@ python: path: . extra_requirements: - docs + - all diff --git a/docs/api_examples/batch_correction.ipynb b/docs/api_examples/batch_correction.ipynb index cf06849..abd7668 100644 --- a/docs/api_examples/batch_correction.ipynb +++ b/docs/api_examples/batch_correction.ipynb @@ -27,7 +27,7 @@ }, "outputs": [], "source": [ - "%pip install acore" + "%pip install acore vuecore" ] }, { diff --git a/docs/api_examples/batch_correction.py b/docs/api_examples/batch_correction.py index 158dc70..2254d17 100644 --- a/docs/api_examples/batch_correction.py +++ b/docs/api_examples/batch_correction.py @@ -6,7 +6,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.19.1 +# jupytext_version: 1.19.3 # kernelspec: # display_name: Python 3 (ipykernel) # language: python @@ -24,7 +24,7 @@ # %% tags=["hide-output"] -# %pip install acore +# %pip install acore vuecore # %% tags=["hide-input"] from typing import Optional diff --git a/docs/api_examples/diff_regulation_ancova.ipynb b/docs/api_examples/diff_regulation_ancova.ipynb index bca0a8b..b9c4004 100644 --- a/docs/api_examples/diff_regulation_ancova.ipynb +++ b/docs/api_examples/diff_regulation_ancova.ipynb @@ -32,7 +32,7 @@ }, "outputs": [], "source": [ - "%pip install acore" + "%pip install acore vuecore" ] }, { diff --git a/docs/api_examples/diff_regulation_ancova.py b/docs/api_examples/diff_regulation_ancova.py index 19ece88..c02d381 100644 --- a/docs/api_examples/diff_regulation_ancova.py +++ b/docs/api_examples/diff_regulation_ancova.py @@ -6,7 +6,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.19.1 +# jupytext_version: 1.19.3 # --- # %% [markdown] @@ -27,7 +27,7 @@ # # %% tags=["hide-output"] -# %pip install acore +# %pip install acore vuecore # %% tags=["hide-input"] import dsp_pandas diff --git a/docs/api_examples/diff_regulation_anova_ttest_two_groups.ipynb b/docs/api_examples/diff_regulation_anova_ttest_two_groups.ipynb index a6e4cb7..57ac583 100644 --- a/docs/api_examples/diff_regulation_anova_ttest_two_groups.ipynb +++ b/docs/api_examples/diff_regulation_anova_ttest_two_groups.ipynb @@ -29,7 +29,7 @@ }, "outputs": [], "source": [ - "%pip install acore" + "%pip install acore vuecore" ] }, { diff --git a/docs/api_examples/diff_regulation_anova_ttest_two_groups.py b/docs/api_examples/diff_regulation_anova_ttest_two_groups.py index 5a3d96b..ba0b817 100644 --- a/docs/api_examples/diff_regulation_anova_ttest_two_groups.py +++ b/docs/api_examples/diff_regulation_anova_ttest_two_groups.py @@ -6,7 +6,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.19.1 +# jupytext_version: 1.19.3 # kernelspec: # display_name: .venv # language: python @@ -29,7 +29,7 @@ # # %% tags=["hide-output"] -# %pip install acore +# %pip install acore vuecore # %% tags=["hide-input"] import dsp_pandas diff --git a/docs/api_examples/enrichment_analysis.ipynb b/docs/api_examples/enrichment_analysis.ipynb index c3564ab..f507881 100644 --- a/docs/api_examples/enrichment_analysis.ipynb +++ b/docs/api_examples/enrichment_analysis.ipynb @@ -32,7 +32,8 @@ }, "outputs": [], "source": [ - "%pip install acore vuecore" + "# ToDo: Improve VueCore dependencies\n", + "%pip install acore vuecore python-louvain snfpy" ] }, { diff --git a/docs/api_examples/enrichment_analysis.py b/docs/api_examples/enrichment_analysis.py index c7d7f34..e89b4be 100644 --- a/docs/api_examples/enrichment_analysis.py +++ b/docs/api_examples/enrichment_analysis.py @@ -14,7 +14,8 @@ # %% tags=["hide-output"] -# %pip install acore vuecore +# ToDo: Improve VueCore dependencies +# %pip install acore vuecore python-louvain snfpy # %% from pathlib import Path diff --git a/docs/api_examples/imputation.ipynb b/docs/api_examples/imputation.ipynb index aacec18..09631b9 100644 --- a/docs/api_examples/imputation.ipynb +++ b/docs/api_examples/imputation.ipynb @@ -36,7 +36,7 @@ }, "outputs": [], "source": [ - "%pip install acore" + "%pip install acore vuecore" ] }, { diff --git a/docs/api_examples/imputation.py b/docs/api_examples/imputation.py index d92afde..41b57e4 100644 --- a/docs/api_examples/imputation.py +++ b/docs/api_examples/imputation.py @@ -33,7 +33,7 @@ # %% tags=["hide-output"] -# %pip install acore +# %pip install acore vuecore # %% tags=["hide-input"] from typing import Optional diff --git a/docs/api_examples/normalization_analysis.ipynb b/docs/api_examples/normalization_analysis.ipynb index e4bdb33..40c82c2 100644 --- a/docs/api_examples/normalization_analysis.ipynb +++ b/docs/api_examples/normalization_analysis.ipynb @@ -31,7 +31,7 @@ }, "outputs": [], "source": [ - "%pip install acore" + "%pip install acore vuecore" ] }, { diff --git a/docs/api_examples/normalization_analysis.py b/docs/api_examples/normalization_analysis.py index 004d5e8..76ab9c3 100644 --- a/docs/api_examples/normalization_analysis.py +++ b/docs/api_examples/normalization_analysis.py @@ -6,7 +6,7 @@ # extension: .py # format_name: percent # format_version: '1.3' -# jupytext_version: 1.18.1 +# jupytext_version: 1.19.3 # kernelspec: # display_name: Python 3 (ipykernel) # language: python @@ -23,7 +23,7 @@ # Refers to the [`acore.normalization`](acore.normalization) module. # %% tags=["hide-output"] -# %pip install acore +# %pip install acore vuecore # %% tags=["hide-input"] from typing import Optional diff --git a/pyproject.toml b/pyproject.toml index b6f5336..c0842bb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,26 +23,24 @@ classifiers = [ dependencies = [ "numpy", + # pandas stuff "pandas", - "dsp-pandas", # has only pandas related dependencies - "vuecore", + "dsp-pandas", # https://github.com/biosustain/dsp_pandas (import dsp_pandas) + # scientific computing "scipy", "scikit-learn>=1.5", - "networkx", - "biopython", - "combat", + # enrichment analysis dependencies "gseapy!=1.1.5", - "kmapper", - "lifelines", - "pingouin<0.6.0", # ToDo: update column name changes, https://pingouin-stats.org/changelog.html#v0-6-0-february-2026 - "python-louvain", - "PyWGCNA!=2.2.0", # to fix. - "snfpy", + "pingouin<0.6.0", # ToDo: update column name changes, https://pingouin-stats.org/changelog.html#v0-6-0-february-2026 "umap-learn", "statsmodels", - "inmoose", # combat batch correction + # batch correction dependencies + "combat", + "inmoose", # combat batch correction + # io dependencies "requests", "rarfile", + # types "pandera", ] @@ -56,6 +54,8 @@ docs = [ "jupytext", "sphinx-copybutton", "sphinx-llms-txt", + # Multi-Omics-Analysis group package for visualisation of results in the documentation + "vuecore", ] dev = [ "black[jupyter]", @@ -70,6 +70,21 @@ dev = [ "ipykernel", ] +all = [ # Optional dependencies for all non-core analysis modules + # Publication analysis dependencies + "biopython", + # Topological Data Analysis + # network analysis dependencies + "python-louvain", # community detection for network analysis (import community) + "networkx", + # "PyWGCNA!=2.2.0", # not used? + # Kaplan-Meier-analysis dependencies + "lifelines", + "kmapper", + # network_analysis dependencies + "snfpy", +] + [project.urls] Homepage = "https://github.com/Multiomics-Analytics-Group/acore" Issues = "https://github.com/Multiomics-Analytics-Group/acore/issues" diff --git a/src/acore/__init__.py b/src/acore/__init__.py index e006f26..f783630 100644 --- a/src/acore/__init__.py +++ b/src/acore/__init__.py @@ -2,5 +2,32 @@ import dsp_pandas # sets up pandas formatting options -__all__ = ["dsp_pandas"] +from . import ( + batch_correction, + decomposition, + enrichment_analysis, + exploratory_analysis, + filter_metabolomics, + imputation_analysis, + io, + multiple_testing, + normalization, + types, + utils, +) + +__all__ = [ + "dsp_pandas", + "decomposition", + "imputation_analysis", + "io", + "enrichment_analysis", + "filter_metabolomics", + "batch_correction", + "exploratory_analysis", + "multiple_testing", + "normalization", + "types", + "utils", +] __version__ = version("acore") diff --git a/src/acore/kaplan_meier_analysis/__init__.py b/src/acore/kaplan_meier_analysis/__init__.py index 2fd8e2b..3e8739a 100644 --- a/src/acore/kaplan_meier_analysis/__init__.py +++ b/src/acore/kaplan_meier_analysis/__init__.py @@ -1,6 +1,14 @@ import pandas as pd -from lifelines import KaplanMeierFitter, NelsonAalenFitter -from lifelines.statistics import multivariate_logrank_test + +try: + from lifelines import KaplanMeierFitter, NelsonAalenFitter + from lifelines.statistics import multivariate_logrank_test +except ImportError as e: + raise ImportError( + "Error importing lifelines module. Make sure lifelines is installed. " + "Install it with: pip install 'acore[all]'" + f"\n\nError: {e}" + ) from e def get_data_ready_for_km(dfs_dict, args): diff --git a/src/acore/network_analysis/__init__.py b/src/acore/network_analysis/__init__.py index a19ab52..b2c7def 100644 --- a/src/acore/network_analysis/__init__.py +++ b/src/acore/network_analysis/__init__.py @@ -1,7 +1,15 @@ -import community -import networkx as nx +try: + import community + import networkx as nx + import snf +except ImportError as e: + raise ImportError( + "Error importing network analysis dependencies (community/python-louvain, networkx, snf/snfpy). " + "Install them with: pip install 'acore[all]'" + f"\n\nError: {e}" + ) from e + import pandas as pd -import snf from sklearn import cluster from sklearn.cluster import AffinityPropagation diff --git a/src/acore/publications_analysis/__init__.py b/src/acore/publications_analysis/__init__.py index e7fc4d0..8881b94 100644 --- a/src/acore/publications_analysis/__init__.py +++ b/src/acore/publications_analysis/__init__.py @@ -1,7 +1,16 @@ from urllib import error import pandas as pd -from Bio import Entrez, Medline + +try: + from Bio import Entrez, Medline +except ImportError as e: + raise ImportError( + "Error importing Bio modules. Make sure biopython is installed. " + "Install it with: pip install biopython" + f"\n\nError: {e}" + ) from e + # TODO: This should probably be changed to the email of the person installing ckg? Entrez.email = "kg@dtu.dk" diff --git a/src/acore/tda_analysis/__init__.py b/src/acore/tda_analysis/__init__.py index f5da97b..d8b5bc1 100644 --- a/src/acore/tda_analysis/__init__.py +++ b/src/acore/tda_analysis/__init__.py @@ -1,4 +1,11 @@ -import kmapper as km +try: + import kmapper as km +except ImportError as e: + raise ImportError( + "Error importing kmapper module. Make sure kmapper is installed. " + "Install it with: pip install 'acore[all]'" + f"\n\nError: {e}" + ) from e import numpy as np from sklearn import cluster, ensemble diff --git a/src/acore/wgcna_analysis.py b/src/acore/wgcna_analysis.py index e69de29..0a9ab4b 100644 --- a/src/acore/wgcna_analysis.py +++ b/src/acore/wgcna_analysis.py @@ -0,0 +1 @@ +# TODO: only here for vuecore compatibility