ln-ttest 0.1.0__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.
ln_ttest-0.1.0/LICENSE ADDED
@@ -0,0 +1,29 @@
1
+ BSD 3-Clause License
2
+
3
+ Copyright (c) 2026, Oskar Kviman and Pedro F. Ferreira
4
+ All rights reserved.
5
+
6
+ Redistribution and use in source and binary forms, with or without
7
+ modification, are permitted provided that the following conditions are met:
8
+
9
+ 1. Redistributions of source code must retain the above copyright notice, this
10
+ list of conditions and the following disclaimer.
11
+
12
+ 2. Redistributions in binary form must reproduce the above copyright notice,
13
+ this list of conditions and the following disclaimer in the documentation
14
+ and/or other materials provided with the distribution.
15
+
16
+ 3. Neither the name of the copyright holder nor the names of its
17
+ contributors may be used to endorse or promote products derived from
18
+ this software without specific prior written permission.
19
+
20
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
24
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
26
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
27
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,85 @@
1
+ Metadata-Version: 2.4
2
+ Name: ln-ttest
3
+ Version: 0.1.0
4
+ Summary: LN's t-test: differential expression testing on an asymptotically unbiased log-fold-change estimator
5
+ Author: Oskar Kviman, Pedro F. Ferreira
6
+ Maintainer-email: "Pedro F. Ferreira" <pedro.miguel.ferreira.pf@gmail.com>
7
+ License: BSD 3-Clause License
8
+
9
+ Copyright (c) 2026, Oskar Kviman and Pedro F. Ferreira
10
+ All rights reserved.
11
+
12
+ Redistribution and use in source and binary forms, with or without
13
+ modification, are permitted provided that the following conditions are met:
14
+
15
+ 1. Redistributions of source code must retain the above copyright notice, this
16
+ list of conditions and the following disclaimer.
17
+
18
+ 2. Redistributions in binary form must reproduce the above copyright notice,
19
+ this list of conditions and the following disclaimer in the documentation
20
+ and/or other materials provided with the distribution.
21
+
22
+ 3. Neither the name of the copyright holder nor the names of its
23
+ contributors may be used to endorse or promote products derived from
24
+ this software without specific prior written permission.
25
+
26
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
27
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
29
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
30
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
32
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
33
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
34
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36
+
37
+ Project-URL: Homepage, https://github.com/okviman/lntest
38
+ Project-URL: Source, https://github.com/okviman/lntest
39
+ Keywords: single-cell,differential-expression,transcriptomics,scanpy
40
+ Classifier: Development Status :: 4 - Beta
41
+ Classifier: Intended Audience :: Science/Research
42
+ Classifier: License :: OSI Approved :: BSD License
43
+ Classifier: Programming Language :: Python :: 3
44
+ Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
45
+ Requires-Python: >=3.10
46
+ Description-Content-Type: text/markdown
47
+ License-File: LICENSE
48
+ Requires-Dist: numpy>=1.23
49
+ Requires-Dist: scipy>=1.9
50
+ Requires-Dist: statsmodels>=0.13
51
+ Provides-Extra: test
52
+ Requires-Dist: anndata>=0.9; extra == "test"
53
+ Requires-Dist: pandas>=1.5; extra == "test"
54
+ Requires-Dist: scanpy>=1.10; extra == "test"
55
+ Requires-Dist: pytest>=7; extra == "test"
56
+ Provides-Extra: anndata
57
+ Dynamic: license-file
58
+
59
+ # LN's $t$-test
60
+
61
+ Differential expression testing on an asymptotically unbiased log-fold-change estimator.
62
+
63
+ ## Installation
64
+
65
+ ```bash
66
+ pip install ln-ttest
67
+ ```
68
+
69
+ From a checkout:
70
+
71
+ ```bash
72
+ pip install -e .
73
+ ```
74
+
75
+ ## Usage
76
+
77
+ ```python
78
+ from lntest import rank_genes_groups_ln
79
+
80
+ rank_genes_groups_ln(adata, groupby="leiden", layer="norm_counts")
81
+ adata.uns["rank_genes_groups"]["logfoldchanges"]
82
+ adata.uns["rank_genes_groups"]["lfc_se"] # SE of the LFC; lfc ± 1.96·se is the interval
83
+ ```
84
+
85
+ Takes **normalised, not log-transformed** counts.
@@ -0,0 +1,27 @@
1
+ # LN's $t$-test
2
+
3
+ Differential expression testing on an asymptotically unbiased log-fold-change estimator.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ pip install ln-ttest
9
+ ```
10
+
11
+ From a checkout:
12
+
13
+ ```bash
14
+ pip install -e .
15
+ ```
16
+
17
+ ## Usage
18
+
19
+ ```python
20
+ from lntest import rank_genes_groups_ln
21
+
22
+ rank_genes_groups_ln(adata, groupby="leiden", layer="norm_counts")
23
+ adata.uns["rank_genes_groups"]["logfoldchanges"]
24
+ adata.uns["rank_genes_groups"]["lfc_se"] # SE of the LFC; lfc ± 1.96·se is the interval
25
+ ```
26
+
27
+ Takes **normalised, not log-transformed** counts.
@@ -0,0 +1,63 @@
1
+ [build-system]
2
+ requires = ["setuptools>=64", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ # The PyPI distribution name. It is NOT the import name, which stays `lntest`
7
+ # (see [tool.setuptools] below). PyPI rejected `lntest` as "too similar to an
8
+ # existing project" -- `intest` exists, and PyPI treats l/i/1 as confusable to
9
+ # block typosquatting. So: pip install ln-ttest, then `from lntest import ...`,
10
+ # the way scikit-learn installs and imports as sklearn.
11
+ name = "ln-ttest"
12
+ version = "0.1.0"
13
+ description = "LN's t-test: differential expression testing on an asymptotically unbiased log-fold-change estimator"
14
+ readme = "README.md"
15
+ requires-python = ">=3.10"
16
+ authors = [
17
+ { name = "Oskar Kviman" },
18
+ { name = "Pedro F. Ferreira" },
19
+ ]
20
+ maintainers = [
21
+ { name = "Pedro F. Ferreira", email = "pedro.miguel.ferreira.pf@gmail.com" },
22
+ ]
23
+ license = { file = "LICENSE" }
24
+ keywords = ["single-cell", "differential-expression", "transcriptomics", "scanpy"]
25
+ classifiers = [
26
+ "Development Status :: 4 - Beta",
27
+ "Intended Audience :: Science/Research",
28
+ "License :: OSI Approved :: BSD License",
29
+ "Programming Language :: Python :: 3",
30
+ "Topic :: Scientific/Engineering :: Bio-Informatics",
31
+ ]
32
+ dependencies = [
33
+ "numpy>=1.23",
34
+ "scipy>=1.9",
35
+ # For Benjamini-Hochberg, imported lazily inside the branch that uses it --
36
+ # the same arrangement scanpy has, which declares statsmodels>=0.14.5 and
37
+ # imports multipletests inside `_rank_genes_groups.py`. Correcting the same
38
+ # way scanpy does is worth more than shedding the dependency, and every
39
+ # scanpy user already has it.
40
+ "statsmodels>=0.13",
41
+ ]
42
+
43
+ [project.urls]
44
+ # The shared repository, not the fork this happens to be developed on.
45
+ # Renamed from DE-ZILN to lntest on 2026-09-11; the old URL still redirects, but
46
+ # a package's metadata should name the repository as it is.
47
+ Homepage = "https://github.com/okviman/lntest"
48
+ Source = "https://github.com/okviman/lntest"
49
+
50
+ [project.optional-dependencies]
51
+ # anndata and pandas are needed only to *build* the objects the wrapper is
52
+ # called with. The wrapper is duck-typed and never imports either, so they are
53
+ # test dependencies rather than runtime ones. scanpy is here so the corr_method
54
+ # tests can check we stay interchangeable with scanpy's own correction.
55
+ test = ["anndata>=0.9", "pandas>=1.5", "scanpy>=1.10", "pytest>=7"]
56
+ anndata = [] # kept as an accepted-but-empty alias; the extra is no longer needed
57
+
58
+ [tool.setuptools]
59
+ packages = ["lntest"]
60
+ package-dir = { "" = "src" }
61
+
62
+ [tool.pytest.ini_options]
63
+ testpaths = ["tests"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,85 @@
1
+ Metadata-Version: 2.4
2
+ Name: ln-ttest
3
+ Version: 0.1.0
4
+ Summary: LN's t-test: differential expression testing on an asymptotically unbiased log-fold-change estimator
5
+ Author: Oskar Kviman, Pedro F. Ferreira
6
+ Maintainer-email: "Pedro F. Ferreira" <pedro.miguel.ferreira.pf@gmail.com>
7
+ License: BSD 3-Clause License
8
+
9
+ Copyright (c) 2026, Oskar Kviman and Pedro F. Ferreira
10
+ All rights reserved.
11
+
12
+ Redistribution and use in source and binary forms, with or without
13
+ modification, are permitted provided that the following conditions are met:
14
+
15
+ 1. Redistributions of source code must retain the above copyright notice, this
16
+ list of conditions and the following disclaimer.
17
+
18
+ 2. Redistributions in binary form must reproduce the above copyright notice,
19
+ this list of conditions and the following disclaimer in the documentation
20
+ and/or other materials provided with the distribution.
21
+
22
+ 3. Neither the name of the copyright holder nor the names of its
23
+ contributors may be used to endorse or promote products derived from
24
+ this software without specific prior written permission.
25
+
26
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
27
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
29
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
30
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
32
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
33
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
34
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36
+
37
+ Project-URL: Homepage, https://github.com/okviman/lntest
38
+ Project-URL: Source, https://github.com/okviman/lntest
39
+ Keywords: single-cell,differential-expression,transcriptomics,scanpy
40
+ Classifier: Development Status :: 4 - Beta
41
+ Classifier: Intended Audience :: Science/Research
42
+ Classifier: License :: OSI Approved :: BSD License
43
+ Classifier: Programming Language :: Python :: 3
44
+ Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
45
+ Requires-Python: >=3.10
46
+ Description-Content-Type: text/markdown
47
+ License-File: LICENSE
48
+ Requires-Dist: numpy>=1.23
49
+ Requires-Dist: scipy>=1.9
50
+ Requires-Dist: statsmodels>=0.13
51
+ Provides-Extra: test
52
+ Requires-Dist: anndata>=0.9; extra == "test"
53
+ Requires-Dist: pandas>=1.5; extra == "test"
54
+ Requires-Dist: scanpy>=1.10; extra == "test"
55
+ Requires-Dist: pytest>=7; extra == "test"
56
+ Provides-Extra: anndata
57
+ Dynamic: license-file
58
+
59
+ # LN's $t$-test
60
+
61
+ Differential expression testing on an asymptotically unbiased log-fold-change estimator.
62
+
63
+ ## Installation
64
+
65
+ ```bash
66
+ pip install ln-ttest
67
+ ```
68
+
69
+ From a checkout:
70
+
71
+ ```bash
72
+ pip install -e .
73
+ ```
74
+
75
+ ## Usage
76
+
77
+ ```python
78
+ from lntest import rank_genes_groups_ln
79
+
80
+ rank_genes_groups_ln(adata, groupby="leiden", layer="norm_counts")
81
+ adata.uns["rank_genes_groups"]["logfoldchanges"]
82
+ adata.uns["rank_genes_groups"]["lfc_se"] # SE of the LFC; lfc ± 1.96·se is the interval
83
+ ```
84
+
85
+ Takes **normalised, not log-transformed** counts.
@@ -0,0 +1,14 @@
1
+ LICENSE
2
+ README.md
3
+ pyproject.toml
4
+ src/ln_ttest.egg-info/PKG-INFO
5
+ src/ln_ttest.egg-info/SOURCES.txt
6
+ src/ln_ttest.egg-info/dependency_links.txt
7
+ src/ln_ttest.egg-info/requires.txt
8
+ src/ln_ttest.egg-info/top_level.txt
9
+ src/lntest/__init__.py
10
+ src/lntest/_ln_test.py
11
+ src/lntest/_rank_genes_groups.py
12
+ tests/test_corr_method.py
13
+ tests/test_lntest.py
14
+ tests/test_scanpy_wrapper.py
@@ -0,0 +1,11 @@
1
+ numpy>=1.23
2
+ scipy>=1.9
3
+ statsmodels>=0.13
4
+
5
+ [anndata]
6
+
7
+ [test]
8
+ anndata>=0.9
9
+ pandas>=1.5
10
+ scanpy>=1.10
11
+ pytest>=7
@@ -0,0 +1 @@
1
+ lntest
@@ -0,0 +1,60 @@
1
+ """LN's t-test: differential expression on an asymptotically unbiased log-fold-change estimator.
2
+
3
+ from lntest import get_LN_lfcs, rank_genes_groups_ln
4
+
5
+ This module is the whole public surface. The two implementation modules are
6
+ private, following scanpy, which keeps ``rank_genes_groups`` in
7
+ ``scanpy/tools/_rank_genes_groups.py`` and exposes only the name.
8
+
9
+ ``_rank_genes_groups`` was called ``scanpy_wrapper`` until 2026-09-10. The name
10
+ was wrong in both directions: the module never imports scanpy, so it wraps
11
+ nothing, and if scanpy ever dispatches to this package then scanpy is the
12
+ wrapper, not us. It is scanpy-*shaped*, which is what its new name says.
13
+
14
+ Everything here imports eagerly, and can, because the package depends on numpy,
15
+ scipy and statsmodels alone -- and statsmodels only inside the Benjamini-Hochberg
16
+ branch that needs it, which is again what scanpy does.
17
+ """
18
+ from __future__ import annotations
19
+
20
+ from ._ln_test import (
21
+ TRIGAMMA_EXACT,
22
+ TRIGAMMA_RECOMB25,
23
+ get_LN_lfcs,
24
+ get_LN_lfcs_sparse,
25
+ trigamma_diff_int,
26
+ trigamma_diff_recomb25,
27
+ )
28
+ from ._rank_genes_groups import CORR_METHODS, rank_genes_groups_ln
29
+
30
+ def _detect_version() -> str:
31
+ # Scoped in a function so importlib.metadata's names do not land in the
32
+ # package namespace; `dir(lntest)` should show the API and nothing else.
33
+ try: # pragma: no cover - fails only for a tree with no installed metadata
34
+ from importlib.metadata import version
35
+
36
+ # The distribution name, not this module's name. They differ: PyPI
37
+ # rejected "lntest" as too close to the existing "intest".
38
+ return version("ln-ttest")
39
+ except Exception:
40
+ return "0.0.0.dev0"
41
+
42
+
43
+ __version__ = _detect_version()
44
+ del _detect_version
45
+
46
+ __all__ = [
47
+ "CORR_METHODS",
48
+ "TRIGAMMA_EXACT",
49
+ "TRIGAMMA_RECOMB25",
50
+ "get_LN_lfcs",
51
+ "get_LN_lfcs_sparse",
52
+ "rank_genes_groups_ln",
53
+ "trigamma_diff_int",
54
+ "trigamma_diff_recomb25",
55
+ "__version__",
56
+ ]
57
+
58
+
59
+ def __dir__():
60
+ return sorted(__all__)