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.
Files changed (212) hide show
  1. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/PKG-INFO +1 -1
  2. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/pyproject.toml +2 -2
  3. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_altair.py +2 -2
  4. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_orjson.py +2 -2
  5. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_polars.py +69 -107
  6. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/__init__.py +1 -1
  7. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/polars.py +50 -100
  8. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/sqlalchemy_polars.py +2 -2
  9. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/.gitignore +0 -0
  10. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/LICENSE +0 -0
  11. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/README.md +0 -0
  12. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/__init__.py +0 -0
  13. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/conftest.py +0 -0
  14. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/modules/__init__.py +0 -0
  15. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/modules/package_missing/__init__.py +0 -0
  16. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/modules/package_missing/module.py +0 -0
  17. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/modules/package_with/__init__.py +0 -0
  18. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/modules/package_with/outer_1.py +0 -0
  19. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/modules/package_with/outer_2.py +0 -0
  20. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  21. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  22. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  23. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  24. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/modules/package_without/__init__.py +0 -0
  25. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/modules/package_without/module_1.py +0 -0
  26. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/modules/package_without/module_2.py +0 -0
  27. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/modules/standalone.py +0 -0
  28. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/modules/with_imports.py +0 -0
  29. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  30. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  31. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  32. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  33. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  34. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  35. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  36. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  37. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_asyncio.py +0 -0
  38. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_atomicwrites.py +0 -0
  39. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_atools.py +0 -0
  40. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_cachetools.py +0 -0
  41. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_click.py +0 -0
  42. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_concurrent.py +0 -0
  43. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_contextlib.py +0 -0
  44. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_contextvars.py +0 -0
  45. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_cryptography.py +0 -0
  46. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_cvxpy.py +0 -0
  47. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_dataclasses.py +0 -0
  48. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_enum.py +0 -0
  49. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_errors.py +0 -0
  50. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_eventkit.py +0 -0
  51. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_fastapi.py +0 -0
  52. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_fpdf2.py +0 -0
  53. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_functions.py +0 -0
  54. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_functools.py +0 -0
  55. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_getpass.py +0 -0
  56. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_gzip.py +0 -0
  57. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_hashlib.py +0 -0
  58. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_http.py +0 -0
  59. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_hypothesis.py +0 -0
  60. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_importlib.py +0 -0
  61. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_inflect.py +0 -0
  62. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_ipython.py +0 -0
  63. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_iterables.py +0 -0
  64. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_json.py +0 -0
  65. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_jupyter.py +0 -0
  66. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_libcst.py +0 -0
  67. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_lightweight_charts.py +0 -0
  68. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_logging.py +0 -0
  69. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_math.py +0 -0
  70. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_memory_profiler.py +0 -0
  71. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_modules.py +0 -0
  72. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_more_itertools.py +0 -0
  73. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_numpy.py +0 -0
  74. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_objects/__init__.py +0 -0
  75. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_objects/objects.py +0 -0
  76. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_operator.py +0 -0
  77. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_optuna.py +0 -0
  78. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_os.py +0 -0
  79. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_parse.py +0 -0
  80. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_pathlib.py +0 -0
  81. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_pickle.py +0 -0
  82. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_platform.py +0 -0
  83. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_polars_ols.py +0 -0
  84. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_postgres.py +0 -0
  85. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_pottery.py +0 -0
  86. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_pqdm.py +0 -0
  87. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_psutil.py +0 -0
  88. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_pyinstrument.py +0 -0
  89. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_pytest.py +0 -0
  90. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_pytest_randomly.py +0 -0
  91. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_pytest_regressions.py +0 -0
  92. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_random.py +0 -0
  93. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_re.py +0 -0
  94. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_redis.py +0 -0
  95. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_reprlib.py +0 -0
  96. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_scipy.py +0 -0
  97. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_sentinel.py +0 -0
  98. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_shelve.py +0 -0
  99. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_slack_sdk.py +0 -0
  100. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_socket.py +0 -0
  101. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_sqlalchemy.py +0 -0
  102. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_sqlalchemy_polars.py +0 -0
  103. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_statsmodels.py +0 -0
  104. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_string.py +0 -0
  105. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_tempfile.py +0 -0
  106. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_text.py +0 -0
  107. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_threading.py +0 -0
  108. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_timer.py +0 -0
  109. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_traceback.py +0 -0
  110. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_typed_settings.py +0 -0
  111. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_types.py +0 -0
  112. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_typing.py +0 -0
  113. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_typing_funcs/__init__.py +0 -0
  114. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_typing_funcs/no_future.py +0 -0
  115. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_typing_funcs/with_future.py +0 -0
  116. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_tzdata.py +0 -0
  117. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_tzlocal.py +0 -0
  118. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_uuid.py +0 -0
  119. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_version.py +0 -0
  120. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_warnings.py +0 -0
  121. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_whenever.py +0 -0
  122. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_yield_access/__init__.py +0 -0
  123. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_yield_access/script.py +0 -0
  124. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_yield_access/script.sh +0 -0
  125. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_zipfile.py +0 -0
  126. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/tests/test_zoneinfo.py +0 -0
  127. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/altair.py +0 -0
  128. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/asyncio.py +0 -0
  129. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/atomicwrites.py +0 -0
  130. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/atools.py +0 -0
  131. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/cachetools.py +0 -0
  132. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/click.py +0 -0
  133. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/concurrent.py +0 -0
  134. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/contextlib.py +0 -0
  135. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/contextvars.py +0 -0
  136. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/cryptography.py +0 -0
  137. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/cvxpy.py +0 -0
  138. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/dataclasses.py +0 -0
  139. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/enum.py +0 -0
  140. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/errors.py +0 -0
  141. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/eventkit.py +0 -0
  142. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/fastapi.py +0 -0
  143. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/fpdf2.py +0 -0
  144. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/functions.py +0 -0
  145. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/functools.py +0 -0
  146. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/getpass.py +0 -0
  147. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/gzip.py +0 -0
  148. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/hashlib.py +0 -0
  149. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/http.py +0 -0
  150. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/hypothesis.py +0 -0
  151. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/importlib.py +0 -0
  152. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/inflect.py +0 -0
  153. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/ipython.py +0 -0
  154. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/iterables.py +0 -0
  155. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/json.py +0 -0
  156. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/jupyter.py +0 -0
  157. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/libcst.py +0 -0
  158. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/lightweight_charts.py +0 -0
  159. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/logging.py +0 -0
  160. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/math.py +0 -0
  161. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/memory_profiler.py +0 -0
  162. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/modules.py +0 -0
  163. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/more_itertools.py +0 -0
  164. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/numpy.py +0 -0
  165. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/operator.py +0 -0
  166. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/optuna.py +0 -0
  167. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/orjson.py +0 -0
  168. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/os.py +0 -0
  169. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/parse.py +0 -0
  170. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/pathlib.py +0 -0
  171. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/pickle.py +0 -0
  172. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/platform.py +0 -0
  173. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/polars_ols.py +0 -0
  174. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/postgres.py +0 -0
  175. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/pottery.py +0 -0
  176. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/pqdm.py +0 -0
  177. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/psutil.py +0 -0
  178. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/py.typed +0 -0
  179. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/pyinstrument.py +0 -0
  180. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/pytest.py +0 -0
  181. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/pytest_plugins/__init__.py +0 -0
  182. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/pytest_plugins/pytest_randomly.py +0 -0
  183. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/pytest_plugins/pytest_regressions.py +0 -0
  184. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/pytest_regressions.py +0 -0
  185. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/random.py +0 -0
  186. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/re.py +0 -0
  187. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/redis.py +0 -0
  188. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/reprlib.py +0 -0
  189. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/scipy.py +0 -0
  190. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/sentinel.py +0 -0
  191. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/shelve.py +0 -0
  192. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/slack_sdk.py +0 -0
  193. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/socket.py +0 -0
  194. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/sqlalchemy.py +0 -0
  195. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/statsmodels.py +0 -0
  196. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/string.py +0 -0
  197. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/tempfile.py +0 -0
  198. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/text.py +0 -0
  199. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/threading.py +0 -0
  200. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/timer.py +0 -0
  201. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/traceback.py +0 -0
  202. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/typed_settings.py +0 -0
  203. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/types.py +0 -0
  204. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/typing.py +0 -0
  205. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/tzdata.py +0 -0
  206. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/tzlocal.py +0 -0
  207. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/uuid.py +0 -0
  208. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/version.py +0 -0
  209. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/warnings.py +0 -0
  210. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/whenever.py +0 -0
  211. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/zipfile.py +0 -0
  212. {dycw_utilities-0.155.1 → dycw_utilities-0.155.3}/src/utilities/zoneinfo.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.155.1
