dycw-utilities 0.109.8__tar.gz → 0.109.10__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.109.8 → dycw_utilities-0.109.10}/PKG-INFO +2 -1
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/pyproject.toml +5 -2
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_polars.py +93 -2
- dycw_utilities-0.109.10/src/tests/test_polars_ols.py +103 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/__init__.py +1 -1
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/polars.py +115 -0
- dycw_utilities-0.109.10/src/utilities/polars_ols.py +71 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/.gitignore +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/LICENSE +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/README.md +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/__init__.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/conftest.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/modules/__init__.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/modules/package_missing/__init__.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/modules/package_missing/module.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/modules/package_with/__init__.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/modules/package_with/outer_1.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/modules/package_with/outer_2.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/modules/package_without/__init__.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/modules/package_without/module_1.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/modules/package_without/module_2.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/modules/standalone.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/modules/with_imports.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/scripts/__init__.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/scripts/test_async_service/__init__.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/scripts/test_async_service/__main__.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/scripts/test_async_service/run.sh +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/scripts/test_queue_processor/__init__.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/scripts/test_queue_processor/__main__.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/scripts/test_queue_processor/run.sh +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_altair.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_astor.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_asyncio.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_atomicwrites.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_atools.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_cachetools.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_click.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_concurrent.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_contextlib.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_contextvars.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_cryptography.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_cvxpy.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_dataclasses.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_datetime.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_enum.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_errors.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_eventkit.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_fastapi.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_fpdf2.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_functions.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_functools.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_getpass.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_git.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_hashlib.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_http.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_hypothesis.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_ipython.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_iterables.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_jupyter.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_logging.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_loguru.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_luigi.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_math.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_memory_profiler.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_modules.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_more_itertools.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_numpy.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_operator.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_optuna.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_orjson.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_os.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_parse.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_pathlib.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_period.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_pickle.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_platform.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_pqdm.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_pydantic.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_pyinstrument.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_pyrsistent.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_pytest.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_pytest_regressions.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_python_dotenv.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_random.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_re.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_redis.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_reprlib.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_rich.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_scipy.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_sentinel.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_shelve.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_slack_sdk.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_socket.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_sqlalchemy.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_streamlit.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_sys.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_tempfile.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_tenacity.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_text.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_threading.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_timer.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_traceback.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_traceback_funcs/__init__.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_traceback_funcs/chain.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_traceback_funcs/decorated_async.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_traceback_funcs/decorated_sync.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_traceback_funcs/error_bind.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_traceback_funcs/many.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_traceback_funcs/one.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_traceback_funcs/recursive.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_traceback_funcs/task_group_one.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_traceback_funcs/task_group_two.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_traceback_funcs/two.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_traceback_funcs/untraced.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_types.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_typing.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_typing_funcs/__init__.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_typing_funcs/no_future.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_typing_funcs/with_future.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_tzdata.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_tzlocal.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_uuid.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_version.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_warnings.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_whenever.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_zipfile.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/test_zoneinfo.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/altair.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/astor.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/asyncio.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/atomicwrites.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/atools.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/cachetools.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/click.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/concurrent.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/contextlib.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/contextvars.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/cryptography.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/cvxpy.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/dataclasses.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/datetime.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/enum.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/errors.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/eventkit.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/fastapi.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/fpdf2.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/functions.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/functools.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/getpass.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/git.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/hashlib.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/http.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/hypothesis.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/ipython.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/iterables.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/jupyter.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/logging.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/loguru.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/luigi.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/math.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/memory_profiler.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/modules.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/more_itertools.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/numpy.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/operator.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/optuna.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/orjson.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/os.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/parse.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/pathlib.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/period.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/pickle.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/platform.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/pqdm.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/py.typed +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/pydantic.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/pyinstrument.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/pyrsistent.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/pytest.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/pytest_regressions.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/python_dotenv.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/random.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/re.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/redis.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/reprlib.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/rich.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/scipy.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/sentinel.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/shelve.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/slack_sdk.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/socket.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/sqlalchemy.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/streamlit.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/sys.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/tempfile.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/tenacity.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/text.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/threading.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/timer.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/traceback.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/types.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/typing.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/tzdata.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/tzlocal.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/uuid.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/version.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/warnings.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/whenever.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/zipfile.py +0 -0
- {dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/utilities/zoneinfo.py +0 -0
@@ -1,9 +1,10 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: dycw-utilities
|
3
|
-
Version: 0.109.
|
3
|
+
Version: 0.109.10
|
4
4
|
Author-email: Derek Wan <d.wan@icloud.com>
|
5
5
|
License-File: LICENSE
|
6
6
|
Requires-Python: >=3.12
|
7
|
+
Requires-Dist: polars-ols>=0.3.5
|
7
8
|
Requires-Dist: typing-extensions<4.14,>=4.13.1
|
8
9
|
Provides-Extra: test
|
9
10
|
Requires-Dist: hypothesis<6.132,>=6.131.6; extra == 'test'
|
@@ -40,6 +40,7 @@ dev = [
|
|
40
40
|
"orjson >= 3.10.16, < 3.11",
|
41
41
|
"pathvalidate >= 3.2.3, < 3.3",
|
42
42
|
"polars-lts-cpu >= 1.27.1, < 1.28",
|
43
|
+
"polars-ols >= 0.3.5, < 0.4",
|
43
44
|
"pqdm >= 0.2.0, < 0.3",
|
44
45
|
"psycopg2-binary >= 2.9.10, < 2.10", # for sqlalchemy
|
45
46
|
"pydantic >= 2.11.2, < 2.12",
|
@@ -50,6 +51,7 @@ dev = [
|
|
50
51
|
"python-dotenv >= 1.1.0, < 1.2",
|
51
52
|
"redis >= 5.2.1, < 5.3",
|
52
53
|
"rich >= 14.0.0, < 14.1",
|
54
|
+
"scikit-learn >= 1.6.1, < 1.7",
|
53
55
|
"scipy >= 1.15.2, < 1.16",
|
54
56
|
"slack-sdk >= 3.35.0, < 3.36",
|
55
57
|
"sqlalchemy >= 2.0.40, < 2.1",
|
@@ -84,12 +86,13 @@ dev = [
|
|
84
86
|
[project]
|
85
87
|
authors = [{name = "Derek Wan", email = "d.wan@icloud.com"}]
|
86
88
|
dependencies = [
|
89
|
+
"polars-ols>=0.3.5",
|
87
90
|
"typing-extensions >= 4.13.1, < 4.14",
|
88
91
|
]
|
89
92
|
name = "dycw-utilities"
|
90
93
|
readme = "README.md"
|
91
94
|
requires-python = ">= 3.12"
|
92
|
-
version = "0.109.
|
95
|
+
version = "0.109.10"
|
93
96
|
|
94
97
|
[project.optional-dependencies]
|
95
98
|
test = [
|
@@ -332,7 +335,7 @@ zzz-test-zoneinfo = [
|
|
332
335
|
# bump-my-version
|
333
336
|
[tool.bumpversion]
|
334
337
|
allow_dirty = true
|
335
|
-
current_version = "0.109.
|
338
|
+
current_version = "0.109.10"
|
336
339
|
|
337
340
|
[[tool.bumpversion.files]]
|
338
341
|
filename = "src/utilities/__init__.py"
|
@@ -11,6 +11,7 @@ from pathlib import Path
|
|
11
11
|
from typing import TYPE_CHECKING, Any, ClassVar, Literal, cast
|
12
12
|
from uuid import UUID, uuid4
|
13
13
|
|
14
|
+
import hypothesis.strategies
|
14
15
|
import polars as pl
|
15
16
|
from hypothesis import given
|
16
17
|
from hypothesis.strategies import (
|
@@ -20,7 +21,6 @@ from hypothesis.strategies import (
|
|
20
21
|
data,
|
21
22
|
fixed_dictionaries,
|
22
23
|
floats,
|
23
|
-
integers,
|
24
24
|
lists,
|
25
25
|
none,
|
26
26
|
sampled_from,
|
@@ -50,10 +50,12 @@ from polars import (
|
|
50
50
|
from polars.testing import assert_frame_equal, assert_series_equal
|
51
51
|
from pytest import raises
|
52
52
|
|
53
|
+
import utilities.polars
|
53
54
|
from utilities.datetime import get_now, get_today
|
54
55
|
from utilities.hypothesis import (
|
55
56
|
assume_does_not_raise,
|
56
57
|
int64s,
|
58
|
+
pairs,
|
57
59
|
text_ascii,
|
58
60
|
zoned_datetimes,
|
59
61
|
)
|
@@ -129,11 +131,13 @@ from utilities.polars import (
|
|
129
131
|
map_over_columns,
|
130
132
|
nan_sum_agg,
|
131
133
|
nan_sum_cols,
|
134
|
+
normal,
|
132
135
|
replace_time_zone,
|
133
136
|
set_first_row_as_columns,
|
134
137
|
struct_dtype,
|
135
138
|
struct_from_dataclass,
|
136
139
|
touch,
|
140
|
+
uniform,
|
137
141
|
unique_element,
|
138
142
|
week_num,
|
139
143
|
yield_struct_series_dataclasses,
|
@@ -1210,7 +1214,7 @@ class TestGetDataTypeOrSeriesTimeZone:
|
|
1210
1214
|
|
1211
1215
|
|
1212
1216
|
class TestGetSeriesNumberOfDecimals:
|
1213
|
-
@given(data=data(), n=integers(1, 10), nullable=booleans())
|
1217
|
+
@given(data=data(), n=hypothesis.strategies.integers(1, 10), nullable=booleans())
|
1214
1218
|
def test_main(self, *, data: DataObject, n: int, nullable: bool) -> None:
|
1215
1219
|
strategy = int64s() | none() if nullable else int64s()
|
1216
1220
|
ints_or_none = data.draw(lists(strategy, min_size=1, max_size=10))
|
@@ -1312,6 +1316,37 @@ class TestInsertBetween:
|
|
1312
1316
|
_ = insert_between(self.df, "a", "c", lit(None).alias("new"))
|
1313
1317
|
|
1314
1318
|
|
1319
|
+
class TestIntegers:
|
1320
|
+
@given(
|
1321
|
+
length=hypothesis.strategies.integers(0, 10),
|
1322
|
+
high=hypothesis.strategies.integers(1, 10),
|
1323
|
+
)
|
1324
|
+
def test_int(self, *, length: int, high: int) -> None:
|
1325
|
+
series = utilities.polars.integers(length, high)
|
1326
|
+
assert series.len() == length
|
1327
|
+
assert series.is_between(0, high, closed="left").all()
|
1328
|
+
|
1329
|
+
@given(
|
1330
|
+
length=hypothesis.strategies.integers(0, 10),
|
1331
|
+
high=hypothesis.strategies.integers(1, 10),
|
1332
|
+
)
|
1333
|
+
def test_series(self, *, length: int, high: int) -> None:
|
1334
|
+
orig = int_range(end=length, eager=True)
|
1335
|
+
series = utilities.polars.integers(orig, high)
|
1336
|
+
assert series.len() == length
|
1337
|
+
assert series.is_between(0, high, closed="left").all()
|
1338
|
+
|
1339
|
+
@given(
|
1340
|
+
length=hypothesis.strategies.integers(0, 10),
|
1341
|
+
high=hypothesis.strategies.integers(1, 10),
|
1342
|
+
)
|
1343
|
+
def test_dataframe(self, *, length: int, high: int) -> None:
|
1344
|
+
df = int_range(end=length, eager=True).to_frame()
|
1345
|
+
series = utilities.polars.integers(df, high)
|
1346
|
+
assert series.len() == length
|
1347
|
+
assert series.is_between(0, high, closed="left").all()
|
1348
|
+
|
1349
|
+
|
1315
1350
|
class TestIsNullAndIsNotNullStructSeries:
|
1316
1351
|
@given(
|
1317
1352
|
case=sampled_from([
|
@@ -1526,6 +1561,28 @@ class TestNanSumCols:
|
|
1526
1561
|
assert df["z"].item() == expected
|
1527
1562
|
|
1528
1563
|
|
1564
|
+
class TestNormal:
|
1565
|
+
@given(length=hypothesis.strategies.integers(0, 10))
|
1566
|
+
def test_int(self, *, length: int) -> None:
|
1567
|
+
series = normal(length)
|
1568
|
+
assert series.len() == length
|
1569
|
+
assert series.is_finite().all()
|
1570
|
+
|
1571
|
+
@given(length=hypothesis.strategies.integers(0, 10))
|
1572
|
+
def test_series(self, *, length: int) -> None:
|
1573
|
+
orig = int_range(end=length, eager=True)
|
1574
|
+
series = normal(orig)
|
1575
|
+
assert series.len() == length
|
1576
|
+
assert series.is_finite().all()
|
1577
|
+
|
1578
|
+
@given(length=hypothesis.strategies.integers(0, 10))
|
1579
|
+
def test_dataframe(self, *, length: int) -> None:
|
1580
|
+
df = int_range(end=length, eager=True).to_frame()
|
1581
|
+
series = normal(df)
|
1582
|
+
assert series.len() == length
|
1583
|
+
assert series.is_finite().all()
|
1584
|
+
|
1585
|
+
|
1529
1586
|
class TestReplaceTimeZone:
|
1530
1587
|
def test_datetime(self) -> None:
|
1531
1588
|
now_utc = get_now()
|
@@ -1711,6 +1768,40 @@ class TestStructFromDataClass:
|
|
1711
1768
|
_ = struct_from_dataclass(Example)
|
1712
1769
|
|
1713
1770
|
|
1771
|
+
class TestUniform:
|
1772
|
+
@given(
|
1773
|
+
length=hypothesis.strategies.integers(0, 10),
|
1774
|
+
bounds=pairs(floats(0.0, 1.0), sorted=True),
|
1775
|
+
)
|
1776
|
+
def test_int(self, *, length: int, bounds: tuple[float, float]) -> None:
|
1777
|
+
low, high = bounds
|
1778
|
+
series = uniform(length, low=low, high=high)
|
1779
|
+
assert series.len() == length
|
1780
|
+
assert series.is_between(low, high).all()
|
1781
|
+
|
1782
|
+
@given(
|
1783
|
+
length=hypothesis.strategies.integers(0, 10),
|
1784
|
+
bounds=pairs(floats(0.0, 1.0), sorted=True),
|
1785
|
+
)
|
1786
|
+
def test_series(self, *, length: int, bounds: tuple[float, float]) -> None:
|
1787
|
+
low, high = bounds
|
1788
|
+
orig = int_range(end=length, eager=True)
|
1789
|
+
series = uniform(orig, low=low, high=high)
|
1790
|
+
assert series.len() == length
|
1791
|
+
assert series.is_between(low, high).all()
|
1792
|
+
|
1793
|
+
@given(
|
1794
|
+
length=hypothesis.strategies.integers(0, 10),
|
1795
|
+
bounds=pairs(floats(0.0, 1.0), sorted=True),
|
1796
|
+
)
|
1797
|
+
def test_dataframe(self, *, length: int, bounds: tuple[float, float]) -> None:
|
1798
|
+
low, high = bounds
|
1799
|
+
df = int_range(end=length, eager=True).to_frame()
|
1800
|
+
series = uniform(df, low=low, high=high)
|
1801
|
+
assert series.len() == length
|
1802
|
+
assert series.is_between(low, high).all()
|
1803
|
+
|
1804
|
+
|
1714
1805
|
class TestUniqueElement:
|
1715
1806
|
def test_main(self) -> None:
|
1716
1807
|
series = Series(
|
@@ -0,0 +1,103 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from hypothesis import given
|
4
|
+
from hypothesis.strategies import sampled_from
|
5
|
+
from numpy import isclose
|
6
|
+
from polars import DataFrame, Float64, Struct, UInt32, col
|
7
|
+
from polars.testing import assert_frame_equal
|
8
|
+
from sklearn.linear_model import LinearRegression
|
9
|
+
|
10
|
+
from utilities.polars import concat_series, integers, normal
|
11
|
+
from utilities.polars_ols import compute_rolling_ols
|
12
|
+
|
13
|
+
|
14
|
+
class TestComputeRollingOLS:
|
15
|
+
def test_ols_results(self) -> None:
|
16
|
+
result = self._df["ols"].struct.unnest().with_row_index()
|
17
|
+
# fmt: off
|
18
|
+
exp_values = [
|
19
|
+
(10, {"x1": 0.333396198442681, "x2": 0.6845517746145712, "const": 0.2808021232120448}, 59.921571424913495, 1.67032007883995, 0.9955364659986504),
|
20
|
+
(11, {"x1": 0.322785525889542, "x2": 0.6896341527044252, "const": 0.5401793852579858}, 15.974446064929626, -0.3429678871268038, 0.9961762567103958),
|
21
|
+
(12, {"x1": 0.31042868991153927, "x2": 0.7055685710743383, "const": 1.145326562525439}, -31.310827706894123, -0.45191863996575066, 0.998022262986332),
|
22
|
+
(13, {"x1": 0.33311466967931097, "x2": 0.684137842579758, "const": -0.7961518480794516}, 50.66821598287034, -2.975371834066671, 0.9974533939791341),
|
23
|
+
(14, {"x1": 0.35299385150914864, "x2": 0.6758890569593843, "const": -0.9377907849336107}, -0.8749325340834626, 1.0581261048863142, 0.9973453833170313),
|
24
|
+
(15, {"x1": 0.351300641938209, "x2": 0.6456834722890913, "const": -1.859577387752822}, 1.6809655259738476, 0.3217076349681922, 0.9951571413022856),
|
25
|
+
(16, {"x1": 0.3583378199895871, "x2": 0.6588347796692774, "const": -1.109675446287481}, 26.65448170418155, 2.496480675700724, 0.9933751737130443),
|
26
|
+
(17, {"x1": 0.36195632084801765, "x2": 0.658322951215466, "const": -1.3860237983291754}, 7.43453332939416, -0.791818995629618, 0.9905085882663488),
|
27
|
+
(18, {"x1": 0.35564162435283225, "x2": 0.6656931556738634, "const": -0.562680573000551}, -51.90315462605006, 0.6592474497562932, 0.9973576833556038),
|
28
|
+
(19, {"x1": 0.3100421300754357, "x2": 0.675357816881863, "const": 0.48493124625501927}, -36.70039604095908, -0.6071841038068868, 0.9978541580643828),
|
29
|
+
]
|
30
|
+
# fmt: on
|
31
|
+
expected = DataFrame(
|
32
|
+
data=exp_values,
|
33
|
+
schema={
|
34
|
+
"index": UInt32,
|
35
|
+
"coefficients": Struct({
|
36
|
+
"x1": Float64,
|
37
|
+
"x2": Float64,
|
38
|
+
"const": Float64,
|
39
|
+
}),
|
40
|
+
"predictions": Float64,
|
41
|
+
"residuals": Float64,
|
42
|
+
"R2": Float64,
|
43
|
+
},
|
44
|
+
orient="row",
|
45
|
+
)
|
46
|
+
assert_frame_equal(result[-10:], expected)
|
47
|
+
|
48
|
+
@given(
|
49
|
+
case=sampled_from([
|
50
|
+
(
|
51
|
+
slice(-7, -2),
|
52
|
+
[0.3619563208480195, 0.6583229512154678],
|
53
|
+
-1.386023798329262,
|
54
|
+
7.434533329394103,
|
55
|
+
0.994253238813284,
|
56
|
+
),
|
57
|
+
(
|
58
|
+
slice(-6, -1),
|
59
|
+
[0.35564162435283264, 0.6656931556738643],
|
60
|
+
-0.5626805730005437,
|
61
|
+
-51.903154626050124,
|
62
|
+
0.9979752966843768,
|
63
|
+
),
|
64
|
+
(
|
65
|
+
slice(-5, None),
|
66
|
+
[0.3100421300754358, 0.6753578168818635],
|
67
|
+
0.48493124625502837,
|
68
|
+
-36.70039604095908,
|
69
|
+
0.9977272526713715,
|
70
|
+
),
|
71
|
+
])
|
72
|
+
)
|
73
|
+
def test_tail(
|
74
|
+
self, *, case: tuple[slice, list[float], float, float, float]
|
75
|
+
) -> None:
|
76
|
+
slice_, coeffs, intercept, prediction, r2 = case
|
77
|
+
df = self._df[slice_]
|
78
|
+
X = df.select("x1", "x2").to_numpy() # noqa: N806
|
79
|
+
y = df.select("y").to_numpy()
|
80
|
+
model = LinearRegression()
|
81
|
+
model = model.fit(X, y)
|
82
|
+
assert isclose(model.coef_, coeffs).all()
|
83
|
+
assert isclose(model.intercept_, intercept)
|
84
|
+
assert isclose(model.predict(X)[-1], prediction).all()
|
85
|
+
assert isclose(model.score(X, y), r2)
|
86
|
+
|
87
|
+
@property
|
88
|
+
def _df(self) -> DataFrame:
|
89
|
+
n = 20
|
90
|
+
return (
|
91
|
+
concat_series(
|
92
|
+
integers(n, -100, high=100, seed=0).alias("x1"),
|
93
|
+
integers(n, -100, high=100, seed=1).alias("x2"),
|
94
|
+
)
|
95
|
+
.with_columns(
|
96
|
+
y=(col("x1") + 2 * col("x2") + normal(n, scale=10.0, seed=2)) / 3
|
97
|
+
)
|
98
|
+
.with_columns(
|
99
|
+
compute_rolling_ols(
|
100
|
+
"y", "x1", "x2", window_size=5, min_periods=5, add_intercept=True
|
101
|
+
)
|
102
|
+
)
|
103
|
+
)
|
@@ -1165,6 +1165,52 @@ class _InsertBetweenNonConsecutiveError(InsertBetweenError):
|
|
1165
1165
|
##
|
1166
1166
|
|
1167
1167
|
|
1168
|
+
def integers(
|
1169
|
+
obj: int | Series | DataFrame,
|
1170
|
+
low: int,
|
1171
|
+
/,
|
1172
|
+
*,
|
1173
|
+
high: int | None = None,
|
1174
|
+
seed: int | None = None,
|
1175
|
+
endpoint: bool = False,
|
1176
|
+
name: str | None = None,
|
1177
|
+
dtype: PolarsDataType = Int64,
|
1178
|
+
) -> Series:
|
1179
|
+
"""Construct a series of normally-distributed numbers."""
|
1180
|
+
match obj:
|
1181
|
+
case int() as height:
|
1182
|
+
from numpy.random import default_rng
|
1183
|
+
|
1184
|
+
rng = default_rng(seed=seed)
|
1185
|
+
values = rng.integers(low, high=high, size=height, endpoint=endpoint)
|
1186
|
+
return Series(name=name, values=values, dtype=dtype)
|
1187
|
+
case Series() as series:
|
1188
|
+
return integers(
|
1189
|
+
series.len(),
|
1190
|
+
low,
|
1191
|
+
high=high,
|
1192
|
+
seed=seed,
|
1193
|
+
endpoint=endpoint,
|
1194
|
+
name=name,
|
1195
|
+
dtype=dtype,
|
1196
|
+
)
|
1197
|
+
case DataFrame() as df:
|
1198
|
+
return integers(
|
1199
|
+
df.height,
|
1200
|
+
low,
|
1201
|
+
high=high,
|
1202
|
+
seed=seed,
|
1203
|
+
endpoint=endpoint,
|
1204
|
+
name=name,
|
1205
|
+
dtype=dtype,
|
1206
|
+
)
|
1207
|
+
case _ as never:
|
1208
|
+
assert_never(never)
|
1209
|
+
|
1210
|
+
|
1211
|
+
##
|
1212
|
+
|
1213
|
+
|
1168
1214
|
def is_not_null_struct_series(series: Series, /) -> Series:
|
1169
1215
|
"""Check if a struct-dtype Series is not null as per the <= 1.1 definition."""
|
1170
1216
|
try:
|
@@ -1324,6 +1370,39 @@ def nan_sum_cols(
|
|
1324
1370
|
##
|
1325
1371
|
|
1326
1372
|
|
1373
|
+
def normal(
|
1374
|
+
obj: int | Series | DataFrame,
|
1375
|
+
/,
|
1376
|
+
*,
|
1377
|
+
loc: float = 0.0,
|
1378
|
+
scale: float = 1.0,
|
1379
|
+
seed: int | None = None,
|
1380
|
+
name: str | None = None,
|
1381
|
+
dtype: PolarsDataType = Float64,
|
1382
|
+
) -> Series:
|
1383
|
+
"""Construct a series of normally-distributed numbers."""
|
1384
|
+
match obj:
|
1385
|
+
case int() as height:
|
1386
|
+
from numpy.random import default_rng
|
1387
|
+
|
1388
|
+
rng = default_rng(seed=seed)
|
1389
|
+
values = rng.normal(loc=loc, scale=scale, size=height)
|
1390
|
+
return Series(name=name, values=values, dtype=dtype)
|
1391
|
+
case Series() as series:
|
1392
|
+
return normal(
|
1393
|
+
series.len(), loc=loc, scale=scale, seed=seed, name=name, dtype=dtype
|
1394
|
+
)
|
1395
|
+
case DataFrame() as df:
|
1396
|
+
return normal(
|
1397
|
+
df.height, loc=loc, scale=scale, seed=seed, name=name, dtype=dtype
|
1398
|
+
)
|
1399
|
+
case _ as never:
|
1400
|
+
assert_never(never)
|
1401
|
+
|
1402
|
+
|
1403
|
+
##
|
1404
|
+
|
1405
|
+
|
1327
1406
|
@overload
|
1328
1407
|
def replace_time_zone(
|
1329
1408
|
obj: Series, /, *, time_zone: TimeZoneLike | None = UTC
|
@@ -1461,6 +1540,39 @@ class _StructFromDataClassTypeError(StructFromDataClassError):
|
|
1461
1540
|
##
|
1462
1541
|
|
1463
1542
|
|
1543
|
+
def uniform(
|
1544
|
+
obj: int | Series | DataFrame,
|
1545
|
+
/,
|
1546
|
+
*,
|
1547
|
+
low: float = 0.0,
|
1548
|
+
high: float = 1.0,
|
1549
|
+
seed: int | None = None,
|
1550
|
+
name: str | None = None,
|
1551
|
+
dtype: PolarsDataType = Float64,
|
1552
|
+
) -> Series:
|
1553
|
+
"""Construct a series of uniformly-distributed numbers."""
|
1554
|
+
match obj:
|
1555
|
+
case int() as height:
|
1556
|
+
from numpy.random import default_rng
|
1557
|
+
|
1558
|
+
rng = default_rng(seed=seed)
|
1559
|
+
values = rng.uniform(low=low, high=high, size=height)
|
1560
|
+
return Series(name=name, values=values, dtype=dtype)
|
1561
|
+
case Series() as series:
|
1562
|
+
return uniform(
|
1563
|
+
series.len(), low=low, high=high, seed=seed, name=name, dtype=dtype
|
1564
|
+
)
|
1565
|
+
case DataFrame() as df:
|
1566
|
+
return uniform(
|
1567
|
+
df.height, low=low, high=high, seed=seed, name=name, dtype=dtype
|
1568
|
+
)
|
1569
|
+
case _ as never:
|
1570
|
+
assert_never(never)
|
1571
|
+
|
1572
|
+
|
1573
|
+
##
|
1574
|
+
|
1575
|
+
|
1464
1576
|
def unique_element(column: ExprLike, /) -> Expr:
|
1465
1577
|
"""Get the unique element in a list."""
|
1466
1578
|
column = ensure_expr_or_series(column)
|
@@ -1645,17 +1757,20 @@ __all__ = [
|
|
1645
1757
|
"insert_after",
|
1646
1758
|
"insert_before",
|
1647
1759
|
"insert_between",
|
1760
|
+
"integers",
|
1648
1761
|
"is_not_null_struct_series",
|
1649
1762
|
"is_null_struct_series",
|
1650
1763
|
"join",
|
1651
1764
|
"map_over_columns",
|
1652
1765
|
"nan_sum_agg",
|
1653
1766
|
"nan_sum_cols",
|
1767
|
+
"normal",
|
1654
1768
|
"replace_time_zone",
|
1655
1769
|
"set_first_row_as_columns",
|
1656
1770
|
"struct_dtype",
|
1657
1771
|
"struct_from_dataclass",
|
1658
1772
|
"touch",
|
1773
|
+
"uniform",
|
1659
1774
|
"unique_element",
|
1660
1775
|
"yield_struct_series_dataclasses",
|
1661
1776
|
"yield_struct_series_elements",
|
@@ -0,0 +1,71 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from typing import TYPE_CHECKING
|
4
|
+
|
5
|
+
from polars import struct
|
6
|
+
from polars_ols import RollingKwargs, compute_rolling_least_squares
|
7
|
+
|
8
|
+
from utilities.polars import ensure_expr_or_series
|
9
|
+
|
10
|
+
if TYPE_CHECKING:
|
11
|
+
from polars import Expr
|
12
|
+
from polars_ols import NullPolicy
|
13
|
+
|
14
|
+
from utilities.polars import ExprLike
|
15
|
+
|
16
|
+
|
17
|
+
def compute_rolling_ols(
|
18
|
+
target: ExprLike,
|
19
|
+
*features: ExprLike,
|
20
|
+
sample_weights: ExprLike | None = None,
|
21
|
+
add_intercept: bool = False,
|
22
|
+
null_policy: NullPolicy = "drop_window",
|
23
|
+
window_size: int = 1000000,
|
24
|
+
min_periods: int | None = None,
|
25
|
+
use_woodbury: bool | None = None,
|
26
|
+
alpha: float | None = None,
|
27
|
+
) -> Expr:
|
28
|
+
"""Compute a rolling OLS."""
|
29
|
+
target = ensure_expr_or_series(target)
|
30
|
+
rolling_kwargs = RollingKwargs(
|
31
|
+
null_policy=null_policy,
|
32
|
+
window_size=window_size,
|
33
|
+
min_periods=min_periods,
|
34
|
+
use_woodbury=use_woodbury,
|
35
|
+
alpha=alpha,
|
36
|
+
)
|
37
|
+
coefficients = compute_rolling_least_squares(
|
38
|
+
target,
|
39
|
+
*features,
|
40
|
+
sample_weights=sample_weights,
|
41
|
+
add_intercept=add_intercept,
|
42
|
+
mode="coefficients",
|
43
|
+
rolling_kwargs=rolling_kwargs,
|
44
|
+
).alias("coefficients")
|
45
|
+
predictions = compute_rolling_least_squares(
|
46
|
+
target,
|
47
|
+
*features,
|
48
|
+
sample_weights=sample_weights,
|
49
|
+
add_intercept=add_intercept,
|
50
|
+
mode="predictions",
|
51
|
+
rolling_kwargs=rolling_kwargs,
|
52
|
+
).alias("predictions")
|
53
|
+
residuals = compute_rolling_least_squares(
|
54
|
+
target,
|
55
|
+
*features,
|
56
|
+
sample_weights=sample_weights,
|
57
|
+
add_intercept=add_intercept,
|
58
|
+
mode="residuals",
|
59
|
+
rolling_kwargs=rolling_kwargs,
|
60
|
+
).alias("residuals")
|
61
|
+
ssr = (residuals**2).rolling_sum(window_size, min_samples=min_periods).alias("SSR")
|
62
|
+
sst = (
|
63
|
+
((target - target.rolling_mean(window_size, min_samples=min_periods)) ** 2)
|
64
|
+
.rolling_sum(window_size, min_samples=min_periods)
|
65
|
+
.alias("SST")
|
66
|
+
)
|
67
|
+
r2 = (1 - ssr / sst).alias("R2")
|
68
|
+
return struct(coefficients, predictions, residuals, r2).alias("ols")
|
69
|
+
|
70
|
+
|
71
|
+
__all__ = ["compute_rolling_ols"]
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/modules/package_missing/__init__.py
RENAMED
File without changes
|
{dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/modules/package_missing/module.py
RENAMED
File without changes
|
{dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/modules/package_with/__init__.py
RENAMED
File without changes
|
{dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/modules/package_with/outer_1.py
RENAMED
File without changes
|
{dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/modules/package_with/outer_2.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/modules/package_without/__init__.py
RENAMED
File without changes
|
{dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/modules/package_without/module_1.py
RENAMED
File without changes
|
{dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/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
|
{dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/scripts/test_async_service/__init__.py
RENAMED
File without changes
|
{dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/scripts/test_async_service/__main__.py
RENAMED
File without changes
|
{dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/scripts/test_async_service/run.sh
RENAMED
File without changes
|
File without changes
|
File without changes
|
{dycw_utilities-0.109.8 → dycw_utilities-0.109.10}/src/tests/scripts/test_queue_processor/run.sh
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
|