From 17b6e6b29c43644d908e93c83ce4297276e6be2a Mon Sep 17 00:00:00 2001 From: Yuri Victorovich Date: Wed, 28 Dec 2022 14:30:03 -0800 Subject: [PATCH] math/py-formulaic: New port: Implementation of Wilkinson formulas --- math/Makefile | 1 + math/py-formulaic/Makefile | 41 ++++++++++ math/py-formulaic/distinfo | 3 + math/py-formulaic/pkg-descr | 16 ++++ math/py-formulaic/pkg-plist | 148 ++++++++++++++++++++++++++++++++++++ 5 files changed, 209 insertions(+) create mode 100644 math/py-formulaic/Makefile create mode 100644 math/py-formulaic/distinfo create mode 100644 math/py-formulaic/pkg-descr create mode 100644 math/py-formulaic/pkg-plist diff --git a/math/Makefile b/math/Makefile index 4c59c69777fcc..442c1af203e8e 100644 --- a/math/Makefile +++ b/math/Makefile @@ -905,6 +905,7 @@ SUBDIR += py-fenics-ffcx SUBDIR += py-fenics-ufl SUBDIR += py-flax + SUBDIR += py-formulaic SUBDIR += py-fpylll SUBDIR += py-fraction SUBDIR += py-fvcore diff --git a/math/py-formulaic/Makefile b/math/py-formulaic/Makefile new file mode 100644 index 0000000000000..b9f2463bb4998 --- /dev/null +++ b/math/py-formulaic/Makefile @@ -0,0 +1,41 @@ +PORTNAME= formulaic +PORTVERSION= 0.5.2 +CATEGORIES= math python # statistics +MASTER_SITES= CHEESESHOP +PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX} + +MAINTAINER= yuri@FreeBSD.org +COMMENT= Implementation of Wilkinson formulas +WWW= https://github.com/matthewwardrop/formulaic + +LICENSE= MIT +LICENSE_FILE= ${WRKSRC}/LICENSE + +PY_DEPENDS= ${PYTHON_PKGNAMEPREFIX}astor>=0.8:devel/py-astor@${PY_FLAVOR} \ + ${PYTHON_PKGNAMEPREFIX}cached-property>=1.3.0:devel/py-cached-property@${PY_FLAVOR} \ + ${PYNUMY} \ + ${PYTHON_PKGNAMEPREFIX}pandas>=1.0:math/py-pandas@${PY_FLAVOR} \ + ${PYTHON_PKGNAMEPREFIX}scipy>=1.6:science/py-scipy@${PY_FLAVOR} \ + ${PYTHON_PKGNAMEPREFIX}typing-extensions>=4.2.0:devel/py-typing-extensions@${PY_FLAVOR} \ + ${PYTHON_PKGNAMEPREFIX}wrapt>=1.0:devel/py-wrapt@${PY_FLAVOR} +BUILD_DEPENDS= ${PYTHON_PKGNAMEPREFIX}build>0:devel/py-build@${PY_FLAVOR} \ + ${PYTHON_PKGNAMEPREFIX}installer>0:devel/py-installer@${PY_FLAVOR} \ + ${PYTHON_PKGNAMEPREFIX}hatch-vcs>0:devel/py-hatch-vcs@${PY_FLAVOR} \ + ${PYTHON_PKGNAMEPREFIX}hatchling>0:devel/py-hatchling@${PY_FLAVOR} \ + ${PY_DEPENDS} +RUN_DEPENDS= ${PY_DEPENDS} + +USES= python:3.7+ +USE_PYTHON= flavors pytest + +NO_ARCH= yes + +TEST_ENV= ${MAKE_ENV} PYTHONPATH=${STAGEDIR}${PYTHONPREFIX_SITELIBDIR} + +do-build: + @cd ${BUILD_WRKSRC} && ${SETENV} ${MAKE_ENV} ${PYTHON_CMD} -m build --wheel --no-isolation --outdir ${WRKDIR} + +do-install: + @cd ${INSTALL_WRKSRC} && ${SETENV} ${MAKE_ENV} ${PYTHON_CMD} -m installer ${WRKDIR}/*.whl --destdir ${STAGEDIR} + +.include diff --git a/math/py-formulaic/distinfo b/math/py-formulaic/distinfo new file mode 100644 index 0000000000000..e7a9bac3b6deb --- /dev/null +++ b/math/py-formulaic/distinfo @@ -0,0 +1,3 @@ +TIMESTAMP = 1672264736 +SHA256 (formulaic-0.5.2.tar.gz) = 25b1e1c8dff73f0b11c0028a6ab350222de6bbc47b316ccb770cec16189cef53 +SIZE (formulaic-0.5.2.tar.gz) = 259138 diff --git a/math/py-formulaic/pkg-descr b/math/py-formulaic/pkg-descr new file mode 100644 index 0000000000000..28318f1e5ed74 --- /dev/null +++ b/math/py-formulaic/pkg-descr @@ -0,0 +1,16 @@ +Formulaic is a high-performance implementation of Wilkinson formulas for Python. + +It provides: +* high-performance dataframe to model-matrix conversions. +* support for reusing the encoding choices made during conversion of one + data-set on other datasets. +* extensible formula parsing. +* extensible data input/output plugins, with implementations for: + * input: + * pandas.DataFrame + * pyarrow.Table + * output: + * pandas.DataFrame + * numpy.ndarray + * scipy.sparse.CSCMatrix +* support for symbolic differentiation of formulas (and hence model matrices). diff --git a/math/py-formulaic/pkg-plist b/math/py-formulaic/pkg-plist new file mode 100644 index 0000000000000..a5eb7e6497e43 --- /dev/null +++ b/math/py-formulaic/pkg-plist @@ -0,0 +1,148 @@ +%%PYTHON_SITELIBDIR%%/formulaic-0.5.2.dist-info/METADATA +%%PYTHON_SITELIBDIR%%/formulaic-0.5.2.dist-info/RECORD +%%PYTHON_SITELIBDIR%%/formulaic-0.5.2.dist-info/WHEEL +%%PYTHON_SITELIBDIR%%/formulaic-0.5.2.dist-info/licenses/LICENSE +%%PYTHON_SITELIBDIR%%/formulaic/__init__.py +%%PYTHON_SITELIBDIR%%/formulaic/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/__pycache__/_version%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/__pycache__/_version%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/__pycache__/errors%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/__pycache__/errors%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/__pycache__/formula%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/__pycache__/formula%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/__pycache__/model_matrix%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/__pycache__/model_matrix%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/__pycache__/model_spec%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/__pycache__/model_spec%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/__pycache__/sugar%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/__pycache__/sugar%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/_version.py +%%PYTHON_SITELIBDIR%%/formulaic/errors.py +%%PYTHON_SITELIBDIR%%/formulaic/formula.py +%%PYTHON_SITELIBDIR%%/formulaic/materializers/__init__.py +%%PYTHON_SITELIBDIR%%/formulaic/materializers/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/materializers/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/materializers/__pycache__/arrow%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/materializers/__pycache__/arrow%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/materializers/__pycache__/base%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/materializers/__pycache__/base%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/materializers/__pycache__/pandas%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/materializers/__pycache__/pandas%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/materializers/arrow.py +%%PYTHON_SITELIBDIR%%/formulaic/materializers/base.py +%%PYTHON_SITELIBDIR%%/formulaic/materializers/pandas.py +%%PYTHON_SITELIBDIR%%/formulaic/materializers/types/__init__.py +%%PYTHON_SITELIBDIR%%/formulaic/materializers/types/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/materializers/types/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/materializers/types/__pycache__/enums%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/materializers/types/__pycache__/enums%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/materializers/types/__pycache__/evaluated_factor%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/materializers/types/__pycache__/evaluated_factor%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/materializers/types/__pycache__/factor_values%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/materializers/types/__pycache__/factor_values%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/materializers/types/__pycache__/scoped_factor%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/materializers/types/__pycache__/scoped_factor%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/materializers/types/__pycache__/scoped_term%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/materializers/types/__pycache__/scoped_term%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/materializers/types/enums.py +%%PYTHON_SITELIBDIR%%/formulaic/materializers/types/evaluated_factor.py +%%PYTHON_SITELIBDIR%%/formulaic/materializers/types/factor_values.py +%%PYTHON_SITELIBDIR%%/formulaic/materializers/types/scoped_factor.py +%%PYTHON_SITELIBDIR%%/formulaic/materializers/types/scoped_term.py +%%PYTHON_SITELIBDIR%%/formulaic/model_matrix.py +%%PYTHON_SITELIBDIR%%/formulaic/model_spec.py +%%PYTHON_SITELIBDIR%%/formulaic/parser/__init__.py +%%PYTHON_SITELIBDIR%%/formulaic/parser/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/parser/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/parser/__pycache__/parser%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/parser/__pycache__/parser%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/parser/__pycache__/utils%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/parser/__pycache__/utils%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/parser/algos/__init__.py +%%PYTHON_SITELIBDIR%%/formulaic/parser/algos/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/parser/algos/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/parser/algos/__pycache__/tokenize%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/parser/algos/__pycache__/tokenize%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/parser/algos/__pycache__/tokens_to_ast%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/parser/algos/__pycache__/tokens_to_ast%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/parser/algos/tokenize.py +%%PYTHON_SITELIBDIR%%/formulaic/parser/algos/tokens_to_ast.py +%%PYTHON_SITELIBDIR%%/formulaic/parser/parser.py +%%PYTHON_SITELIBDIR%%/formulaic/parser/types/__init__.py +%%PYTHON_SITELIBDIR%%/formulaic/parser/types/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/parser/types/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/parser/types/__pycache__/ast_node%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/parser/types/__pycache__/ast_node%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/parser/types/__pycache__/factor%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/parser/types/__pycache__/factor%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/parser/types/__pycache__/formula_parser%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/parser/types/__pycache__/formula_parser%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/parser/types/__pycache__/operator%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/parser/types/__pycache__/operator%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/parser/types/__pycache__/operator_resolver%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/parser/types/__pycache__/operator_resolver%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/parser/types/__pycache__/structured%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/parser/types/__pycache__/structured%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/parser/types/__pycache__/term%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/parser/types/__pycache__/term%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/parser/types/__pycache__/token%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/parser/types/__pycache__/token%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/parser/types/ast_node.py +%%PYTHON_SITELIBDIR%%/formulaic/parser/types/factor.py +%%PYTHON_SITELIBDIR%%/formulaic/parser/types/formula_parser.py +%%PYTHON_SITELIBDIR%%/formulaic/parser/types/operator.py +%%PYTHON_SITELIBDIR%%/formulaic/parser/types/operator_resolver.py +%%PYTHON_SITELIBDIR%%/formulaic/parser/types/structured.py +%%PYTHON_SITELIBDIR%%/formulaic/parser/types/term.py +%%PYTHON_SITELIBDIR%%/formulaic/parser/types/token.py +%%PYTHON_SITELIBDIR%%/formulaic/parser/utils.py +%%PYTHON_SITELIBDIR%%/formulaic/sugar.py +%%PYTHON_SITELIBDIR%%/formulaic/transforms/__init__.py +%%PYTHON_SITELIBDIR%%/formulaic/transforms/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/transforms/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/transforms/__pycache__/basis_spline%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/transforms/__pycache__/basis_spline%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/transforms/__pycache__/contrasts%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/transforms/__pycache__/contrasts%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/transforms/__pycache__/identity%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/transforms/__pycache__/identity%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/transforms/__pycache__/poly%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/transforms/__pycache__/poly%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/transforms/__pycache__/scale%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/transforms/__pycache__/scale%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/transforms/basis_spline.py +%%PYTHON_SITELIBDIR%%/formulaic/transforms/contrasts.py +%%PYTHON_SITELIBDIR%%/formulaic/transforms/identity.py +%%PYTHON_SITELIBDIR%%/formulaic/transforms/poly.py +%%PYTHON_SITELIBDIR%%/formulaic/transforms/scale.py +%%PYTHON_SITELIBDIR%%/formulaic/utils/__init__.py +%%PYTHON_SITELIBDIR%%/formulaic/utils/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/utils/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/utils/__pycache__/calculus%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/utils/__pycache__/calculus%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/utils/__pycache__/cast%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/utils/__pycache__/cast%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/utils/__pycache__/constraints%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/utils/__pycache__/constraints%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/utils/__pycache__/context%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/utils/__pycache__/context%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/utils/__pycache__/iterators%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/utils/__pycache__/iterators%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/utils/__pycache__/layered_mapping%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/utils/__pycache__/layered_mapping%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/utils/__pycache__/sentinels%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/utils/__pycache__/sentinels%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/utils/__pycache__/sparse%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/utils/__pycache__/sparse%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/utils/__pycache__/stateful_transforms%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/formulaic/utils/__pycache__/stateful_transforms%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/formulaic/utils/calculus.py +%%PYTHON_SITELIBDIR%%/formulaic/utils/cast.py +%%PYTHON_SITELIBDIR%%/formulaic/utils/constraints.py +%%PYTHON_SITELIBDIR%%/formulaic/utils/context.py +%%PYTHON_SITELIBDIR%%/formulaic/utils/iterators.py +%%PYTHON_SITELIBDIR%%/formulaic/utils/layered_mapping.py +%%PYTHON_SITELIBDIR%%/formulaic/utils/sentinels.py +%%PYTHON_SITELIBDIR%%/formulaic/utils/sparse.py +%%PYTHON_SITELIBDIR%%/formulaic/utils/stateful_transforms.py