3
+ Version: 0.155.3
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -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.1"
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.1"
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, zoned_datetime_dtype
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": zoned_datetime_dtype(time_zone=time_zone),
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, zoned_datetime_dtype
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": zoned_datetime_dtype(time_zone=LOCAL_TIME_ZONE),
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
- StructFromDataClassError,
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
- zoned_datetime_dtype,
206
- zoned_datetime_period_dtype,
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": zoned_datetime_dtype()}
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 = zoned_datetime_dtype(time_zone=time_zone)
1599
+ dtype = zoned_date_time_dtype(time_zone=time_zone)
1622
1600
  case "struct":
1623
- dtype = zoned_datetime_period_dtype(time_zone=time_zone)
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 == zoned_datetime_period_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
- StructFromDataClassError, match="Object must be a dataclass; got None"
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
- StructFromDataClassError, match="Unsupported type: <class 'NoneType'>"
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 = zoned_datetime_dtype(time_zone=UTC)
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 = zoned_datetime_period_dtype(time_zone=time_zone)
3016
+ dtype = zoned_date_time_period_dtype(time_zone=time_zone)
3055
3017
  assert isinstance(dtype, Struct)
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.155.1"
3
+ __version__ = "0.155.3"
@@ -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 == Object:
1060
- if series.map_elements(
1061
- make_isinstance(whenever.Date), return_dtype=Boolean
1062
- ).all():
1063
- return series.map_elements(lambda x: x.py_date(), return_dtype=pl.Date)
1064
- if series.map_elements(make_isinstance(DateDelta), return_dtype=Boolean).all():
1065
- return series.map_elements(to_py_time_delta, return_dtype=Duration)
1066
- if series.map_elements(
1067
- make_isinstance(DateTimeDelta), return_dtype=Boolean
1068
- ).all():
1069
- return series.map_elements(to_py_time_delta, return_dtype=Duration)
1070
- is_path = series.map_elements(make_isinstance(Path), return_dtype=Boolean).all()
1071
- is_uuid = series.map_elements(make_isinstance(UUID), return_dtype=Boolean).all()
1072
- if is_path or is_uuid:
1073
- with suppress_warnings(category=PolarsInefficientMapWarning):
1074
- return series.map_elements(str, return_dtype=String)
1075
- if series.map_elements(
1076
- make_isinstance(whenever.Time), return_dtype=Boolean
1077
- ).all():
1078
- return series.map_elements(lambda x: x.py_time(), return_dtype=pl.Time)
1079
- if series.map_elements(make_isinstance(TimeDelta), return_dtype=Boolean).all():
1080
- return series.map_elements(to_py_time_delta, return_dtype=Duration)
1081
- if series.map_elements(
1082
- make_isinstance(ZonedDateTime), return_dtype=Boolean
1083
- ).all():
1084
- return_dtype = zoned_datetime_dtype(time_zone=one({dt.tz for dt in series}))
1085
- return series.map_elements(
1086
- lambda x: x.py_datetime(), return_dtype=return_dtype
1087
- )
1088
- raise NotImplementedError(series) # pragma: no cover
1089
- return series
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 zoned_datetime_dtype(
2565
+ def zoned_date_time_dtype(
2616
2566
  *, time_unit: TimeUnit = "us", time_zone: TimeZoneLike = UTC
2617
2567
  ) -> Datetime:
2618
- """Create a zoned datetime data type."""
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 zoned_datetime_period_dtype(
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 datetime period data type."""
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=zoned_datetime_dtype(time_unit=time_unit, time_zone=start),
2632
- end=zoned_datetime_dtype(time_unit=time_unit, time_zone=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 = zoned_datetime_dtype(time_unit=time_unit, time_zone=time_zone)
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
- "zoned_datetime_dtype",
2725
- "zoned_datetime_period_dtype",
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 zoned_datetime_dtype
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 zoned_datetime_dtype(time_zone=time_zone) if has_tz else Datetime()
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):