dycw-utilities 0.159.4__tar.gz → 0.159.5__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 (209) hide show
  1. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/PKG-INFO +1 -1
  2. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/pyproject.toml +2 -2
  3. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_polars.py +31 -7
  4. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/__init__.py +1 -1
  5. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/polars.py +89 -14
  6. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/.gitignore +0 -0
  7. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/LICENSE +0 -0
  8. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/README.md +0 -0
  9. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/__init__.py +0 -0
  10. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/conftest.py +0 -0
  11. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/modules/__init__.py +0 -0
  12. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/modules/package_missing/__init__.py +0 -0
  13. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/modules/package_missing/module.py +0 -0
  14. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/modules/package_with/__init__.py +0 -0
  15. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/modules/package_with/outer_1.py +0 -0
  16. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/modules/package_with/outer_2.py +0 -0
  17. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  18. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  19. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  20. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  21. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/modules/package_without/__init__.py +0 -0
  22. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/modules/package_without/module_1.py +0 -0
  23. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/modules/package_without/module_2.py +0 -0
  24. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/modules/standalone.py +0 -0
  25. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/modules/with_imports.py +0 -0
  26. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  27. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  28. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  29. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  30. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  31. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  32. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  33. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  34. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_altair.py +0 -0
  35. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_asyncio.py +0 -0
  36. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_atomicwrites.py +0 -0
  37. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_atools.py +0 -0
  38. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_cachetools.py +0 -0
  39. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_click.py +0 -0
  40. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_concurrent.py +0 -0
  41. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_contextlib.py +0 -0
  42. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_contextvars.py +0 -0
  43. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_cryptography.py +0 -0
  44. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_cvxpy.py +0 -0
  45. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_dataclasses.py +0 -0
  46. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_enum.py +0 -0
  47. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_errors.py +0 -0
  48. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_eventkit.py +0 -0
  49. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_fastapi.py +0 -0
  50. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_fpdf2.py +0 -0
  51. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_functions.py +0 -0
  52. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_functools.py +0 -0
  53. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_getpass.py +0 -0
  54. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_gzip.py +0 -0
  55. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_hashlib.py +0 -0
  56. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_http.py +0 -0
  57. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_hypothesis.py +0 -0
  58. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_importlib.py +0 -0
  59. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_inflect.py +0 -0
  60. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_ipython.py +0 -0
  61. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_iterables.py +0 -0
  62. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_json.py +0 -0
  63. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_jupyter.py +0 -0
  64. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_libcst.py +0 -0
  65. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_lightweight_charts.py +0 -0
  66. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_logging.py +0 -0
  67. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_math.py +0 -0
  68. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_memory_profiler.py +0 -0
  69. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_modules.py +0 -0
  70. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_more_itertools.py +0 -0
  71. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_numpy.py +0 -0
  72. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_objects/__init__.py +0 -0
  73. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_objects/objects.py +0 -0
  74. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_operator.py +0 -0
  75. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_optuna.py +0 -0
  76. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_orjson.py +0 -0
  77. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_os.py +0 -0
  78. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_parse.py +0 -0
  79. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_pathlib.py +0 -0
  80. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_pickle.py +0 -0
  81. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_platform.py +0 -0
  82. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_polars_ols.py +0 -0
  83. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_postgres.py +0 -0
  84. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_pottery.py +0 -0
  85. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_pqdm.py +0 -0
  86. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_psutil.py +0 -0
  87. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_pyinstrument.py +0 -0
  88. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_pytest.py +0 -0
  89. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_pytest_randomly.py +0 -0
  90. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_pytest_regressions.py +0 -0
  91. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_random.py +0 -0
  92. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_re.py +0 -0
  93. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_redis.py +0 -0
  94. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_reprlib.py +0 -0
  95. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_scipy.py +0 -0
  96. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_sentinel.py +0 -0
  97. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_shelve.py +0 -0
  98. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_slack_sdk.py +0 -0
  99. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_socket.py +0 -0
  100. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_sqlalchemy.py +0 -0
  101. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_sqlalchemy_polars.py +0 -0
  102. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_statsmodels.py +0 -0
  103. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_string.py +0 -0
  104. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_tempfile.py +0 -0
  105. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_text.py +0 -0
  106. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_threading.py +0 -0
  107. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_timer.py +0 -0
  108. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_traceback.py +0 -0
  109. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_typed_settings.py +0 -0
  110. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_types.py +0 -0
  111. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_typing.py +0 -0
  112. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_typing_funcs/__init__.py +0 -0
  113. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_typing_funcs/no_future.py +0 -0
  114. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_typing_funcs/with_future.py +0 -0
  115. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_tzdata.py +0 -0
  116. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_tzlocal.py +0 -0
  117. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_uuid.py +0 -0
  118. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_version.py +0 -0
  119. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_warnings.py +0 -0
  120. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_whenever.py +0 -0
  121. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_zipfile.py +0 -0
  122. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/tests/test_zoneinfo.py +0 -0
  123. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/altair.py +0 -0
  124. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/asyncio.py +0 -0
  125. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/atomicwrites.py +0 -0
  126. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/atools.py +0 -0
  127. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/cachetools.py +0 -0
  128. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/click.py +0 -0
  129. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/concurrent.py +0 -0
  130. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/contextlib.py +0 -0
  131. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/contextvars.py +0 -0
  132. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/cryptography.py +0 -0
  133. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/cvxpy.py +0 -0
  134. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/dataclasses.py +0 -0
  135. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/enum.py +0 -0
  136. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/errors.py +0 -0
  137. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/eventkit.py +0 -0
  138. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/fastapi.py +0 -0
  139. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/fpdf2.py +0 -0
  140. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/functions.py +0 -0
  141. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/functools.py +0 -0
  142. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/getpass.py +0 -0
  143. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/gzip.py +0 -0
  144. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/hashlib.py +0 -0
  145. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/http.py +0 -0
  146. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/hypothesis.py +0 -0
  147. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/importlib.py +0 -0
  148. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/inflect.py +0 -0
  149. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/ipython.py +0 -0
  150. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/iterables.py +0 -0
  151. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/json.py +0 -0
  152. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/jupyter.py +0 -0
  153. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/libcst.py +0 -0
  154. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/lightweight_charts.py +0 -0
  155. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/logging.py +0 -0
  156. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/math.py +0 -0
  157. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/memory_profiler.py +0 -0
  158. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/modules.py +0 -0
  159. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/more_itertools.py +0 -0
  160. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/numpy.py +0 -0
  161. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/operator.py +0 -0
  162. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/optuna.py +0 -0
  163. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/orjson.py +0 -0
  164. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/os.py +0 -0
  165. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/parse.py +0 -0
  166. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/pathlib.py +0 -0
  167. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/pickle.py +0 -0
  168. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/platform.py +0 -0
  169. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/polars_ols.py +0 -0
  170. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/postgres.py +0 -0
  171. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/pottery.py +0 -0
  172. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/pqdm.py +0 -0
  173. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/psutil.py +0 -0
  174. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/py.typed +0 -0
  175. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/pyinstrument.py +0 -0
  176. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/pytest.py +0 -0
  177. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/pytest_plugins/__init__.py +0 -0
  178. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/pytest_plugins/pytest_randomly.py +0 -0
  179. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/pytest_plugins/pytest_regressions.py +0 -0
  180. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/pytest_regressions.py +0 -0
  181. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/random.py +0 -0
  182. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/re.py +0 -0
  183. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/redis.py +0 -0
  184. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/reprlib.py +0 -0
  185. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/scipy.py +0 -0
  186. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/sentinel.py +0 -0
  187. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/shelve.py +0 -0
  188. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/slack_sdk.py +0 -0
  189. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/socket.py +0 -0
  190. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/sqlalchemy.py +0 -0
  191. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/sqlalchemy_polars.py +0 -0
  192. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/statsmodels.py +0 -0
  193. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/string.py +0 -0
  194. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/tempfile.py +0 -0
  195. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/text.py +0 -0
  196. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/threading.py +0 -0
  197. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/timer.py +0 -0
  198. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/traceback.py +0 -0
  199. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/typed_settings.py +0 -0
  200. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/types.py +0 -0
  201. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/typing.py +0 -0
  202. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/tzdata.py +0 -0
  203. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/tzlocal.py +0 -0
  204. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/uuid.py +0 -0
  205. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/version.py +0 -0
  206. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/warnings.py +0 -0
  207. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/whenever.py +0 -0
  208. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/zipfile.py +0 -0
  209. {dycw_utilities-0.159.4 → dycw_utilities-0.159.5}/src/utilities/zoneinfo.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.159.4
