dycw-utilities 0.159.2__tar.gz → 0.159.4__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.2 → dycw_utilities-0.159.4}/PKG-INFO +1 -1
  2. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/pyproject.toml +2 -2
  3. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_math.py +14 -16
  4. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_polars.py +31 -32
  5. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/__init__.py +1 -1
  6. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/math.py +5 -1
  7. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/polars.py +62 -56
  8. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/types.py +4 -0
  9. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/.gitignore +0 -0
  10. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/LICENSE +0 -0
  11. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/README.md +0 -0
  12. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/__init__.py +0 -0
  13. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/conftest.py +0 -0
  14. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/modules/__init__.py +0 -0
  15. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/modules/package_missing/__init__.py +0 -0
  16. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/modules/package_missing/module.py +0 -0
  17. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/modules/package_with/__init__.py +0 -0
  18. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/modules/package_with/outer_1.py +0 -0
  19. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/modules/package_with/outer_2.py +0 -0
  20. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  21. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  22. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  23. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  24. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/modules/package_without/__init__.py +0 -0
  25. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/modules/package_without/module_1.py +0 -0
  26. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/modules/package_without/module_2.py +0 -0
  27. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/modules/standalone.py +0 -0
  28. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/modules/with_imports.py +0 -0
  29. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  30. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  31. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  32. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  33. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  34. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  35. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  36. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  37. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_altair.py +0 -0
  38. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_asyncio.py +0 -0
  39. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_atomicwrites.py +0 -0
  40. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_atools.py +0 -0
  41. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_cachetools.py +0 -0
  42. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_click.py +0 -0
  43. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_concurrent.py +0 -0
  44. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_contextlib.py +0 -0
  45. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_contextvars.py +0 -0
  46. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_cryptography.py +0 -0
  47. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_cvxpy.py +0 -0
  48. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_dataclasses.py +0 -0
  49. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_enum.py +0 -0
  50. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_errors.py +0 -0
  51. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_eventkit.py +0 -0
  52. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_fastapi.py +0 -0
  53. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_fpdf2.py +0 -0
  54. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_functions.py +0 -0
  55. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_functools.py +0 -0
  56. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_getpass.py +0 -0
  57. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_gzip.py +0 -0
  58. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_hashlib.py +0 -0
  59. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_http.py +0 -0
  60. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_hypothesis.py +0 -0
  61. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_importlib.py +0 -0
  62. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_inflect.py +0 -0
  63. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_ipython.py +0 -0
  64. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_iterables.py +0 -0
  65. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_json.py +0 -0
  66. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_jupyter.py +0 -0
  67. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_libcst.py +0 -0
  68. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_lightweight_charts.py +0 -0
  69. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_logging.py +0 -0
  70. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_memory_profiler.py +0 -0
  71. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_modules.py +0 -0
  72. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_more_itertools.py +0 -0
  73. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_numpy.py +0 -0
  74. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_objects/__init__.py +0 -0
  75. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_objects/objects.py +0 -0
  76. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_operator.py +0 -0
  77. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_optuna.py +0 -0
  78. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_orjson.py +0 -0
  79. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_os.py +0 -0
  80. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_parse.py +0 -0
  81. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_pathlib.py +0 -0
  82. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_pickle.py +0 -0
  83. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_platform.py +0 -0
  84. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_polars_ols.py +0 -0
  85. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_postgres.py +0 -0
  86. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_pottery.py +0 -0
  87. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_pqdm.py +0 -0
  88. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_psutil.py +0 -0
  89. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_pyinstrument.py +0 -0
  90. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_pytest.py +0 -0
  91. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_pytest_randomly.py +0 -0
  92. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_pytest_regressions.py +0 -0
  93. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_random.py +0 -0
  94. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_re.py +0 -0
  95. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_redis.py +0 -0
  96. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_reprlib.py +0 -0
  97. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_scipy.py +0 -0
  98. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_sentinel.py +0 -0
  99. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_shelve.py +0 -0
  100. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_slack_sdk.py +0 -0
  101. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_socket.py +0 -0
  102. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_sqlalchemy.py +0 -0
  103. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_sqlalchemy_polars.py +0 -0
  104. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_statsmodels.py +0 -0
  105. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_string.py +0 -0
  106. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_tempfile.py +0 -0
  107. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_text.py +0 -0
  108. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_threading.py +0 -0
  109. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_timer.py +0 -0
  110. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_traceback.py +0 -0
  111. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_typed_settings.py +0 -0
  112. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_types.py +0 -0
  113. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_typing.py +0 -0
  114. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_typing_funcs/__init__.py +0 -0
  115. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_typing_funcs/no_future.py +0 -0
  116. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_typing_funcs/with_future.py +0 -0
  117. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_tzdata.py +0 -0
  118. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_tzlocal.py +0 -0
  119. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_uuid.py +0 -0
  120. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_version.py +0 -0
  121. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_warnings.py +0 -0
  122. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_whenever.py +0 -0
  123. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_zipfile.py +0 -0
  124. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/tests/test_zoneinfo.py +0 -0
  125. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/altair.py +0 -0
  126. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/asyncio.py +0 -0
  127. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/atomicwrites.py +0 -0
  128. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/atools.py +0 -0
  129. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/cachetools.py +0 -0
  130. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/click.py +0 -0
  131. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/concurrent.py +0 -0
  132. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/contextlib.py +0 -0
  133. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/contextvars.py +0 -0
  134. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/cryptography.py +0 -0
  135. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/cvxpy.py +0 -0
  136. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/dataclasses.py +0 -0
  137. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/enum.py +0 -0
  138. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/errors.py +0 -0
  139. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/eventkit.py +0 -0
  140. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/fastapi.py +0 -0
  141. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/fpdf2.py +0 -0
  142. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/functions.py +0 -0
  143. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/functools.py +0 -0
  144. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/getpass.py +0 -0
  145. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/gzip.py +0 -0
  146. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/hashlib.py +0 -0
  147. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/http.py +0 -0
  148. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/hypothesis.py +0 -0
  149. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/importlib.py +0 -0
  150. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/inflect.py +0 -0
  151. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/ipython.py +0 -0
  152. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/iterables.py +0 -0
  153. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/json.py +0 -0
  154. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/jupyter.py +0 -0
  155. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/libcst.py +0 -0
  156. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/lightweight_charts.py +0 -0
  157. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/logging.py +0 -0
  158. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/memory_profiler.py +0 -0
  159. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/modules.py +0 -0
  160. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/more_itertools.py +0 -0
  161. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/numpy.py +0 -0
  162. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/operator.py +0 -0
  163. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/optuna.py +0 -0
  164. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/orjson.py +0 -0
  165. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/os.py +0 -0
  166. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/parse.py +0 -0
  167. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/pathlib.py +0 -0
  168. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/pickle.py +0 -0
  169. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/platform.py +0 -0
  170. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/polars_ols.py +0 -0
  171. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/postgres.py +0 -0
  172. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/pottery.py +0 -0
  173. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/pqdm.py +0 -0
  174. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/psutil.py +0 -0
  175. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/py.typed +0 -0
  176. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/pyinstrument.py +0 -0
  177. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/pytest.py +0 -0
  178. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/pytest_plugins/__init__.py +0 -0
  179. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/pytest_plugins/pytest_randomly.py +0 -0
  180. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/pytest_plugins/pytest_regressions.py +0 -0
  181. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/pytest_regressions.py +0 -0
  182. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/random.py +0 -0
  183. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/re.py +0 -0
  184. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/redis.py +0 -0
  185. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/reprlib.py +0 -0
  186. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/scipy.py +0 -0
  187. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/sentinel.py +0 -0
  188. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/shelve.py +0 -0
  189. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/slack_sdk.py +0 -0
  190. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/socket.py +0 -0
  191. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/sqlalchemy.py +0 -0
  192. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/sqlalchemy_polars.py +0 -0
  193. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/statsmodels.py +0 -0
  194. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/string.py +0 -0
  195. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/tempfile.py +0 -0
  196. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/text.py +0 -0
  197. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/threading.py +0 -0
  198. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/timer.py +0 -0
  199. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/traceback.py +0 -0
  200. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/typed_settings.py +0 -0
  201. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/typing.py +0 -0
  202. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/tzdata.py +0 -0
  203. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/tzlocal.py +0 -0
  204. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/uuid.py +0 -0
  205. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/version.py +0 -0
  206. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/warnings.py +0 -0
  207. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/whenever.py +0 -0
  208. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/src/utilities/zipfile.py +0 -0
  209. {dycw_utilities-0.159.2 → dycw_utilities-0.159.4}/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.2
