dycw-utilities 0.155.1__tar.gz → 0.155.3__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.155.1 → dycw_utilities-0.155.3}/PKG-INFO +1 -1
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/pyproject.toml +2 -2
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_altair.py +2 -2
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_orjson.py +2 -2
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_polars.py +69 -107
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/__init__.py +1 -1
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/polars.py +50 -100
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/sqlalchemy_polars.py +2 -2
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/.gitignore +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/LICENSE +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/README.md +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/__init__.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/conftest.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/modules/__init__.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/modules/package_missing/__init__.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/modules/package_missing/module.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/modules/package_with/__init__.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/modules/package_with/outer_1.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/modules/package_with/outer_2.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/modules/package_without/__init__.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/modules/package_without/module_1.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/modules/package_without/module_2.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/modules/standalone.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/modules/with_imports.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_asyncio.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_atomicwrites.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_atools.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_cachetools.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_click.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_concurrent.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_contextlib.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_contextvars.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_cryptography.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_cvxpy.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_dataclasses.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_enum.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_errors.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_eventkit.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_fastapi.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_fpdf2.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_functions.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_functools.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_getpass.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_gzip.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_hashlib.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_http.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_hypothesis.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_importlib.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_inflect.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_ipython.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_iterables.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_json.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_jupyter.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_libcst.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_lightweight_charts.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_logging.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_math.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_memory_profiler.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_modules.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_more_itertools.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_numpy.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_objects/__init__.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_objects/objects.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_operator.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_optuna.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_os.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_parse.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_pathlib.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_pickle.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_platform.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_polars_ols.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_postgres.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_pottery.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_pqdm.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_psutil.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_pyinstrument.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_pytest.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_pytest_randomly.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_pytest_regressions.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_random.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_re.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_redis.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_reprlib.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_scipy.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_sentinel.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_shelve.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_slack_sdk.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_socket.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_sqlalchemy.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_sqlalchemy_polars.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_statsmodels.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_string.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_tempfile.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_text.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_threading.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_timer.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_traceback.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_typed_settings.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_types.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_typing.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_typing_funcs/__init__.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_typing_funcs/no_future.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_typing_funcs/with_future.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_tzdata.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_tzlocal.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_uuid.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_version.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_warnings.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_whenever.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_yield_access/__init__.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_yield_access/script.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_yield_access/script.sh +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_zipfile.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_zoneinfo.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/altair.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/asyncio.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/atomicwrites.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/atools.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/cachetools.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/click.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/concurrent.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/contextlib.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/contextvars.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/cryptography.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/cvxpy.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/dataclasses.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/enum.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/errors.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/eventkit.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/fastapi.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/fpdf2.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/functions.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/functools.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/getpass.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/gzip.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/hashlib.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/http.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/hypothesis.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/importlib.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/inflect.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/ipython.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/iterables.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/json.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/jupyter.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/libcst.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/lightweight_charts.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/logging.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/math.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/memory_profiler.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/modules.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/more_itertools.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/numpy.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/operator.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/optuna.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/orjson.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/os.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/parse.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/pathlib.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/pickle.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/platform.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/polars_ols.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/postgres.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/pottery.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/pqdm.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/psutil.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/py.typed +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/pyinstrument.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/pytest.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/pytest_plugins/__init__.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/pytest_plugins/pytest_randomly.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/pytest_plugins/pytest_regressions.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/pytest_regressions.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/random.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/re.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/redis.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/reprlib.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/scipy.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/sentinel.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/shelve.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/slack_sdk.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/socket.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/sqlalchemy.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/statsmodels.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/string.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/tempfile.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/text.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/threading.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/timer.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/traceback.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/typed_settings.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/types.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/typing.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/tzdata.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/tzlocal.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/uuid.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/version.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/warnings.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/whenever.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/zipfile.py +0 -0
- {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/zoneinfo.py +0 -0
@@ -227,7 +227,7 @@ dependencies = [
|
|
227
227
|
name = "dycw-utilities"
|
228
228
|
readme = "README.md"
|
229
229
|
requires-python = ">= 3.12"
|
230
|
-
version = "0.155.
|
230
|
+
version = "0.155.3"
|
231
231
|
|
232
232
|
[project.entry-points.pytest11]
|
233
233
|
pytest-randomly = "utilities.pytest_plugins.pytest_randomly"
|
@@ -259,7 +259,7 @@ test = [
|
|
259
259
|
# bump-my-version
|
260
260
|
[tool.bumpversion]
|
261
261
|
allow_dirty = true
|
262
|
-
current_version = "0.155.
|
262
|
+
current_version = "0.155.3"
|
263
263
|
|
264
264
|
[[tool.bumpversion.files]]
|
265
265
|
filename = "src/utilities/__init__.py"
|
@@ -28,7 +28,7 @@ from utilities.altair import (
|
|
28
28
|
)
|
29
29
|
from utilities.functions import ensure_class
|
30
30
|
from utilities.hypothesis import dates, text_ascii, zoned_date_times
|
31
|
-
from utilities.polars import DatetimeUTC,
|
31
|
+
from utilities.polars import DatetimeUTC, zoned_date_time_dtype
|
32
32
|
from utilities.tzdata import HongKong, Tokyo
|
33
33
|
from utilities.whenever import get_now
|
34
34
|
from utilities.zoneinfo import UTC
|
@@ -98,7 +98,7 @@ class TestPlotDataFrames:
|
|
98
98
|
df = DataFrame(
|
99
99
|
data=[(dt.datetime(2000, 1, 1, 12, tzinfo=time_zone), 0.0)],
|
100
100
|
schema={
|
101
|
-
"datetime":
|
101
|
+
"datetime": zoned_date_time_dtype(time_zone=time_zone),
|
102
102
|
"value": Float64,
|
103
103
|
},
|
104
104
|
orient="row",
|
@@ -81,7 +81,7 @@ from utilities.orjson import (
|
|
81
81
|
serialize,
|
82
82
|
write_object,
|
83
83
|
)
|
84
|
-
from utilities.polars import check_polars_dataframe,
|
84
|
+
from utilities.polars import check_polars_dataframe, zoned_date_time_dtype
|
85
85
|
from utilities.sentinel import Sentinel, sentinel
|
86
86
|
from utilities.types import LogLevel, MaybeIterable, PathLike
|
87
87
|
from utilities.typing import get_args
|
@@ -176,7 +176,7 @@ class TestGetLogRecords:
|
|
176
176
|
"level": UInt64,
|
177
177
|
"path_name": String,
|
178
178
|
"line_num": UInt64,
|
179
|
-
"datetime":
|
179
|
+
"datetime": zoned_date_time_dtype(time_zone=LOCAL_TIME_ZONE),
|
180
180
|
"func_name": String,
|
181
181
|
"stack_info": String,
|
182
182
|
"extra": Object,
|
@@ -48,7 +48,6 @@ from polars import (
|
|
48
48
|
col,
|
49
49
|
concat,
|
50
50
|
date_range,
|
51
|
-
datetime_range,
|
52
51
|
int_range,
|
53
52
|
lit,
|
54
53
|
struct,
|
@@ -63,6 +62,7 @@ import tests.test_math
|
|
63
62
|
import utilities.polars
|
64
63
|
from utilities.hypothesis import (
|
65
64
|
date_deltas,
|
65
|
+
date_periods,
|
66
66
|
date_time_deltas,
|
67
67
|
dates,
|
68
68
|
float64s,
|
@@ -72,7 +72,9 @@ from utilities.hypothesis import (
|
|
72
72
|
temp_paths,
|
73
73
|
text_ascii,
|
74
74
|
time_deltas,
|
75
|
+
time_periods,
|
75
76
|
times,
|
77
|
+
zoned_date_time_periods,
|
76
78
|
zoned_date_times,
|
77
79
|
)
|
78
80
|
from utilities.math import number_of_decimals
|
@@ -82,6 +84,7 @@ from utilities.polars import (
|
|
82
84
|
AppendDataClassError,
|
83
85
|
BooleanValueCountsError,
|
84
86
|
ColumnsToDictError,
|
87
|
+
DatePeriodDType,
|
85
88
|
DatetimeHongKong,
|
86
89
|
DatetimeTokyo,
|
87
90
|
DatetimeUSCentral,
|
@@ -95,7 +98,7 @@ from utilities.polars import (
|
|
95
98
|
IsNotNullStructSeriesError,
|
96
99
|
IsNullStructSeriesError,
|
97
100
|
SetFirstRowAsColumnsError,
|
98
|
-
|
101
|
+
TimePeriodDType,
|
99
102
|
_check_polars_dataframe_predicates,
|
100
103
|
_check_polars_dataframe_schema_list,
|
101
104
|
_check_polars_dataframe_schema_set,
|
@@ -134,6 +137,8 @@ from utilities.polars import (
|
|
134
137
|
_reconstruct_schema,
|
135
138
|
_ReifyExprsEmptyError,
|
136
139
|
_ReifyExprsSeriesNonUniqueError,
|
140
|
+
_StructFromDataClassNotADataclassError,
|
141
|
+
_StructFromDataClassTypeError,
|
137
142
|
ac_halflife,
|
138
143
|
acf,
|
139
144
|
adjust_frequencies,
|
@@ -145,7 +150,6 @@ from utilities.polars import (
|
|
145
150
|
are_frames_equal,
|
146
151
|
bernoulli,
|
147
152
|
boolean_value_counts,
|
148
|
-
ceil_datetime,
|
149
153
|
check_polars_dataframe,
|
150
154
|
choice,
|
151
155
|
collect_series,
|
@@ -164,7 +168,6 @@ from utilities.polars import (
|
|
164
168
|
ensure_expr_or_series,
|
165
169
|
ensure_expr_or_series_many,
|
166
170
|
finite_ewm_mean,
|
167
|
-
floor_datetime,
|
168
171
|
get_data_type_or_series_time_zone,
|
169
172
|
get_expr_name,
|
170
173
|
get_frequency_spectrum,
|
@@ -202,8 +205,8 @@ from utilities.polars import (
|
|
202
205
|
week_num,
|
203
206
|
write_dataframe,
|
204
207
|
write_series,
|
205
|
-
|
206
|
-
|
208
|
+
zoned_date_time_dtype,
|
209
|
+
zoned_date_time_period_dtype,
|
207
210
|
)
|
208
211
|
from utilities.sentinel import Sentinel, sentinel
|
209
212
|
from utilities.tzdata import HongKong, Tokyo, USCentral, USEastern
|
@@ -532,44 +535,6 @@ class TestBooleanValueCounts:
|
|
532
535
|
_ = boolean_value_counts(self.df, col("x").cast(Int64).alias("z"))
|
533
536
|
|
534
537
|
|
535
|
-
class TestCeilDateTime:
|
536
|
-
start: ClassVar[dt.datetime] = dt.datetime(2000, 1, 1, 0, 0, tzinfo=UTC)
|
537
|
-
end: ClassVar[dt.datetime] = dt.datetime(2000, 1, 1, 0, 3, tzinfo=UTC)
|
538
|
-
expected: ClassVar[Series] = Series(
|
539
|
-
values=[
|
540
|
-
dt.datetime(2000, 1, 1, 0, 0, tzinfo=UTC),
|
541
|
-
dt.datetime(2000, 1, 1, 0, 1, tzinfo=UTC),
|
542
|
-
dt.datetime(2000, 1, 1, 0, 1, tzinfo=UTC),
|
543
|
-
dt.datetime(2000, 1, 1, 0, 1, tzinfo=UTC),
|
544
|
-
dt.datetime(2000, 1, 1, 0, 1, tzinfo=UTC),
|
545
|
-
dt.datetime(2000, 1, 1, 0, 1, tzinfo=UTC),
|
546
|
-
dt.datetime(2000, 1, 1, 0, 1, tzinfo=UTC),
|
547
|
-
dt.datetime(2000, 1, 1, 0, 2, tzinfo=UTC),
|
548
|
-
dt.datetime(2000, 1, 1, 0, 2, tzinfo=UTC),
|
549
|
-
dt.datetime(2000, 1, 1, 0, 2, tzinfo=UTC),
|
550
|
-
dt.datetime(2000, 1, 1, 0, 2, tzinfo=UTC),
|
551
|
-
dt.datetime(2000, 1, 1, 0, 2, tzinfo=UTC),
|
552
|
-
dt.datetime(2000, 1, 1, 0, 2, tzinfo=UTC),
|
553
|
-
dt.datetime(2000, 1, 1, 0, 3, tzinfo=UTC),
|
554
|
-
dt.datetime(2000, 1, 1, 0, 3, tzinfo=UTC),
|
555
|
-
dt.datetime(2000, 1, 1, 0, 3, tzinfo=UTC),
|
556
|
-
dt.datetime(2000, 1, 1, 0, 3, tzinfo=UTC),
|
557
|
-
dt.datetime(2000, 1, 1, 0, 3, tzinfo=UTC),
|
558
|
-
dt.datetime(2000, 1, 1, 0, 3, tzinfo=UTC),
|
559
|
-
]
|
560
|
-
)
|
561
|
-
|
562
|
-
def test_expr(self) -> None:
|
563
|
-
data = datetime_range(self.start, self.end, interval="10s")
|
564
|
-
result = collect_series(ceil_datetime(data, "1m"))
|
565
|
-
assert_series_equal(result, self.expected, check_names=False)
|
566
|
-
|
567
|
-
def test_series(self) -> None:
|
568
|
-
data = datetime_range(self.start, self.end, interval="10s", eager=True)
|
569
|
-
result = ceil_datetime(data, "1m")
|
570
|
-
assert_series_equal(result, self.expected, check_names=False)
|
571
|
-
|
572
|
-
|
573
538
|
class TestCheckPolarsDataFrame:
|
574
539
|
def test_main(self) -> None:
|
575
540
|
df = DataFrame()
|
@@ -1054,6 +1019,16 @@ class TestDataClassToDataFrame:
|
|
1054
1019
|
df = dataclass_to_dataframe(objs)
|
1055
1020
|
check_polars_dataframe(df, height=len(objs), schema_list={"x": Duration})
|
1056
1021
|
|
1022
|
+
@given(data=data())
|
1023
|
+
def test_date_period(self, *, data: DataObject) -> None:
|
1024
|
+
@dataclass(kw_only=True, slots=True)
|
1025
|
+
class Example:
|
1026
|
+
x: DatePeriod
|
1027
|
+
|
1028
|
+
objs = data.draw(lists(builds(Example, x=date_periods()), min_size=1))
|
1029
|
+
df = dataclass_to_dataframe(objs, globalns=globals())
|
1030
|
+
check_polars_dataframe(df, height=len(objs), schema_list={"x": DatePeriodDType})
|
1031
|
+
|
1057
1032
|
@given(data=data())
|
1058
1033
|
def test_date_time_delta(self, *, data: DataObject) -> None:
|
1059
1034
|
@dataclass(kw_only=True, slots=True)
|
@@ -1066,6 +1041,23 @@ class TestDataClassToDataFrame:
|
|
1066
1041
|
df = dataclass_to_dataframe(objs)
|
1067
1042
|
check_polars_dataframe(df, height=len(objs), schema_list={"x": Duration})
|
1068
1043
|
|
1044
|
+
@given(data=data())
|
1045
|
+
def test_multiple_periods(self, *, data: DataObject) -> None:
|
1046
|
+
@dataclass(kw_only=True, slots=True)
|
1047
|
+
class Example:
|
1048
|
+
x: DatePeriod
|
1049
|
+
y: DatePeriod
|
1050
|
+
|
1051
|
+
objs = data.draw(
|
1052
|
+
lists(builds(Example, x=date_periods(), y=date_periods()), min_size=1)
|
1053
|
+
)
|
1054
|
+
df = dataclass_to_dataframe(objs, globalns=globals())
|
1055
|
+
check_polars_dataframe(
|
1056
|
+
df,
|
1057
|
+
height=len(objs),
|
1058
|
+
schema_list={"x": DatePeriodDType, "y": DatePeriodDType},
|
1059
|
+
)
|
1060
|
+
|
1069
1061
|
@given(data=data())
|
1070
1062
|
def test_nested(self, *, data: DataObject) -> None:
|
1071
1063
|
@dataclass(kw_only=True, slots=True)
|
@@ -1112,6 +1104,16 @@ class TestDataClassToDataFrame:
|
|
1112
1104
|
df = dataclass_to_dataframe(objs)
|
1113
1105
|
check_polars_dataframe(df, height=len(objs), schema_list={"x": Duration})
|
1114
1106
|
|
1107
|
+
@given(data=data())
|
1108
|
+
def test_time_period(self, *, data: DataObject) -> None:
|
1109
|
+
@dataclass(kw_only=True, slots=True)
|
1110
|
+
class Example:
|
1111
|
+
x: TimePeriod
|
1112
|
+
|
1113
|
+
objs = data.draw(lists(builds(Example, x=time_periods()), min_size=1))
|
1114
|
+
df = dataclass_to_dataframe(objs, globalns=globals())
|
1115
|
+
check_polars_dataframe(df, height=len(objs), schema_list={"x": TimePeriodDType})
|
1116
|
+
|
1115
1117
|
@given(data=data())
|
1116
1118
|
def test_uuid(self, *, data: DataObject) -> None:
|
1117
1119
|
@dataclass(kw_only=True, slots=True)
|
@@ -1131,7 +1133,21 @@ class TestDataClassToDataFrame:
|
|
1131
1133
|
objs = data.draw(lists(builds(Example, x=zoned_date_times()), min_size=1))
|
1132
1134
|
df = dataclass_to_dataframe(objs, localns=locals())
|
1133
1135
|
check_polars_dataframe(
|
1134
|
-
df, height=len(objs), schema_list={"x":
|
1136
|
+
df, height=len(objs), schema_list={"x": zoned_date_time_dtype()}
|
1137
|
+
)
|
1138
|
+
|
1139
|
+
@given(data=data())
|
1140
|
+
def test_zoned_datetime_period(self, *, data: DataObject) -> None:
|
1141
|
+
@dataclass(kw_only=True, slots=True)
|
1142
|
+
class Example:
|
1143
|
+
x: ZonedDateTimePeriod
|
1144
|
+
|
1145
|
+
objs = data.draw(
|
1146
|
+
lists(builds(Example, x=zoned_date_time_periods()), min_size=1)
|
1147
|
+
)
|
1148
|
+
df = dataclass_to_dataframe(objs, globalns=globals())
|
1149
|
+
check_polars_dataframe(
|
1150
|
+
df, height=len(objs), schema_list={"x": zoned_date_time_period_dtype()}
|
1135
1151
|
)
|
1136
1152
|
|
1137
1153
|
def test_error_empty(self) -> None:
|
@@ -1565,44 +1581,6 @@ class TestFiniteEWMWeights:
|
|
1565
1581
|
_ = _finite_ewm_weights(min_weight=1.0)
|
1566
1582
|
|
1567
1583
|
|
1568
|
-
class TestFloorDateTime:
|
1569
|
-
start: ClassVar[dt.datetime] = dt.datetime(2000, 1, 1, 0, 0, tzinfo=UTC)
|
1570
|
-
end: ClassVar[dt.datetime] = dt.datetime(2000, 1, 1, 0, 3, tzinfo=UTC)
|
1571
|
-
expected: ClassVar[Series] = Series(
|
1572
|
-
values=[
|
1573
|
-
dt.datetime(2000, 1, 1, 0, 0, tzinfo=UTC),
|
1574
|
-
dt.datetime(2000, 1, 1, 0, 0, tzinfo=UTC),
|
1575
|
-
dt.datetime(2000, 1, 1, 0, 0, tzinfo=UTC),
|
1576
|
-
dt.datetime(2000, 1, 1, 0, 0, tzinfo=UTC),
|
1577
|
-
dt.datetime(2000, 1, 1, 0, 0, tzinfo=UTC),
|
1578
|
-
dt.datetime(2000, 1, 1, 0, 0, tzinfo=UTC),
|
1579
|
-
dt.datetime(2000, 1, 1, 0, 1, tzinfo=UTC),
|
1580
|
-
dt.datetime(2000, 1, 1, 0, 1, tzinfo=UTC),
|
1581
|
-
dt.datetime(2000, 1, 1, 0, 1, tzinfo=UTC),
|
1582
|
-
dt.datetime(2000, 1, 1, 0, 1, tzinfo=UTC),
|
1583
|
-
dt.datetime(2000, 1, 1, 0, 1, tzinfo=UTC),
|
1584
|
-
dt.datetime(2000, 1, 1, 0, 1, tzinfo=UTC),
|
1585
|
-
dt.datetime(2000, 1, 1, 0, 2, tzinfo=UTC),
|
1586
|
-
dt.datetime(2000, 1, 1, 0, 2, tzinfo=UTC),
|
1587
|
-
dt.datetime(2000, 1, 1, 0, 2, tzinfo=UTC),
|
1588
|
-
dt.datetime(2000, 1, 1, 0, 2, tzinfo=UTC),
|
1589
|
-
dt.datetime(2000, 1, 1, 0, 2, tzinfo=UTC),
|
1590
|
-
dt.datetime(2000, 1, 1, 0, 2, tzinfo=UTC),
|
1591
|
-
dt.datetime(2000, 1, 1, 0, 3, tzinfo=UTC),
|
1592
|
-
]
|
1593
|
-
)
|
1594
|
-
|
1595
|
-
def test_expr(self) -> None:
|
1596
|
-
data = datetime_range(self.start, self.end, interval="10s")
|
1597
|
-
result = collect_series(floor_datetime(data, "1m"))
|
1598
|
-
assert_series_equal(result, self.expected, check_names=False)
|
1599
|
-
|
1600
|
-
def test_series(self) -> None:
|
1601
|
-
data = datetime_range(self.start, self.end, interval="10s", eager=True)
|
1602
|
-
result = floor_datetime(data, "1m")
|
1603
|
-
assert_series_equal(result, self.expected, check_names=False)
|
1604
|
-
|
1605
|
-
|
1606
1584
|
class TestGetDataTypeOrSeriesTimeZone:
|
1607
1585
|
@given(
|
1608
1586
|
time_zone=sampled_from([HongKong, UTC]),
|
@@ -1618,9 +1596,9 @@ class TestGetDataTypeOrSeriesTimeZone:
|
|
1618
1596
|
) -> None:
|
1619
1597
|
match flat_or_struct:
|
1620
1598
|
case "flat":
|
1621
|
-
dtype =
|
1599
|
+
dtype = zoned_date_time_dtype(time_zone=time_zone)
|
1622
1600
|
case "struct":
|
1623
|
-
dtype =
|
1601
|
+
dtype = zoned_date_time_period_dtype(time_zone=time_zone)
|
1624
1602
|
case never:
|
1625
1603
|
assert_never(never)
|
1626
1604
|
match dtype_or_series:
|
@@ -2369,7 +2347,7 @@ class TestPeriodRange:
|
|
2369
2347
|
def test_main(self, *, end_or_length: ZonedDateTime | int) -> None:
|
2370
2348
|
rng = period_range(self.start, end_or_length, interval="1h", eager=True)
|
2371
2349
|
assert len(rng) == 3
|
2372
|
-
assert rng.dtype ==
|
2350
|
+
assert rng.dtype == zoned_date_time_period_dtype()
|
2373
2351
|
assert rng[0]["start"] == self.start.py_datetime()
|
2374
2352
|
assert rng[-1]["end"] == self.end.py_datetime()
|
2375
2353
|
|
@@ -2626,15 +2604,6 @@ class TestStructFromDataClass:
|
|
2626
2604
|
})
|
2627
2605
|
assert result == expected
|
2628
2606
|
|
2629
|
-
def test_datetime(self) -> None:
|
2630
|
-
@dataclass(kw_only=True, slots=True)
|
2631
|
-
class Example:
|
2632
|
-
field: dt.datetime
|
2633
|
-
|
2634
|
-
result = struct_from_dataclass(Example, time_zone=UTC, globalns=globals())
|
2635
|
-
expected = Struct({"field": DatetimeUTC})
|
2636
|
-
assert result == expected
|
2637
|
-
|
2638
2607
|
def test_enum(self) -> None:
|
2639
2608
|
class Truth(enum.Enum):
|
2640
2609
|
true = auto()
|
@@ -2715,25 +2684,18 @@ class TestStructFromDataClass:
|
|
2715
2684
|
|
2716
2685
|
def test_not_a_dataclass_error(self) -> None:
|
2717
2686
|
with raises(
|
2718
|
-
|
2687
|
+
_StructFromDataClassNotADataclassError,
|
2688
|
+
match="Object must be a dataclass; got None",
|
2719
2689
|
):
|
2720
2690
|
_ = struct_from_dataclass(cast("Any", None))
|
2721
2691
|
|
2722
|
-
def test_missing_time_zone_error(self) -> None:
|
2723
|
-
@dataclass(kw_only=True, slots=True)
|
2724
|
-
class Example:
|
2725
|
-
field: dt.datetime
|
2726
|
-
|
2727
|
-
with raises(StructFromDataClassError, match="Time-zone must be given"):
|
2728
|
-
_ = struct_from_dataclass(Example, globalns=globals())
|
2729
|
-
|
2730
2692
|
def test_missing_type_error(self) -> None:
|
2731
2693
|
@dataclass(kw_only=True, slots=True)
|
2732
2694
|
class Example:
|
2733
2695
|
field: None
|
2734
2696
|
|
2735
2697
|
with raises(
|
2736
|
-
|
2698
|
+
_StructFromDataClassTypeError, match="Unsupported type: <class 'NoneType'>"
|
2737
2699
|
):
|
2738
2700
|
_ = struct_from_dataclass(Example)
|
2739
2701
|
|
@@ -3043,7 +3005,7 @@ class TestWeekNum:
|
|
3043
3005
|
|
3044
3006
|
class TestZonedDateTimeDType:
|
3045
3007
|
def test_main(self) -> None:
|
3046
|
-
dtype =
|
3008
|
+
dtype = zoned_date_time_dtype(time_zone=UTC)
|
3047
3009
|
assert isinstance(dtype, Datetime)
|
3048
3010
|
assert dtype.time_zone is not None
|
3049
3011
|
|
@@ -3051,5 +3013,5 @@ class TestZonedDateTimeDType:
|
|
3051
3013
|
class TestZonedDateTimePeriodDType:
|
3052
3014
|
@given(time_zone=sampled_from([UTC, (UTC, UTC)]))
|
3053
3015
|
def test_main(self, *, time_zone: ZoneInfo | tuple[ZoneInfo, ZoneInfo]) -> None:
|
3054
|
-
dtype =
|
3016
|
+
dtype = zoned_date_time_period_dtype(time_zone=time_zone)
|
3055
3017
|
assert isinstance(dtype, Struct)
|
@@ -1,6 +1,5 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
|
-
import datetime as dt
|
4
3
|
import enum
|
5
4
|
from collections.abc import Callable, Iterator, Sequence
|
6
5
|
from collections.abc import Set as AbstractSet
|
@@ -136,6 +135,10 @@ DatetimeTokyo = Datetime(time_zone="Asia/Tokyo")
|
|
136
135
|
DatetimeUSCentral = Datetime(time_zone="US/Central")
|
137
136
|
DatetimeUSEastern = Datetime(time_zone="US/Eastern")
|
138
137
|
DatetimeUTC = Datetime(time_zone="UTC")
|
138
|
+
DatePeriodDType = Struct({"start": pl.Date, "end": pl.Date})
|
139
|
+
TimePeriodDType = Struct({"start": pl.Time, "end": pl.Time})
|
140
|
+
|
141
|
+
|
139
142
|
_FINITE_EWM_MIN_WEIGHT = 0.9999
|
140
143
|
|
141
144
|
|
@@ -458,29 +461,6 @@ class BooleanValueCountsError(Exception):
|
|
458
461
|
##
|
459
462
|
|
460
463
|
|
461
|
-
@overload
|
462
|
-
def ceil_datetime(column: ExprLike, every: ExprLike, /) -> Expr: ...
|
463
|
-
@overload
|
464
|
-
def ceil_datetime(column: Series, every: ExprLike, /) -> Series: ...
|
465
|
-
@overload
|
466
|
-
def ceil_datetime(column: IntoExprColumn, every: ExprLike, /) -> ExprOrSeries: ...
|
467
|
-
def ceil_datetime(column: IntoExprColumn, every: ExprLike, /) -> ExprOrSeries:
|
468
|
-
"""Compute the `ceil` of a datetime column."""
|
469
|
-
column = ensure_expr_or_series(column)
|
470
|
-
rounded = column.dt.round(every)
|
471
|
-
ceil = (
|
472
|
-
when(column <= rounded)
|
473
|
-
.then(rounded)
|
474
|
-
.otherwise(column.dt.offset_by(every).dt.round(every))
|
475
|
-
)
|
476
|
-
if isinstance(column, Expr):
|
477
|
-
return ceil
|
478
|
-
return DataFrame().with_columns(ceil.alias(column.name))[column.name]
|
479
|
-
|
480
|
-
|
481
|
-
##
|
482
|
-
|
483
|
-
|
484
464
|
def check_polars_dataframe(
|
485
465
|
df: DataFrame,
|
486
466
|
/,
|
@@ -1056,37 +1036,41 @@ def dataclass_to_dataframe(
|
|
1056
1036
|
|
1057
1037
|
|
1058
1038
|
def _dataclass_to_dataframe_cast(series: Series, /) -> Series:
|
1059
|
-
if series.dtype
|
1060
|
-
|
1061
|
-
|
1062
|
-
|
1063
|
-
|
1064
|
-
|
1065
|
-
|
1066
|
-
|
1067
|
-
|
1068
|
-
|
1069
|
-
|
1070
|
-
|
1071
|
-
|
1072
|
-
|
1073
|
-
|
1074
|
-
|
1075
|
-
|
1076
|
-
|
1077
|
-
|
1078
|
-
|
1079
|
-
|
1080
|
-
|
1081
|
-
|
1082
|
-
|
1083
|
-
|
1084
|
-
|
1085
|
-
|
1086
|
-
|
1087
|
-
)
|
1088
|
-
|
1089
|
-
|
1039
|
+
if series.dtype != Object:
|
1040
|
+
return series
|
1041
|
+
if series.map_elements(make_isinstance(whenever.Date), return_dtype=Boolean).all():
|
1042
|
+
return series.map_elements(lambda x: x.py_date(), return_dtype=pl.Date)
|
1043
|
+
if series.map_elements(make_isinstance(DateDelta), return_dtype=Boolean).all():
|
1044
|
+
return series.map_elements(to_py_time_delta, return_dtype=Duration)
|
1045
|
+
if series.map_elements(make_isinstance(DateTimeDelta), return_dtype=Boolean).all():
|
1046
|
+
return series.map_elements(to_py_time_delta, return_dtype=Duration)
|
1047
|
+
is_path = series.map_elements(make_isinstance(Path), return_dtype=Boolean).all()
|
1048
|
+
is_uuid = series.map_elements(make_isinstance(UUID), return_dtype=Boolean).all()
|
1049
|
+
if is_path or is_uuid:
|
1050
|
+
with suppress_warnings(category=PolarsInefficientMapWarning):
|
1051
|
+
return series.map_elements(str, return_dtype=String)
|
1052
|
+
if series.map_elements(make_isinstance(whenever.Time), return_dtype=Boolean).all():
|
1053
|
+
return series.map_elements(lambda x: x.py_time(), return_dtype=pl.Time)
|
1054
|
+
if series.map_elements(make_isinstance(TimeDelta), return_dtype=Boolean).all():
|
1055
|
+
return series.map_elements(to_py_time_delta, return_dtype=Duration)
|
1056
|
+
if series.map_elements(make_isinstance(ZonedDateTime), return_dtype=Boolean).all():
|
1057
|
+
return_dtype = zoned_date_time_dtype(time_zone=one({dt.tz for dt in series}))
|
1058
|
+
return series.map_elements(lambda x: x.py_datetime(), return_dtype=return_dtype)
|
1059
|
+
if series.map_elements(
|
1060
|
+
lambda x: isinstance(x, dict) and (set(x) == {"start", "end"}),
|
1061
|
+
return_dtype=Boolean,
|
1062
|
+
).all():
|
1063
|
+
start = _dataclass_to_dataframe_cast(
|
1064
|
+
series.map_elements(lambda x: x["start"], return_dtype=Object)
|
1065
|
+
).alias("start")
|
1066
|
+
end = _dataclass_to_dataframe_cast(
|
1067
|
+
series.map_elements(lambda x: x["end"], return_dtype=Object)
|
1068
|
+
).alias("end")
|
1069
|
+
name = series.name
|
1070
|
+
return concat_series(start, end).select(
|
1071
|
+
struct(start=start, end=end).alias(name)
|
1072
|
+
)[name]
|
1073
|
+
raise NotImplementedError(series) # pragma: no cover
|
1090
1074
|
|
1091
1075
|
|
1092
1076
|
@dataclass(kw_only=True, slots=True)
|
@@ -1362,29 +1346,6 @@ class _FiniteEWMWeightsError(Exception):
|
|
1362
1346
|
##
|
1363
1347
|
|
1364
1348
|
|
1365
|
-
@overload
|
1366
|
-
def floor_datetime(column: ExprLike, every: ExprLike, /) -> Expr: ...
|
1367
|
-
@overload
|
1368
|
-
def floor_datetime(column: Series, every: ExprLike, /) -> Series: ...
|
1369
|
-
@overload
|
1370
|
-
def floor_datetime(column: IntoExprColumn, every: ExprLike, /) -> ExprOrSeries: ...
|
1371
|
-
def floor_datetime(column: IntoExprColumn, every: ExprLike, /) -> ExprOrSeries:
|
1372
|
-
"""Compute the `floor` of a datetime column."""
|
1373
|
-
column = ensure_expr_or_series(column)
|
1374
|
-
rounded = column.dt.round(every)
|
1375
|
-
floor = (
|
1376
|
-
when(column >= rounded)
|
1377
|
-
.then(rounded)
|
1378
|
-
.otherwise(column.dt.offset_by("-" + every).dt.round(every))
|
1379
|
-
)
|
1380
|
-
if isinstance(column, Expr):
|
1381
|
-
return floor
|
1382
|
-
return DataFrame().with_columns(floor.alias(column.name))[column.name]
|
1383
|
-
|
1384
|
-
|
1385
|
-
##
|
1386
|
-
|
1387
|
-
|
1388
1349
|
def get_data_type_or_series_time_zone(
|
1389
1350
|
dtype_or_series: PolarsDataType | Series, /
|
1390
1351
|
) -> ZoneInfo:
|
@@ -2480,10 +2441,6 @@ def _struct_from_dataclass_one(
|
|
2480
2441
|
}
|
2481
2442
|
with suppress(KeyError):
|
2482
2443
|
return mapping[ann]
|
2483
|
-
if ann is dt.datetime:
|
2484
|
-
if time_zone is None:
|
2485
|
-
raise _StructFromDataClassTimeZoneMissingError
|
2486
|
-
return zoned_datetime_dtype(time_zone=time_zone)
|
2487
2444
|
if is_dataclass_class(ann):
|
2488
2445
|
return struct_from_dataclass(ann, time_zone=time_zone)
|
2489
2446
|
if (isinstance(ann, type) and issubclass(ann, enum.Enum)) or (
|
@@ -2512,13 +2469,6 @@ class _StructFromDataClassNotADataclassError(StructFromDataClassError):
|
|
2512
2469
|
return f"Object must be a dataclass; got {self.cls}"
|
2513
2470
|
|
2514
2471
|
|
2515
|
-
@dataclass(kw_only=True, slots=True)
|
2516
|
-
class _StructFromDataClassTimeZoneMissingError(StructFromDataClassError):
|
2517
|
-
@override
|
2518
|
-
def __str__(self) -> str:
|
2519
|
-
return "Time-zone must be given"
|
2520
|
-
|
2521
|
-
|
2522
2472
|
@dataclass(kw_only=True, slots=True)
|
2523
2473
|
class _StructFromDataClassTypeError(StructFromDataClassError):
|
2524
2474
|
ann: Any
|
@@ -2612,27 +2562,27 @@ def week_num(column: IntoExprColumn, /, *, start: WeekDay = "mon") -> ExprOrSeri
|
|
2612
2562
|
##
|
2613
2563
|
|
2614
2564
|
|
2615
|
-
def
|
2565
|
+
def zoned_date_time_dtype(
|
2616
2566
|
*, time_unit: TimeUnit = "us", time_zone: TimeZoneLike = UTC
|
2617
2567
|
) -> Datetime:
|
2618
|
-
"""Create a zoned
|
2568
|
+
"""Create a zoned date-time data type."""
|
2619
2569
|
return Datetime(time_unit=time_unit, time_zone=get_time_zone_name(time_zone))
|
2620
2570
|
|
2621
2571
|
|
2622
|
-
def
|
2572
|
+
def zoned_date_time_period_dtype(
|
2623
2573
|
*,
|
2624
2574
|
time_unit: TimeUnit = "us",
|
2625
2575
|
time_zone: TimeZoneLike | tuple[TimeZoneLike, TimeZoneLike] = UTC,
|
2626
2576
|
) -> Struct:
|
2627
|
-
"""Create a zoned
|
2577
|
+
"""Create a zoned date-time period data type."""
|
2628
2578
|
match time_zone:
|
2629
2579
|
case start, end:
|
2630
2580
|
return struct_dtype(
|
2631
|
-
start=
|
2632
|
-
end=
|
2581
|
+
start=zoned_date_time_dtype(time_unit=time_unit, time_zone=start),
|
2582
|
+
end=zoned_date_time_dtype(time_unit=time_unit, time_zone=end),
|
2633
2583
|
)
|
2634
2584
|
case _:
|
2635
|
-
dtype =
|
2585
|
+
dtype = zoned_date_time_dtype(time_unit=time_unit, time_zone=time_zone)
|
2636
2586
|
return struct_dtype(start=dtype, end=dtype)
|
2637
2587
|
|
2638
2588
|
|
@@ -2641,6 +2591,7 @@ __all__ = [
|
|
2641
2591
|
"CheckPolarsDataFrameError",
|
2642
2592
|
"ColumnsToDictError",
|
2643
2593
|
"DataClassToDataFrameError",
|
2594
|
+
"DatePeriodDType",
|
2644
2595
|
"DatetimeHongKong",
|
2645
2596
|
"DatetimeTokyo",
|
2646
2597
|
"DatetimeUSCentral",
|
@@ -2658,6 +2609,7 @@ __all__ = [
|
|
2658
2609
|
"IsNullStructSeriesError",
|
2659
2610
|
"SetFirstRowAsColumnsError",
|
2660
2611
|
"StructFromDataClassError",
|
2612
|
+
"TimePeriodDType",
|
2661
2613
|
"acf",
|
2662
2614
|
"adjust_frequencies",
|
2663
2615
|
"all_dataframe_columns",
|
@@ -2668,7 +2620,6 @@ __all__ = [
|
|
2668
2620
|
"are_frames_equal",
|
2669
2621
|
"bernoulli",
|
2670
2622
|
"boolean_value_counts",
|
2671
|
-
"ceil_datetime",
|
2672
2623
|
"check_polars_dataframe",
|
2673
2624
|
"choice",
|
2674
2625
|
"collect_series",
|
@@ -2685,7 +2636,6 @@ __all__ = [
|
|
2685
2636
|
"ensure_expr_or_series",
|
2686
2637
|
"ensure_expr_or_series_many",
|
2687
2638
|
"finite_ewm_mean",
|
2688
|
-
"floor_datetime",
|
2689
2639
|
"get_data_type_or_series_time_zone",
|
2690
2640
|
"get_expr_name",
|
2691
2641
|
"get_frequency_spectrum",
|
@@ -2721,6 +2671,6 @@ __all__ = [
|
|
2721
2671
|
"unique_element",
|
2722
2672
|
"write_dataframe",
|
2723
2673
|
"write_series",
|
2724
|
-
"
|
2725
|
-
"
|
2674
|
+
"zoned_date_time_dtype",
|
2675
|
+
"zoned_date_time_period_dtype",
|
2726
2676
|
]
|
@@ -35,7 +35,7 @@ from utilities.iterables import (
|
|
35
35
|
chunked,
|
36
36
|
one,
|
37
37
|
)
|
38
|
-
from utilities.polars import
|
38
|
+
from utilities.polars import zoned_date_time_dtype
|
39
39
|
from utilities.reprlib import get_repr
|
40
40
|
from utilities.sqlalchemy import (
|
41
41
|
CHUNK_SIZE_FRAC,
|
@@ -390,7 +390,7 @@ def _select_to_dataframe_map_table_column_type_to_dtype(
|
|
390
390
|
return pl.Date
|
391
391
|
if is_subclass_gen(py_type, dt.datetime):
|
392
392
|
has_tz: bool = type_use.timezone
|
393
|
-
return
|
393
|
+
return zoned_date_time_dtype(time_zone=time_zone) if has_tz else Datetime()
|
394
394
|
if issubclass(py_type, dt.time):
|
395
395
|
return Time
|
396
396
|
if issubclass(py_type, dt.timedelta):
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|