3
+ Version: 0.159.5
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.159.4"
230
+ version = "0.159.5"
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.159.4"
262
+ current_version = "0.159.5"
263
263
 
264
264
  [[tool.bumpversion.files]]
265
265
  filename = "src/utilities/__init__.py"
@@ -9,7 +9,7 @@ from enum import auto
9
9
  from itertools import chain, repeat
10
10
  from math import isfinite, nan
11
11
  from random import Random
12
- from typing import TYPE_CHECKING, Any, ClassVar, Literal, assert_never
12
+ from typing import TYPE_CHECKING, Any, ClassVar, Literal, assert_never, cast
13
13
  from uuid import UUID, uuid4
14
14
 
15
15
  import hypothesis.strategies
@@ -97,6 +97,7 @@ from utilities.polars import (
97
97
  InsertBeforeError,
98
98
  OneColumnEmptyError,
99
99
  OneColumnNonUniqueError,
100
+ RoundToFloatError,
100
101
  SetFirstRowAsColumnsError,
101
102
  TimePeriodDType,
102
103
  _check_polars_dataframe_predicates,
@@ -1560,7 +1561,7 @@ class TestFiniteEWMWeights:
1560
1561
 
1561
1562
  class TestFirstTrueHorizontal:
1562
1563
  @mark.parametrize(
1563
- ("row", "expected"),
1564
+ ("values", "expected"),
1564
1565
  [
1565
1566
  param([True, True, True], 0),
1566
1567
  param([False, True, True], 1),
@@ -1568,9 +1569,9 @@ class TestFirstTrueHorizontal:
1568
1569
  param([False, False, False], None),
1569
1570
  ],
1570
1571
  )
1571
- def test_main(self, *, row: list[bool], expected: int | None) -> None:
1572
- df = DataFrame([row], schema={str(i): Boolean for i in range(3)}, orient="row")
1573
- result = first_true_horizontal(df)
1572
+ def test_main(self, *, values: list[bool], expected: int | None) -> None:
1573
+ series = [Series(values=[v], dtype=Boolean) for v in values]
1574
+ result = first_true_horizontal(*series)
1574
1575
  assert result.item() == expected
1575
1576
 
1576
1577
 
@@ -2427,8 +2428,8 @@ class TestReplaceTimeZone:
2427
2428
  class TestRoundToFloat:
2428
2429
  @mark.parametrize(("x", "y", "exp_value"), tests.test_math.TestRoundToFloat.cases)
2429
2430
  def test_main(self, *, x: float, y: float, exp_value: float) -> None:
2430
- series = Series(name="x", values=[x], dtype=Float64)
2431
- result = round_to_float(series, y)
2431
+ x_sr = Series(name="x", values=[x], dtype=Float64)
2432
+ result = round_to_float(x_sr, y)
2432
2433
  expected = Series(name="x", values=[exp_value], dtype=Float64)
2433
2434
  assert_series_equal(result, expected, check_exact=True)
2434
2435
 
@@ -2441,6 +2442,29 @@ class TestRoundToFloat:
2441
2442
  expected = Series(name="x", values=[1.2], dtype=Float64).to_frame()
2442
2443
  assert_frame_equal(df, expected)
2443
2444
 
2445
+ def test_series_and_expr(self) -> None:
2446
+ x = Series(name="x", values=[1.234], dtype=Float64)
2447
+ y = lit(0.1, dtype=Float64).alias("y")
2448
+ result = round_to_float(x, y)
2449
+ assert result.item() == 1.2
2450
+
2451
+ def test_expr_and_expr(self) -> None:
2452
+ x = lit(1.234, dtype=Float64).alias("x")
2453
+ y = Series(name="y", values=[0.1], dtype=Float64)
2454
+ result = round_to_float(x, y)
2455
+ assert result.item() == 1.2
2456
+
2457
+ @mark.parametrize(
2458
+ ("x", "y"),
2459
+ [param("x", "y"), param(col.x, "y"), param("x", col.y), param(col.x, col.y)],
2460
+ )
2461
+ def test_error(self, *, x: IntoExprColumn, y: IntoExprColumn) -> None:
2462
+ with raises(
2463
+ RoundToFloatError,
2464
+ match="At least 1 of the dividend and/or divisor must be a Series; got .* and .*",
2465
+ ):
2466
+ _ = round_to_float(cast("Any", x), cast("Any", y))
2467
+
2444
2468
 
2445
2469
  class TestSerializeAndDeserializeDataFrame:
2446
2470
  cases: ClassVar[list[tuple[PolarsDataType, SearchStrategy[Any]]]] = [
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.159.4"
3
+ __version__ = "0.159.5"
@@ -57,6 +57,7 @@ import utilities.math
57
57
  from utilities.dataclasses import yield_fields
58
58
  from utilities.errors import ImpossibleCaseError
59
59
  from utilities.functions import (
60
+ get_class_name,
60
61
  is_dataclass_class,
61
62
  is_dataclass_instance,
62
63
  make_isinstance,
@@ -1324,10 +1325,27 @@ class _FiniteEWMWeightsError(Exception):
1324
1325
  ##
1325
1326
 
1326
1327
 
1327
- def first_true_horizontal(df: DataFrame, /) -> Series:
1328
+ @overload
1329
+ def first_true_horizontal(column: Series, /) -> Series: ...
1330
+ @overload
1331
+ def first_true_horizontal(column1: Series, column2: Series, /) -> Series: ...
1332
+ @overload
1333
+ def first_true_horizontal(
1334
+ column1: Series, column2: Series, column3: Series, /
1335
+ ) -> Series: ...
1336
+ @overload
1337
+ def first_true_horizontal(
1338
+ column1: Series, column2: Series, column3: Series, column4: Series, /
1339
+ ) -> Series: ...
1340
+ @overload
1341
+ def first_true_horizontal(*columns: Series) -> Series: ...
1342
+ @overload
1343
+ def first_true_horizontal(*columns: IntoExprColumn) -> ExprOrSeries: ...
1344
+ def first_true_horizontal(*columns: IntoExprColumn) -> ExprOrSeries:
1328
1345
  """Get the index of the first true in each row."""
1329
- expr = when(any_horizontal(pl.all())).then(concat_list(pl.all()).list.arg_max())
1330
- return one_column(df.select(expr))
1346
+ columns2 = ensure_expr_or_series_many(*columns)
1347
+ expr = when(any_horizontal(*columns2)).then(concat_list(*columns2).list.arg_max())
1348
+ return try_reify_expr(expr, *columns2)
1331
1349
 
1332
1350
 
1333
1351
  ##
@@ -1972,19 +1990,31 @@ def normal(
1972
1990
  ##
1973
1991
 
1974
1992
 
1993
+ @overload
1994
+ def number_of_decimals(
1995
+ series: ExprLike, /, *, max_decimals: int = MAX_DECIMALS
1996
+ ) -> Expr: ...
1997
+ @overload
1975
1998
  def number_of_decimals(
1976
1999
  series: Series, /, *, max_decimals: int = MAX_DECIMALS
1977
- ) -> Series:
2000
+ ) -> Series: ...
2001
+ @overload
2002
+ def number_of_decimals(
2003
+ series: IntoExprColumn, /, *, max_decimals: int = MAX_DECIMALS
2004
+ ) -> ExprOrSeries: ...
2005
+ def number_of_decimals(
2006
+ series: IntoExprColumn, /, *, max_decimals: int = MAX_DECIMALS
2007
+ ) -> ExprOrSeries:
1978
2008
  """Get the number of decimals."""
2009
+ series = ensure_expr_or_series(series)
1979
2010
  frac = series - series.floor()
1980
- results = [
2011
+ results = (
1981
2012
  _number_of_decimals_check_scale(frac, s) for s in range(max_decimals + 1)
1982
- ]
1983
- df_results = concat_series(*results)
1984
- return first_true_horizontal(df_results)
2013
+ )
2014
+ return first_true_horizontal(*results)
1985
2015
 
1986
2016
 
1987
- def _number_of_decimals_check_scale(frac: Series, scale: int, /) -> Series:
2017
+ def _number_of_decimals_check_scale(frac: ExprOrSeries, scale: int, /) -> ExprOrSeries:
1988
2018
  scaled = 10**scale * frac
1989
2019
  return is_close(scaled, scaled.round()).alias(str(scale))
1990
2020
 
@@ -2346,19 +2376,63 @@ def round_to_float(
2346
2376
  ) -> Expr: ...
2347
2377
  @overload
2348
2378
  def round_to_float(
2349
- x: Series, y: float, /, *, mode: RoundMode = "half_to_even"
2379
+ x: Series, y: float | ExprOrSeries, /, *, mode: RoundMode = "half_to_even"
2380
+ ) -> Series: ...
2381
+ @overload
2382
+ def round_to_float(
2383
+ x: ExprLike, y: Series, /, *, mode: RoundMode = "half_to_even"
2350
2384
  ) -> Series: ...
2351
2385
  @overload
2352
2386
  def round_to_float(
2353
- x: IntoExprColumn, y: float, /, *, mode: RoundMode = "half_to_even"
2387
+ x: ExprLike, y: Expr, /, *, mode: RoundMode = "half_to_even"
2388
+ ) -> Expr: ...
2389
+ @overload
2390
+ def round_to_float(
2391
+ x: IntoExprColumn, y: float | Series, /, *, mode: RoundMode = "half_to_even"
2354
2392
  ) -> ExprOrSeries: ...
2355
2393
  def round_to_float(
2356
- x: IntoExprColumn, y: float, /, *, mode: RoundMode = "half_to_even"
2394
+ x: IntoExprColumn, y: float | IntoExprColumn, /, *, mode: RoundMode = "half_to_even"
2357
2395
  ) -> ExprOrSeries:
2358
2396
  """Round a column to the nearest multiple of another float."""
2359
2397
  x = ensure_expr_or_series(x)
2360
- z = (x / y).round(mode=mode) * y
2361
- return z.round(decimals=utilities.math.number_of_decimals(y) + 1)
2398
+ y = y if isinstance(y, int | float) else ensure_expr_or_series(y)
2399
+ match x, y:
2400
+ case Expr() | Series(), int() | float():
2401
+ z = (x / y).round(mode=mode) * y
2402
+ return z.round(decimals=utilities.math.number_of_decimals(y) + 1)
2403
+ case Series(), Expr() | Series():
2404
+ df = (
2405
+ x.to_frame()
2406
+ .with_columns(y)
2407
+ .with_columns(number_of_decimals(y).alias("_decimals"))
2408
+ .with_row_index(name="_index")
2409
+ .group_by("_decimals")
2410
+ .map_groups(_round_to_float_one)
2411
+ .sort("_index")
2412
+ )
2413
+ return df[df.columns[1]]
2414
+ case Expr(), Series():
2415
+ df = y.to_frame().with_columns(x)
2416
+ return round_to_float(df[df.columns[1]], df[df.columns[0]], mode=mode)
2417
+ case Expr(), Expr() | str():
2418
+ raise RoundToFloatError(x=x, y=y)
2419
+ case never:
2420
+ assert_never(never)
2421
+
2422
+
2423
+ def _round_to_float_one(df: DataFrame, /) -> DataFrame:
2424
+ decimals: int = df["_decimals"].unique().item()
2425
+ return df.with_columns(col(df.columns[1]).round(decimals=decimals))
2426
+
2427
+
2428
+ @dataclass(kw_only=True, slots=True)
2429
+ class RoundToFloatError(Exception):
2430
+ x: IntoExprColumn
2431
+ y: IntoExprColumn
2432
+
2433
+ @override
2434
+ def __str__(self) -> str:
2435
+ return f"At least 1 of the dividend and/or divisor must be a Series; got {get_class_name(self.x)!r} and {get_class_name(self.y)!r}"
2362
2436
 
2363
2437
 
2364
2438
  ##
@@ -2571,6 +2645,7 @@ __all__ = [
2571
2645
  "OneColumnEmptyError",
2572
2646
  "OneColumnError",
2573
2647
  "OneColumnNonUniqueError",
2648
+ "RoundToFloatError",
2574
2649
  "SetFirstRowAsColumnsError",
2575
2650
  "TimePeriodDType",
2576
2651
  "acf",