3
+ Version: 0.159.4
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.2"
230
+ version = "0.159.4"
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.2"
262
+ current_version = "0.159.4"
263
263
 
264
264
  [[tool.bumpversion.files]]
265
265
  filename = "src/utilities/__init__.py"
@@ -843,22 +843,20 @@ class TestMaxLongAndDouble:
843
843
 
844
844
  class TestNumberOfDecimals:
845
845
  max_int: ClassVar[int] = int(1e6)
846
+ cases: ClassVar[list[tuple[float, int]]] = [
847
+ (0.0, 0),
848
+ (0.1, 1),
849
+ (0.12, 2),
850
+ (0.123, 3),
851
+ (0.1234, 4),
852
+ (0.12345, 5),
853
+ (0.123456, 6),
854
+ (0.1234567, 7),
855
+ (0.12345678, 8),
856
+ (0.123456789, 9),
857
+ ]
846
858
 
847
- @given(
848
- integer=integers(-max_int, max_int),
849
- case=sampled_from([
850
- (0.0, 0),
851
- (0.1, 1),
852
- (0.12, 2),
853
- (0.123, 3),
854
- (0.1234, 4),
855
- (0.12345, 5),
856
- (0.123456, 6),
857
- (0.1234567, 7),
858
- (0.12345678, 8),
859
- (0.123456789, 9),
860
- ]),
861
- )
859
+ @given(integer=integers(-max_int, max_int), case=sampled_from(cases))
862
860
  def test_main(self, *, integer: int, case: tuple[float, int]) -> None:
