dycw-utilities 0.164.0__tar.gz → 0.165.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.
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/PKG-INFO +1 -1
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/pyproject.toml +3 -2
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_hypothesis.py +32 -6
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_logging.py +29 -4
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_polars.py +26 -6
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_polars_ols.py +4 -8
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/__init__.py +1 -1
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/hypothesis.py +24 -2
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/logging.py +34 -1
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/polars.py +54 -11
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/typing.py +1 -1
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/.gitignore +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/LICENSE +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/README.md +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/__init__.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/conftest.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/modules/__init__.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/modules/package_missing/__init__.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/modules/package_missing/module.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/modules/package_with/__init__.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/modules/package_with/outer_1.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/modules/package_with/outer_2.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/modules/package_without/__init__.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/modules/package_without/module_1.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/modules/package_without/module_2.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/modules/standalone.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/modules/with_imports.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_aeventkit.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_altair.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_asyncio.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_atomicwrites.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_atools.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_cachetools.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_click.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_concurrent.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_contextlib.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_contextvars.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_cryptography.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_cvxpy.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_dataclasses.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_enum.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_errors.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_fastapi.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_fpdf2.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_functions.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_functools.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_getpass.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_gzip.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_hashlib.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_http.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_importlib.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_inflect.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_ipython.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_iterables.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_json.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_jupyter.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_libcst.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_lightweight_charts.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_math.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_memory_profiler.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_modules.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_more_itertools.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_numpy.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_objects/__init__.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_objects/objects.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_operator.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_optuna.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_orjson.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_os.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_parse.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_pathlib.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_pickle.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_platform.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_postgres.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_pottery.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_pqdm.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_psutil.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_pyinstrument.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_pytest.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_pytest_randomly.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_pytest_regressions.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_random.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_re.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_redis.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_reprlib.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_scipy.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_sentinel.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_shelve.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_slack_sdk.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_socket.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_sqlalchemy.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_statsmodels.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_string.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_tempfile.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_testbook.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_text.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_threading.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_timer.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_traceback.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_typed_settings.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_types.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_typing.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_typing_funcs/__init__.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_typing_funcs/no_future.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_typing_funcs/with_future.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_tzdata.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_tzlocal.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_uuid.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_version.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_warnings.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_whenever.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_zipfile.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/test_zoneinfo.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/aeventkit.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/altair.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/asyncio.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/atomicwrites.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/atools.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/cachetools.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/click.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/concurrent.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/contextlib.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/contextvars.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/cryptography.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/cvxpy.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/dataclasses.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/enum.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/errors.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/fastapi.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/fpdf2.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/functions.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/functools.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/getpass.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/gzip.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/hashlib.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/http.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/importlib.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/inflect.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/ipython.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/iterables.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/json.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/jupyter.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/libcst.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/lightweight_charts.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/math.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/memory_profiler.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/modules.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/more_itertools.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/numpy.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/operator.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/optuna.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/orjson.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/os.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/parse.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/pathlib.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/pickle.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/platform.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/polars_ols.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/postgres.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/pottery.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/pqdm.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/psutil.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/py.typed +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/pyinstrument.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/pytest.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/pytest_plugins/__init__.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/pytest_plugins/pytest_randomly.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/pytest_plugins/pytest_regressions.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/pytest_regressions.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/random.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/re.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/redis.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/reprlib.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/scipy.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/sentinel.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/shelve.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/slack_sdk.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/socket.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/sqlalchemy.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/statsmodels.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/string.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/tempfile.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/testbook.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/text.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/threading.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/timer.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/traceback.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/typed_settings.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/types.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/tzdata.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/tzlocal.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/uuid.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/version.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/warnings.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/whenever.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/zipfile.py +0 -0
- {dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/utilities/zoneinfo.py +0 -0
@@ -128,6 +128,7 @@ polars-ols-test = [
|
|
128
128
|
]
|
129
129
|
polars-test = [
|
130
130
|
"numpy",
|
131
|
+
"scipy",
|
131
132
|
"statsmodels",
|
132
133
|
]
|
133
134
|
pottery = [
|
@@ -232,7 +233,7 @@ dependencies = [
|
|
232
233
|
name = "dycw-utilities"
|
233
234
|
readme = "README.md"
|
234
235
|
requires-python = ">= 3.12"
|
235
|
-
version = "0.
|
236
|
+
version = "0.165.0"
|
236
237
|
|
237
238
|
[project.entry-points.pytest11]
|
238
239
|
pytest-randomly = "utilities.pytest_plugins.pytest_randomly"
|
@@ -265,7 +266,7 @@ test = [
|
|
265
266
|
# bump-my-version
|
266
267
|
[tool.bumpversion]
|
267
268
|
allow_dirty = true
|
268
|
-
current_version = "0.
|
269
|
+
current_version = "0.165.0"
|
269
270
|
|
270
271
|
[[tool.bumpversion.files]]
|
271
272
|
filename = "src/utilities/__init__.py"
|
@@ -381,29 +381,55 @@ class TestDraw2:
|
|
381
381
|
|
382
382
|
|
383
383
|
class TestFloat32s:
|
384
|
-
@given(data=data())
|
385
|
-
def test_main(
|
384
|
+
@given(data=data(), exclude_min=booleans(), exclude_max=booleans())
|
385
|
+
def test_main(
|
386
|
+
self, *, data: DataObject, exclude_min: bool, exclude_max: bool
|
387
|
+
) -> None:
|
386
388
|
min_value, max_value = data.draw(pairs(float32s() | none()))
|
387
389
|
with assume_does_not_raise(InvalidArgument):
|
388
|
-
x = data.draw(
|
390
|
+
x = data.draw(
|
391
|
+
float32s(
|
392
|
+
min_value=min_value,
|
393
|
+
max_value=max_value,
|
394
|
+
exclude_min=exclude_min,
|
395
|
+
exclude_max=exclude_max,
|
396
|
+
)
|
397
|
+
)
|
389
398
|
assert MIN_FLOAT32 <= x <= MAX_FLOAT32
|
390
399
|
if min_value is not None:
|
391
400
|
assert x >= min_value
|
401
|
+
if exclude_min:
|
402
|
+
assert x != min_value
|
392
403
|
if max_value is not None:
|
393
404
|
assert x <= max_value
|
405
|
+
if exclude_max:
|
406
|
+
assert x != max_value
|
394
407
|
|
395
408
|
|
396
409
|
class TestFloat64s:
|
397
|
-
@given(data=data())
|
398
|
-
def test_main(
|
410
|
+
@given(data=data(), exclude_min=booleans(), exclude_max=booleans())
|
411
|
+
def test_main(
|
412
|
+
self, *, data: DataObject, exclude_min: bool, exclude_max: bool
|
413
|
+
) -> None:
|
399
414
|
min_value, max_value = data.draw(pairs(float64s() | none()))
|
400
415
|
with assume_does_not_raise(InvalidArgument):
|
401
|
-
x = data.draw(
|
416
|
+
x = data.draw(
|
417
|
+
float64s(
|
418
|
+
min_value=min_value,
|
419
|
+
max_value=max_value,
|
420
|
+
exclude_min=exclude_min,
|
421
|
+
exclude_max=exclude_max,
|
422
|
+
)
|
423
|
+
)
|
402
424
|
assert MIN_FLOAT64 <= x <= MAX_FLOAT64
|
403
425
|
if min_value is not None:
|
404
426
|
assert x >= min_value
|
405
427
|
if max_value is not None:
|
406
428
|
assert x <= max_value
|
429
|
+
if max_value is not None:
|
430
|
+
assert x <= max_value
|
431
|
+
if exclude_max:
|
432
|
+
assert x != max_value
|
407
433
|
|
408
434
|
|
409
435
|
class TestFloatArrays:
|
@@ -1,14 +1,15 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
3
|
from asyncio import sleep
|
4
|
+
from dataclasses import dataclass, field
|
4
5
|
from io import StringIO
|
5
|
-
from logging import Formatter, StreamHandler, getLogger
|
6
|
+
from logging import Formatter, LoggerAdapter, StreamHandler, getLogger
|
6
7
|
from pathlib import Path
|
7
8
|
from re import search
|
8
9
|
from typing import TYPE_CHECKING, Any, cast
|
9
10
|
|
10
11
|
from hypothesis import given
|
11
|
-
from hypothesis.strategies import
|
12
|
+
from hypothesis.strategies import integers
|
12
13
|
from pytest import LogCaptureFixture, mark, param, raises
|
13
14
|
|
14
15
|
from tests.conftest import SKIPIF_CI_AND_WINDOWS
|
@@ -20,6 +21,7 @@ from utilities.logging import (
|
|
20
21
|
_compute_rollover_actions,
|
21
22
|
_FieldStyleKeys,
|
22
23
|
_RotatingLogFile,
|
24
|
+
add_adapter,
|
23
25
|
add_filters,
|
24
26
|
basic_config,
|
25
27
|
get_format_str,
|
@@ -41,14 +43,37 @@ if TYPE_CHECKING:
|
|
41
43
|
from whenever import ZonedDateTime
|
42
44
|
|
43
45
|
|
46
|
+
class TestAddAdapter:
|
47
|
+
def test_main(self, *, caplog: LogCaptureFixture) -> None:
|
48
|
+
logger = getLogger(name := unique_str())
|
49
|
+
logger.setLevel("DEBUG")
|
50
|
+
|
51
|
+
def process(msg: str, x: int, /) -> str:
|
52
|
+
return f"x={x}: {msg}"
|
53
|
+
|
54
|
+
@dataclass
|
55
|
+
class Example:
|
56
|
+
x: int = 0
|
57
|
+
logger: LoggerAdapter = field(init=False)
|
58
|
+
|
59
|
+
def __post_init__(self) -> None:
|
60
|
+
self.logger = add_adapter(logger, process, self.x)
|
61
|
+
self.logger.info("Initializing...")
|
62
|
+
|
63
|
+
_ = Example()
|
64
|
+
record = one(r for r in caplog.records if r.name == name)
|
65
|
+
assert record.message == "x=0: Initializing..."
|
66
|
+
|
67
|
+
|
44
68
|
class TestAddFilters:
|
45
|
-
@
|
69
|
+
@mark.parametrize("expected", [param(True), param(False)])
|
46
70
|
def test_main(self, *, expected: bool) -> None:
|
47
71
|
logger = getLogger(unique_str())
|
48
72
|
logger.addHandler(handler := StreamHandler(buffer := StringIO()))
|
73
|
+
logger.setLevel("DEBUG")
|
49
74
|
add_filters(handler, lambda _: expected)
|
50
75
|
assert len(handler.filters) == 1
|
51
|
-
logger.
|
76
|
+
logger.info("message")
|
52
77
|
result = buffer.getvalue() != ""
|
53
78
|
assert result is expected
|
54
79
|
|
@@ -16,7 +16,7 @@ import hypothesis.strategies
|
|
16
16
|
import numpy as np
|
17
17
|
import polars as pl
|
18
18
|
import whenever
|
19
|
-
from hypothesis import given
|
19
|
+
from hypothesis import assume, given
|
20
20
|
from hypothesis.strategies import (
|
21
21
|
DataObject,
|
22
22
|
SearchStrategy,
|
@@ -57,11 +57,13 @@ from polars._typing import IntoExprColumn, SchemaDict
|
|
57
57
|
from polars.schema import Schema
|
58
58
|
from polars.testing import assert_frame_equal, assert_series_equal
|
59
59
|
from pytest import mark, param, raises
|
60
|
+
from scipy.stats import norm
|
60
61
|
from whenever import DateDelta, DateTimeDelta, PlainDateTime, TimeDelta, ZonedDateTime
|
61
62
|
|
62
63
|
import tests.test_math
|
63
64
|
import utilities.polars
|
64
65
|
from utilities.hypothesis import (
|
66
|
+
assume_does_not_raise,
|
65
67
|
date_deltas,
|
66
68
|
date_periods,
|
67
69
|
date_time_deltas,
|
@@ -180,7 +182,8 @@ from utilities.polars import (
|
|
180
182
|
map_over_columns,
|
181
183
|
nan_sum_agg,
|
182
184
|
nan_sum_horizontal,
|
183
|
-
|
185
|
+
normal_pdf,
|
186
|
+
normal_rv,
|
184
187
|
number_of_decimals,
|
185
188
|
offset_datetime,
|
186
189
|
one_column,
|
@@ -2195,22 +2198,39 @@ class TestNanSumHorizontal:
|
|
2195
2198
|
assert result.item() == expected
|
2196
2199
|
|
2197
2200
|
|
2198
|
-
class
|
2201
|
+
class TestNormalPDF:
|
2202
|
+
@given(
|
2203
|
+
xs=lists(float64s(), max_size=10),
|
2204
|
+
loc=float64s(),
|
2205
|
+
scale=float64s(min_value=0.0, exclude_min=True),
|
2206
|
+
)
|
2207
|
+
def test_main(self, *, xs: list[float], loc: float, scale: float) -> None:
|
2208
|
+
x = Series(name="x", values=xs, dtype=Float64)
|
2209
|
+
series = normal_pdf(x, loc=loc, scale=scale)
|
2210
|
+
_ = assume(series.is_finite().all())
|
2211
|
+
with assume_does_not_raise(
|
2212
|
+
RuntimeWarning, match="overflow encountered in (subtract|square|divide)"
|
2213
|
+
):
|
2214
|
+
expected = norm.pdf(xs, loc=loc, scale=scale)
|
2215
|
+
assert allclose(series, expected)
|
2216
|
+
|
2217
|
+
|
2218
|
+
class TestNormalRV:
|
2199
2219
|
@given(length=hypothesis.strategies.integers(0, 10))
|
2200
2220
|
def test_int(self, *, length: int) -> None:
|
2201
|
-
series =
|
2221
|
+
series = normal_rv(length)
|
2202
2222
|
self._assert(series, length)
|
2203
2223
|
|
2204
2224
|
@given(length=hypothesis.strategies.integers(0, 10))
|
2205
2225
|
def test_series(self, *, length: int) -> None:
|
2206
2226
|
orig = int_range(end=length, eager=True)
|
2207
|
-
series =
|
2227
|
+
series = normal_rv(orig)
|
2208
2228
|
self._assert(series, length)
|
2209
2229
|
|
2210
2230
|
@given(length=hypothesis.strategies.integers(0, 10))
|
2211
2231
|
def test_dataframe(self, *, length: int) -> None:
|
2212
2232
|
df = int_range(end=length, eager=True).to_frame()
|
2213
|
-
series =
|
2233
|
+
series = normal_rv(df)
|
2214
2234
|
self._assert(series, length)
|
2215
2235
|
|
2216
2236
|
def _assert(self, series: Series, length: int, /) -> None:
|
@@ -3,11 +3,11 @@ from __future__ import annotations
|
|
3
3
|
from hypothesis import given
|
4
4
|
from hypothesis.strategies import sampled_from
|
5
5
|
from numpy import isclose
|
6
|
-
from polars import DataFrame, Float64, Series,
|
6
|
+
from polars import DataFrame, Float64, Series, col, mean_horizontal
|
7
7
|
from polars.testing import assert_frame_equal
|
8
8
|
from sklearn.linear_model import LinearRegression
|
9
9
|
|
10
|
-
from utilities.polars import concat_series, integers,
|
10
|
+
from utilities.polars import concat_series, integers, normal_rv, struct_dtype
|
11
11
|
from utilities.polars_ols import compute_rolling_ols
|
12
12
|
|
13
13
|
|
@@ -77,7 +77,7 @@ class TestComputeRollingOLS:
|
|
77
77
|
integers(n, -100, high=100, seed=0).alias("x1"),
|
78
78
|
integers(n, -100, high=100, seed=1).alias("x2"),
|
79
79
|
).with_columns(
|
80
|
-
(
|
80
|
+
y=mean_horizontal("x1", 2 * col.x2, normal_rv(n, scale=10.0, seed=2))
|
81
81
|
)
|
82
82
|
|
83
83
|
def _assert_series(self, series: Series, /) -> None:
|
@@ -100,11 +100,7 @@ class TestComputeRollingOLS:
|
|
100
100
|
expected = DataFrame(
|
101
101
|
data=data,
|
102
102
|
schema={
|
103
|
-
"coefficients":
|
104
|
-
"x1": Float64,
|
105
|
-
"x2": Float64,
|
106
|
-
"const": Float64,
|
107
|
-
}),
|
103
|
+
"coefficients": struct_dtype(x1=Float64, x2=Float64, const=Float64),
|
108
104
|
"predictions": Float64,
|
109
105
|
"residuals": Float64,
|
110
106
|
"R2": Float64,
|
@@ -412,6 +412,8 @@ def float32s(
|
|
412
412
|
*,
|
413
413
|
min_value: MaybeSearchStrategy[float | None] = None,
|
414
414
|
max_value: MaybeSearchStrategy[float | None] = None,
|
415
|
+
exclude_min: MaybeSearchStrategy[bool] = False,
|
416
|
+
exclude_max: MaybeSearchStrategy[bool] = False,
|
415
417
|
) -> float:
|
416
418
|
"""Strategy for generating float32s."""
|
417
419
|
min_value_, max_value_ = [draw2(draw, v) for v in [min_value, max_value]]
|
@@ -419,7 +421,16 @@ def float32s(
|
|
419
421
|
max_value_ = min_nullable([max_value_, MAX_FLOAT32])
|
420
422
|
if is_zero(min_value_) and is_zero(max_value_):
|
421
423
|
min_value_ = max_value_ = 0.0
|
422
|
-
|
424
|
+
exclude_min_, exclude_max_ = [draw2(draw, e) for e in [exclude_min, exclude_max]]
|
425
|
+
return draw(
|
426
|
+
floats(
|
427
|
+
min_value_,
|
428
|
+
max_value_,
|
429
|
+
width=32,
|
430
|
+
exclude_min=exclude_min_,
|
431
|
+
exclude_max=exclude_max_,
|
432
|
+
)
|
433
|
+
)
|
423
434
|
|
424
435
|
|
425
436
|
@composite
|
@@ -429,6 +440,8 @@ def float64s(
|
|
429
440
|
*,
|
430
441
|
min_value: MaybeSearchStrategy[float | None] = None,
|
431
442
|
max_value: MaybeSearchStrategy[float | None] = None,
|
443
|
+
exclude_min: MaybeSearchStrategy[bool] = False,
|
444
|
+
exclude_max: MaybeSearchStrategy[bool] = False,
|
432
445
|
) -> float:
|
433
446
|
"""Strategy for generating float64s."""
|
434
447
|
min_value_, max_value_ = [draw2(draw, v) for v in [min_value, max_value]]
|
@@ -436,7 +449,16 @@ def float64s(
|
|
436
449
|
max_value_ = min_nullable([max_value_, MAX_FLOAT64])
|
437
450
|
if is_zero(min_value_) and is_zero(max_value_):
|
438
451
|
min_value_ = max_value_ = 0.0
|
439
|
-
|
452
|
+
exclude_min_, exclude_max_ = [draw2(draw, e) for e in [exclude_min, exclude_max]]
|
453
|
+
return draw(
|
454
|
+
floats(
|
455
|
+
min_value_,
|
456
|
+
max_value_,
|
457
|
+
width=64,
|
458
|
+
exclude_min=exclude_min_,
|
459
|
+
exclude_max=exclude_max_,
|
460
|
+
)
|
461
|
+
)
|
440
462
|
|
441
463
|
|
442
464
|
##
|
@@ -8,6 +8,7 @@ from logging import (
|
|
8
8
|
Formatter,
|
9
9
|
Handler,
|
10
10
|
Logger,
|
11
|
+
LoggerAdapter,
|
11
12
|
LogRecord,
|
12
13
|
StreamHandler,
|
13
14
|
basicConfig,
|
@@ -22,6 +23,7 @@ from socket import gethostname
|
|
22
23
|
from typing import (
|
23
24
|
TYPE_CHECKING,
|
24
25
|
Any,
|
26
|
+
Concatenate,
|
25
27
|
Literal,
|
26
28
|
NotRequired,
|
27
29
|
Self,
|
@@ -53,7 +55,7 @@ from utilities.whenever import (
|
|
53
55
|
)
|
54
56
|
|
55
57
|
if TYPE_CHECKING:
|
56
|
-
from collections.abc import Iterable, Mapping
|
58
|
+
from collections.abc import Callable, Iterable, Mapping, MutableMapping
|
57
59
|
from datetime import time
|
58
60
|
from logging import _FilterType
|
59
61
|
|
@@ -63,6 +65,7 @@ if TYPE_CHECKING:
|
|
63
65
|
MaybeCallablePathLike,
|
64
66
|
MaybeIterable,
|
65
67
|
PathLike,
|
68
|
+
StrMapping,
|
66
69
|
)
|
67
70
|
|
68
71
|
|
@@ -75,6 +78,35 @@ _DEFAULT_WHEN: _When = "D"
|
|
75
78
|
##
|
76
79
|
|
77
80
|
|
81
|
+
def add_adapter[**P](
|
82
|
+
logger: Logger,
|
83
|
+
process: Callable[Concatenate[str, P], str],
|
84
|
+
/,
|
85
|
+
*args: P.args,
|
86
|
+
**kwargs: P.kwargs,
|
87
|
+
) -> LoggerAdapter:
|
88
|
+
"""Add an adapter to a logger."""
|
89
|
+
|
90
|
+
class CustomAdapter(LoggerAdapter):
|
91
|
+
@override
|
92
|
+
def process(
|
93
|
+
self, msg: str, kwargs: MutableMapping[str, Any]
|
94
|
+
) -> tuple[str, MutableMapping[str, Any]]:
|
95
|
+
extra = cast("_ArgsAndKwargs", self.extra)
|
96
|
+
new_msg = process(msg, *extra["args"], **extra["kwargs"])
|
97
|
+
return new_msg, kwargs
|
98
|
+
|
99
|
+
return CustomAdapter(logger, extra=_ArgsAndKwargs(args=args, kwargs=kwargs))
|
100
|
+
|
101
|
+
|
102
|
+
class _ArgsAndKwargs(TypedDict):
|
103
|
+
args: tuple[Any, ...]
|
104
|
+
kwargs: StrMapping
|
105
|
+
|
106
|
+
|
107
|
+
##
|
108
|
+
|
109
|
+
|
78
110
|
def add_filters(handler: Handler, /, *filters: _FilterType) -> None:
|
79
111
|
"""Add a set of filters to a handler."""
|
80
112
|
for filter_i in filters:
|
@@ -589,6 +621,7 @@ def to_logger(logger: LoggerLike | None = None, /) -> Logger:
|
|
589
621
|
__all__ = [
|
590
622
|
"GetLoggingLevelNumberError",
|
591
623
|
"SizeAndTimeRotatingFileHandler",
|
624
|
+
"add_adapter",
|
592
625
|
"add_filters",
|
593
626
|
"basic_config",
|
594
627
|
"get_format_str",
|
@@ -6,7 +6,7 @@ from collections.abc import Set as AbstractSet
|
|
6
6
|
from dataclasses import asdict, dataclass
|
7
7
|
from functools import partial, reduce
|
8
8
|
from itertools import chain, pairwise, product
|
9
|
-
from math import ceil, log
|
9
|
+
from math import ceil, log, pi, sqrt
|
10
10
|
from pathlib import Path
|
11
11
|
from typing import TYPE_CHECKING, Any, Literal, assert_never, cast, overload, override
|
12
12
|
from uuid import UUID
|
@@ -1929,7 +1929,49 @@ def nan_sum_horizontal(*columns: IntoExprColumn) -> ExprOrSeries:
|
|
1929
1929
|
##
|
1930
1930
|
|
1931
1931
|
|
1932
|
-
|
1932
|
+
@overload
|
1933
|
+
def normal_pdf(
|
1934
|
+
x: ExprLike,
|
1935
|
+
/,
|
1936
|
+
*,
|
1937
|
+
loc: float | IntoExprColumn = 0.0,
|
1938
|
+
scale: float | IntoExprColumn = 1.0,
|
1939
|
+
) -> Expr: ...
|
1940
|
+
@overload
|
1941
|
+
def normal_pdf(
|
1942
|
+
x: Series,
|
1943
|
+
/,
|
1944
|
+
*,
|
1945
|
+
loc: float | IntoExprColumn = 0.0,
|
1946
|
+
scale: float | IntoExprColumn = 1.0,
|
1947
|
+
) -> Series: ...
|
1948
|
+
@overload
|
1949
|
+
def normal_pdf(
|
1950
|
+
x: IntoExprColumn,
|
1951
|
+
/,
|
1952
|
+
*,
|
1953
|
+
loc: float | IntoExprColumn = 0.0,
|
1954
|
+
scale: float | IntoExprColumn = 1.0,
|
1955
|
+
) -> ExprOrSeries: ...
|
1956
|
+
def normal_pdf(
|
1957
|
+
x: IntoExprColumn,
|
1958
|
+
/,
|
1959
|
+
*,
|
1960
|
+
loc: float | IntoExprColumn = 0.0,
|
1961
|
+
scale: float | IntoExprColumn = 1.0,
|
1962
|
+
) -> ExprOrSeries:
|
1963
|
+
"""Compute the PDF of a normal distribution."""
|
1964
|
+
x = ensure_expr_or_series(x)
|
1965
|
+
loc = loc if isinstance(loc, int | float) else ensure_expr_or_series(loc)
|
1966
|
+
scale = scale if isinstance(scale, int | float) else ensure_expr_or_series(scale)
|
1967
|
+
expr = (1 / (scale * sqrt(2 * pi))) * (-(1 / 2) * ((x - loc) / scale) ** 2).exp()
|
1968
|
+
return try_reify_expr(expr, x)
|
1969
|
+
|
1970
|
+
|
1971
|
+
##
|
1972
|
+
|
1973
|
+
|
1974
|
+
def normal_rv(
|
1933
1975
|
obj: int | Series | DataFrame,
|
1934
1976
|
/,
|
1935
1977
|
*,
|
@@ -1948,11 +1990,11 @@ def normal(
|
|
1948
1990
|
values = rng.normal(loc=loc, scale=scale, size=height)
|
1949
1991
|
return Series(name=name, values=values, dtype=dtype)
|
1950
1992
|
case Series() as series:
|
1951
|
-
return
|
1993
|
+
return normal_rv(
|
1952
1994
|
series.len(), loc=loc, scale=scale, seed=seed, name=name, dtype=dtype
|
1953
1995
|
)
|
1954
1996
|
case DataFrame() as df:
|
1955
|
-
return
|
1997
|
+
return normal_rv(
|
1956
1998
|
df.height, loc=loc, scale=scale, seed=seed, name=name, dtype=dtype
|
1957
1999
|
)
|
1958
2000
|
case never:
|
@@ -1964,22 +2006,22 @@ def normal(
|
|
1964
2006
|
|
1965
2007
|
@overload
|
1966
2008
|
def number_of_decimals(
|
1967
|
-
|
2009
|
+
column: ExprLike, /, *, max_decimals: int = MAX_DECIMALS
|
1968
2010
|
) -> Expr: ...
|
1969
2011
|
@overload
|
1970
2012
|
def number_of_decimals(
|
1971
|
-
|
2013
|
+
column: Series, /, *, max_decimals: int = MAX_DECIMALS
|
1972
2014
|
) -> Series: ...
|
1973
2015
|
@overload
|
1974
2016
|
def number_of_decimals(
|
1975
|
-
|
2017
|
+
column: IntoExprColumn, /, *, max_decimals: int = MAX_DECIMALS
|
1976
2018
|
) -> ExprOrSeries: ...
|
1977
2019
|
def number_of_decimals(
|
1978
|
-
|
2020
|
+
column: IntoExprColumn, /, *, max_decimals: int = MAX_DECIMALS
|
1979
2021
|
) -> ExprOrSeries:
|
1980
2022
|
"""Get the number of decimals."""
|
1981
|
-
|
1982
|
-
frac =
|
2023
|
+
column = ensure_expr_or_series(column)
|
2024
|
+
frac = column - column.floor()
|
1983
2025
|
results = (
|
1984
2026
|
_number_of_decimals_check_scale(frac, s) for s in range(max_decimals + 1)
|
1985
2027
|
)
|
@@ -2697,7 +2739,8 @@ __all__ = [
|
|
2697
2739
|
"map_over_columns",
|
2698
2740
|
"nan_sum_agg",
|
2699
2741
|
"nan_sum_horizontal",
|
2700
|
-
"
|
2742
|
+
"normal_pdf",
|
2743
|
+
"normal_rv",
|
2701
2744
|
"number_of_decimals",
|
2702
2745
|
"offset_datetime",
|
2703
2746
|
"one_column",
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/modules/package_missing/__init__.py
RENAMED
File without changes
|
{dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/modules/package_missing/module.py
RENAMED
File without changes
|
{dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/modules/package_with/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/modules/package_without/__init__.py
RENAMED
File without changes
|
{dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/modules/package_without/module_1.py
RENAMED
File without changes
|
{dycw_utilities-0.164.0 → dycw_utilities-0.165.0}/src/tests/modules/package_without/module_2.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|