863
861
  frac, expected = case
864
862
  x = integer + frac
@@ -870,7 +868,7 @@ class TestNumberOfDecimals:
870
868
  with raises(
871
869
  NumberOfDecimalsError,
872
870
  match=escape(
873
- "Could not determine number of decimals of 1.401298464324817e-45 (up to 20)"
871
+ "Could not determine number of decimals of 1.401298464324817e-45 (up to 10)"
874
872
  ),
875
873
  ):
876
874
  _ = number_of_decimals(x)
@@ -3,6 +3,7 @@ from __future__ import annotations
3
3
  import datetime as dt
4
4
  import enum
5
5
  import itertools
6
+ import math
6
7
  from dataclasses import dataclass, field
7
8
  from enum import auto
8
9
  from itertools import chain, repeat
@@ -59,6 +60,7 @@ from pytest import mark, param, raises
59
60
  from whenever import DateDelta, DateTimeDelta, PlainDateTime, TimeDelta, ZonedDateTime
60
61
 
61
62
  import tests.test_math
63
+ import utilities.math
62
64
  import utilities.polars
63
65
  from utilities.hypothesis import (
64
66
  date_deltas,
@@ -77,7 +79,6 @@ from utilities.hypothesis import (
77
79
  zoned_date_time_periods,
78
80
  zoned_date_times,
79
81
  )
80
- from utilities.math import number_of_decimals
81
82
  from utilities.numpy import DEFAULT_RNG
82
83
  from utilities.pathlib import PWD
83
84
  from utilities.polars import (
@@ -122,8 +123,6 @@ from utilities.polars import (
122
123
  _GetDataTypeOrSeriesTimeZoneNotDateTimeError,
123
124
  _GetDataTypeOrSeriesTimeZoneNotZonedError,
124
125
  _GetDataTypeOrSeriesTimeZoneStructNonUniqueError,
125
- _GetSeriesNumberOfDecimalsAllNullError,
126
- _GetSeriesNumberOfDecimalsNotFloatError,
127
126
  _InsertBetweenMissingColumnsError,
128
127
  _InsertBetweenNonConsecutiveError,
129
128
  _IsNearEventAfterError,
@@ -168,7 +167,6 @@ from utilities.polars import (
168
167
  get_data_type_or_series_time_zone,
169
168
  get_expr_name,
170
169
  get_frequency_spectrum,
171
- get_series_number_of_decimals,
172
170
  increasing_horizontal,
173
171
  insert_after,
174
172
  insert_before,
@@ -182,6 +180,7 @@ from utilities.polars import (
182
180
  nan_sum_agg,
183
181
  nan_sum_cols,
184
182
  normal,
183
+ number_of_decimals,
185
184
  offset_datetime,
186
185
  one_column,
187
186
  order_of_magnitude,
@@ -1659,34 +1658,6 @@ class TestGetFrequencySpectrum:
1659
1658
  assert allclose(result.filter(col("frequency").abs() > 0.02)["amplitude"], 0.0)
1660
1659
 
1661
1660
 
1662
- class TestGetSeriesNumberOfDecimals:
1663
- @given(data=data(), n=hypothesis.strategies.integers(1, 10), nullable=booleans())
1664
- def test_main(self, *, data: DataObject, n: int, nullable: bool) -> None:
1665
- strategy = int64s() | none() if nullable else int64s()
1666
- ints_or_none = data.draw(lists(strategy, min_size=1, max_size=10))
1667
- values = [None if i is None else i / 10**n for i in ints_or_none]
1668
- series = Series(values=values, dtype=Float64)
1669
- result = get_series_number_of_decimals(series, nullable=nullable)
1670
- if not nullable:
1671
- assert result is not None
1672
- expected = max(number_of_decimals(v) for v in values if v is not None)
1673
- assert result == expected
1674
-
1675
- def test_error_not_float(self) -> None:
1676
- with raises(
1677
- _GetSeriesNumberOfDecimalsNotFloatError,
1678
- match="Data type must be Float64; got Boolean",
1679
- ):
1680
- _ = get_series_number_of_decimals(Series(dtype=Boolean))
1681
-
1682
- def test_error_not_zoned(self) -> None:
1683
- with raises(
1684
- _GetSeriesNumberOfDecimalsAllNullError,
1685
- match="Series must not be all-null; got .*",
1686
- ):
1687
- _ = get_series_number_of_decimals(Series(dtype=Float64))
1688
-
1689
-
1690
1661
  class TestIncreasingAndDecreasingHorizontal:
1691
1662
  def test_main(self) -> None:
1692
1663
  df = DataFrame(
@@ -1828,6 +1799,18 @@ class TestIntegers:
1828
1799
  assert series.is_between(0, high, closed="left").all()
1829
1800
 
1830
1801
 
1802
+ class TestIsClose:
1803
+ @given(values=pairs(float64s()), rel_tol=floats(0.0, 1.0), abs_tol=floats(0.0, 1.0))
1804
+ def test_main(
1805
+ self, *, values: tuple[float, float], rel_tol: float, abs_tol: float
1806
+ ) -> None:
1807
+ x, y = values
1808
+ x_sr, y_sr = [Series(values=[i], dtype=Float64) for i in values]
1809
+ result = utilities.polars.is_close(x_sr, y_sr, rel_tol=rel_tol, abs_tol=abs_tol)
1810
+ expected = math.isclose(x, y, rel_tol=rel_tol, abs_tol=abs_tol)
1811
+ assert result.item() is expected
1812
+
1813
+
1831
1814
  class TestIsNearEvent:
1832
1815
  df: ClassVar[DataFrame] = DataFrame(
1833
1816
  data=[
@@ -2248,6 +2231,22 @@ class TestNormal:
2248
2231
  assert series.is_finite().all()
2249
2232
 
2250
2233
 
2234
+ class TestNumberOfDecimals:
2235
+ @given(
2236
+ integer=hypothesis.strategies.integers(
2237
+ -tests.test_math.TestNumberOfDecimals.max_int,
2238
+ tests.test_math.TestNumberOfDecimals.max_int,
2239
+ ),
2240
+ case=sampled_from(tests.test_math.TestNumberOfDecimals.cases),
2241
+ )
2242
+ def test_main(self, *, integer: int, case: tuple[float, int]) -> None:
2243
+ frac, expected = case
2244
+ x = integer + frac
2245
+ series = Series(name="x", values=[x], dtype=Float64)
2246
+ result = number_of_decimals(series)
2247
+ assert result.item() == expected
2248
+
2249
+
2251
2250
  class TestOffsetDateTime:
2252
2251
  @mark.parametrize(
2253
2252
  ("n", "time"), [param(1, whenever.Time(13, 30)), param(2, whenever.Time(15))]
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.159.2"
3
+ __version__ = "0.159.4"
@@ -641,7 +641,10 @@ def _is_close(
641
641
  ##
642
642
 
643
643
 
644
- def number_of_decimals(x: float, /, *, max_decimals: int = 20) -> int:
644
+ MAX_DECIMALS = 10
645
+
646
+
647
+ def number_of_decimals(x: float, /, *, max_decimals: int = MAX_DECIMALS) -> int:
645
648
  """Get the number of decimals."""
646
649
  _, frac = divmod(x, 1)
647
650
  results = (
@@ -889,6 +892,7 @@ def significant_figures(x: float, /, *, n: int = 2) -> str:
889
892
 
890
893
 
891
894
  __all__ = [
895
+ "MAX_DECIMALS",
892
896
  "MAX_FLOAT32",
893
897
  "MAX_FLOAT64",
894
898
  "MAX_INT8",
@@ -36,6 +36,7 @@ from polars import (
36
36
  datetime_range,
37
37
  int_range,
38
38
  lit,
39
+ max_horizontal,
39
40
  struct,
40
41
  sum_horizontal,
41
42
  when,
@@ -52,11 +53,10 @@ from polars.schema import Schema
52
53
  from polars.testing import assert_frame_equal, assert_series_equal
53
54
  from whenever import DateDelta, DateTimeDelta, PlainDateTime, TimeDelta, ZonedDateTime
54
55
 
56
+ import utilities.math
55
57
  from utilities.dataclasses import yield_fields
56
58
  from utilities.errors import ImpossibleCaseError
57
59
  from utilities.functions import (
58
- EnsureIntError,
59
- ensure_int,
60
60
  is_dataclass_class,
61
61
  is_dataclass_instance,
62
62
  make_isinstance,
@@ -79,12 +79,12 @@ from utilities.iterables import (
79
79
  )
80
80
  from utilities.json import write_formatted_json
81
81
  from utilities.math import (
82
+ MAX_DECIMALS,
82
83
  CheckIntegerError,
83
84
  check_integer,
84
85
  ewm_parameters,
85
86
  is_less_than,
86
87
  is_non_negative,
87
- number_of_decimals,
88
88
  )
89
89
  from utilities.reprlib import get_repr
90
90
  from utilities.types import MaybeStr, Number, PathLike, WeekDay
@@ -1426,56 +1426,6 @@ def get_frequency_spectrum(series: Series, /, *, d: int = 1) -> DataFrame:
1426
1426
  ##
1427
1427
 
1428
1428
 
1429
- @overload
1430
- def get_series_number_of_decimals(
1431
- series: Series, /, *, nullable: Literal[True]
1432
- ) -> int | None: ...
1433
- @overload
1434
- def get_series_number_of_decimals(
1435
- series: Series, /, *, nullable: Literal[False] = False
1436
- ) -> int: ...
1437
- @overload
1438
- def get_series_number_of_decimals(
1439
- series: Series, /, *, nullable: bool = False
1440
- ) -> int | None: ...
1441
- def get_series_number_of_decimals(
1442
- series: Series, /, *, nullable: bool = False
1443
- ) -> int | None:
1444
- """Get the number of decimals of a series."""
1445
- if not isinstance(dtype := series.dtype, Float64):
1446
- raise _GetSeriesNumberOfDecimalsNotFloatError(dtype=dtype)
1447
- decimals = series.map_elements(number_of_decimals, return_dtype=Int64).max()
1448
- try:
1449
- return ensure_int(decimals, nullable=nullable)
1450
- except EnsureIntError:
1451
- raise _GetSeriesNumberOfDecimalsAllNullError(series=series) from None
1452
-
1453
-
1454
- @dataclass(kw_only=True, slots=True)
1455
- class GetSeriesNumberOfDecimalsError(Exception): ...
1456
-
1457
-
1458
- @dataclass(kw_only=True, slots=True)
1459
- class _GetSeriesNumberOfDecimalsNotFloatError(GetSeriesNumberOfDecimalsError):
1460
- dtype: DataType
1461
-
1462
- @override
1463
- def __str__(self) -> str:
1464
- return f"Data type must be Float64; got {self.dtype}"
1465
-
1466
-
1467
- @dataclass(kw_only=True, slots=True)
1468
- class _GetSeriesNumberOfDecimalsAllNullError(GetSeriesNumberOfDecimalsError):
1469
- series: Series
1470
-
1471
- @override
1472
- def __str__(self) -> str:
1473
- return f"Series must not be all-null; got {self.series}"
1474
-
1475
-
1476
- ##
1477
-
1478
-
1479
1429
  @overload
1480
1430
  def increasing_horizontal(*columns: ExprLike) -> Expr: ...
1481
1431
  @overload
@@ -1641,6 +1591,42 @@ def integers(
1641
1591
  ##
1642
1592
 
1643
1593
 
1594
+ @overload
1595
+ def is_close(
1596
+ x: ExprLike, y: ExprLike, /, *, rel_tol: float = 1e-9, abs_tol: float = 0
1597
+ ) -> Expr: ...
1598
+ @overload
1599
+ def is_close(
1600
+ x: Series, y: Series, /, *, rel_tol: float = 1e-9, abs_tol: float = 0
1601
+ ) -> Series: ...
1602
+ @overload
1603
+ def is_close(
1604
+ x: IntoExprColumn,
1605
+ y: IntoExprColumn,
1606
+ /,
1607
+ *,
1608
+ rel_tol: float = 1e-9,
1609
+ abs_tol: float = 0,
1610
+ ) -> ExprOrSeries: ...
1611
+ def is_close(
1612
+ x: IntoExprColumn,
1613
+ y: IntoExprColumn,
1614
+ /,
1615
+ *,
1616
+ rel_tol: float = 1e-9,
1617
+ abs_tol: float = 0,
1618
+ ) -> ExprOrSeries:
1619
+ """Check if two columns are close."""
1620
+ x, y = map(ensure_expr_or_series, [x, y])
1621
+ result = (x - y).abs() <= max_horizontal(
1622
+ rel_tol * max_horizontal(x.abs(), y.abs()), abs_tol
1623
+ )
1624
+ return try_reify_expr(result, x, y)
1625
+
1626
+
1627
+ ##
1628
+
1629
+
1644
1630
  @overload
1645
1631
  def is_near_event(
1646
1632
  *exprs: ExprLike, before: int = 0, after: int = 0, **named_exprs: ExprLike
@@ -1986,6 +1972,26 @@ def normal(
1986
1972
  ##
1987
1973
 
1988
1974
 
1975
+ def number_of_decimals(
1976
+ series: Series, /, *, max_decimals: int = MAX_DECIMALS
1977
+ ) -> Series:
1978
+ """Get the number of decimals."""
1979
+ frac = series - series.floor()
1980
+ results = [
1981
+ _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)
1985
+
1986
+
1987
+ def _number_of_decimals_check_scale(frac: Series, scale: int, /) -> Series:
1988
+ scaled = 10**scale * frac
1989
+ return is_close(scaled, scaled.round()).alias(str(scale))
1990
+
1991
+
1992
+ ##
1993
+
1994
+
1989
1995
  def offset_datetime(
1990
1996
  datetime: ZonedDateTime, offset: str, /, *, n: int = 1
1991
1997
  ) -> ZonedDateTime:
@@ -2352,7 +2358,7 @@ def round_to_float(
2352
2358
  """Round a column to the nearest multiple of another float."""
2353
2359
  x = ensure_expr_or_series(x)
2354
2360
  z = (x / y).round(mode=mode) * y
2355
- return z.round(decimals=number_of_decimals(y) + 1)
2361
+ return z.round(decimals=utilities.math.number_of_decimals(y) + 1)
2356
2362
 
2357
2363
 
2358
2364
  ##
@@ -2558,7 +2564,6 @@ __all__ = [
2558
2564
  "ExprOrSeries",
2559
2565
  "FiniteEWMMeanError",
2560
2566
  "GetDataTypeOrSeriesTimeZoneError",
2561
- "GetSeriesNumberOfDecimalsError",
2562
2567
  "InsertAfterError",
2563
2568
  "InsertBeforeError",
2564
2569
  "InsertBetweenError",
@@ -2597,12 +2602,12 @@ __all__ = [
2597
2602
  "get_data_type_or_series_time_zone",
2598
2603
  "get_expr_name",
2599
2604
  "get_frequency_spectrum",
2600
- "get_series_number_of_decimals",
2601
2605
  "increasing_horizontal",
2602
2606
  "insert_after",
2603
2607
  "insert_before",
2604
2608
  "insert_between",
2605
2609
  "integers",
2610
+ "is_close",
2606
2611
  "is_false",
2607
2612
  "is_near_event",
2608
2613
  "is_true",
@@ -2612,6 +2617,7 @@ __all__ = [
2612
2617
  "nan_sum_agg",
2613
2618
  "nan_sum_cols",
2614
2619
  "normal",
2620
+ "number_of_decimals",
2615
2621
  "offset_datetime",
2616
2622
  "one_column",
2617
2623
  "order_of_magnitude",
@@ -79,6 +79,9 @@ type MaybeCoro[T] = T | Coro[T]
79
79
 
80
80
 
81
81
  # collections.abc
82
+ type SupportsFloatOrIndex = SupportsFloat | SupportsIndex
83
+
84
+
82
85
  @runtime_checkable
83
86
  class SupportsKeysAndGetItem(Protocol[_T, _T_co]):
84
87
  def keys(self) -> Iterable[_T]: ... # pragma: no cover
@@ -328,6 +331,7 @@ __all__ = [
328
331
  "SupportsBytes",
329
332
  "SupportsComplex",
330
333
  "SupportsFloat",
334
+ "SupportsFloatOrIndex",
331
335
  "SupportsGT",
332
336
  "SupportsInt",
333
337
  "SupportsInt",