dycw-utilities 0.112.9__tar.gz → 0.112.10__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (228) hide show
  1. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/PKG-INFO +12 -12
  2. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/pyproject.toml +14 -14
  3. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_numpy.py +13 -1
  4. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_polars.py +160 -9
  5. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/__init__.py +1 -1
  6. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/numpy.py +20 -1
  7. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/polars.py +165 -1
  8. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/.gitignore +0 -0
  9. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/LICENSE +0 -0
  10. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/README.md +0 -0
  11. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/__init__.py +0 -0
  12. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/conftest.py +0 -0
  13. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/modules/__init__.py +0 -0
  14. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/modules/package_missing/__init__.py +0 -0
  15. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/modules/package_missing/module.py +0 -0
  16. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/modules/package_with/__init__.py +0 -0
  17. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/modules/package_with/outer_1.py +0 -0
  18. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/modules/package_with/outer_2.py +0 -0
  19. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  20. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  21. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  22. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  23. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/modules/package_without/__init__.py +0 -0
  24. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/modules/package_without/module_1.py +0 -0
  25. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/modules/package_without/module_2.py +0 -0
  26. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/modules/standalone.py +0 -0
  27. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/modules/with_imports.py +0 -0
  28. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  29. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  30. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  31. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  32. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  33. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  34. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  35. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  36. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/scripts/__init__.py +0 -0
  37. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/scripts/test_async_service/__init__.py +0 -0
  38. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/scripts/test_async_service/__main__.py +0 -0
  39. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/scripts/test_async_service/run.sh +0 -0
  40. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/scripts/test_queue_processor/__init__.py +0 -0
  41. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/scripts/test_queue_processor/__main__.py +0 -0
  42. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/scripts/test_queue_processor/run.sh +0 -0
  43. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_altair.py +0 -0
  44. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_astor.py +0 -0
  45. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_asyncio.py +0 -0
  46. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_atomicwrites.py +0 -0
  47. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_atools.py +0 -0
  48. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_cachetools.py +0 -0
  49. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_click.py +0 -0
  50. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_concurrent.py +0 -0
  51. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_contextlib.py +0 -0
  52. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_contextvars.py +0 -0
  53. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_cryptography.py +0 -0
  54. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_cvxpy.py +0 -0
  55. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_dataclasses.py +0 -0
  56. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_datetime.py +0 -0
  57. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_enum.py +0 -0
  58. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_errors.py +0 -0
  59. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_eventkit.py +0 -0
  60. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_fastapi.py +0 -0
  61. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_fpdf2.py +0 -0
  62. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_functions.py +0 -0
  63. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_functools.py +0 -0
  64. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_getpass.py +0 -0
  65. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_git.py +0 -0
  66. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_hashlib.py +0 -0
  67. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_http.py +0 -0
  68. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_hypothesis.py +0 -0
  69. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_ipython.py +0 -0
  70. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_iterables.py +0 -0
  71. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_jupyter.py +0 -0
  72. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_lightweight_charts.py +0 -0
  73. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_logging.py +0 -0
  74. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_loguru.py +0 -0
  75. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_luigi.py +0 -0
  76. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_math.py +0 -0
  77. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_memory_profiler.py +0 -0
  78. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_modules.py +0 -0
  79. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_more_itertools.py +0 -0
  80. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_operator.py +0 -0
  81. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_optuna.py +0 -0
  82. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_orjson.py +0 -0
  83. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_os.py +0 -0
  84. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_parse.py +0 -0
  85. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_pathlib.py +0 -0
  86. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_period.py +0 -0
  87. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_pickle.py +0 -0
  88. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_platform.py +0 -0
  89. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_polars_ols.py +0 -0
  90. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_pqdm.py +0 -0
  91. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_pydantic.py +0 -0
  92. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_pyinstrument.py +0 -0
  93. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_pyrsistent.py +0 -0
  94. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_pytest.py +0 -0
  95. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_pytest_regressions.py +0 -0
  96. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_python_dotenv.py +0 -0
  97. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_random.py +0 -0
  98. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_re.py +0 -0
  99. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_redis.py +0 -0
  100. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_reprlib.py +0 -0
  101. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_rich.py +0 -0
  102. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_scipy.py +0 -0
  103. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_sentinel.py +0 -0
  104. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_shelve.py +0 -0
  105. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_slack_sdk.py +0 -0
  106. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_socket.py +0 -0
  107. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_sqlalchemy.py +0 -0
  108. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_sqlalchemy_polars.py +0 -0
  109. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_statsmodel.py +0 -0
  110. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_streamlit.py +0 -0
  111. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_sys.py +0 -0
  112. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_tempfile.py +0 -0
  113. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_tenacity.py +0 -0
  114. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_text.py +0 -0
  115. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_threading.py +0 -0
  116. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_timer.py +0 -0
  117. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_traceback.py +0 -0
  118. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_traceback_funcs/__init__.py +0 -0
  119. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_traceback_funcs/chain.py +0 -0
  120. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_traceback_funcs/decorated_async.py +0 -0
  121. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_traceback_funcs/decorated_sync.py +0 -0
  122. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_traceback_funcs/error_bind.py +0 -0
  123. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_traceback_funcs/many.py +0 -0
  124. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_traceback_funcs/one.py +0 -0
  125. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_traceback_funcs/recursive.py +0 -0
  126. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_traceback_funcs/task_group_one.py +0 -0
  127. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_traceback_funcs/task_group_two.py +0 -0
  128. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_traceback_funcs/two.py +0 -0
  129. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_traceback_funcs/untraced.py +0 -0
  130. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_types.py +0 -0
  131. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_typing.py +0 -0
  132. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_typing_funcs/__init__.py +0 -0
  133. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_typing_funcs/no_future.py +0 -0
  134. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_typing_funcs/with_future.py +0 -0
  135. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_tzdata.py +0 -0
  136. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_tzlocal.py +0 -0
  137. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_uuid.py +0 -0
  138. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_version.py +0 -0
  139. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_warnings.py +0 -0
  140. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_whenever.py +0 -0
  141. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_zipfile.py +0 -0
  142. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/tests/test_zoneinfo.py +0 -0
  143. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/altair.py +0 -0
  144. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/astor.py +0 -0
  145. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/asyncio.py +0 -0
  146. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/atomicwrites.py +0 -0
  147. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/atools.py +0 -0
  148. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/cachetools.py +0 -0
  149. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/click.py +0 -0
  150. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/concurrent.py +0 -0
  151. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/contextlib.py +0 -0
  152. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/contextvars.py +0 -0
  153. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/cryptography.py +0 -0
  154. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/cvxpy.py +0 -0
  155. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/dataclasses.py +0 -0
  156. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/datetime.py +0 -0
  157. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/enum.py +0 -0
  158. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/errors.py +0 -0
  159. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/eventkit.py +0 -0
  160. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/fastapi.py +0 -0
  161. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/fpdf2.py +0 -0
  162. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/functions.py +0 -0
  163. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/functools.py +0 -0
  164. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/getpass.py +0 -0
  165. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/git.py +0 -0
  166. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/hashlib.py +0 -0
  167. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/http.py +0 -0
  168. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/hypothesis.py +0 -0
  169. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/ipython.py +0 -0
  170. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/iterables.py +0 -0
  171. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/jupyter.py +0 -0
  172. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/lightweight_charts.py +0 -0
  173. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/logging.py +0 -0
  174. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/loguru.py +0 -0
  175. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/luigi.py +0 -0
  176. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/math.py +0 -0
  177. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/memory_profiler.py +0 -0
  178. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/modules.py +0 -0
  179. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/more_itertools.py +0 -0
  180. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/operator.py +0 -0
  181. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/optuna.py +0 -0
  182. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/orjson.py +0 -0
  183. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/os.py +0 -0
  184. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/parse.py +0 -0
  185. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/pathlib.py +0 -0
  186. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/period.py +0 -0
  187. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/pickle.py +0 -0
  188. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/platform.py +0 -0
  189. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/polars_ols.py +0 -0
  190. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/pqdm.py +0 -0
  191. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/py.typed +0 -0
  192. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/pydantic.py +0 -0
  193. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/pyinstrument.py +0 -0
  194. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/pyrsistent.py +0 -0
  195. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/pytest.py +0 -0
  196. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/pytest_regressions.py +0 -0
  197. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/python_dotenv.py +0 -0
  198. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/random.py +0 -0
  199. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/re.py +0 -0
  200. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/redis.py +0 -0
  201. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/reprlib.py +0 -0
  202. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/rich.py +0 -0
  203. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/scipy.py +0 -0
  204. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/sentinel.py +0 -0
  205. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/shelve.py +0 -0
  206. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/slack_sdk.py +0 -0
  207. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/socket.py +0 -0
  208. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/sqlalchemy.py +0 -0
  209. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/sqlalchemy_polars.py +0 -0
  210. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/statsmodels.py +0 -0
  211. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/streamlit.py +0 -0
  212. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/sys.py +0 -0
  213. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/tempfile.py +0 -0
  214. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/tenacity.py +0 -0
  215. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/text.py +0 -0
  216. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/threading.py +0 -0
  217. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/timer.py +0 -0
  218. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/traceback.py +0 -0
  219. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/types.py +0 -0
  220. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/typing.py +0 -0
  221. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/tzdata.py +0 -0
  222. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/tzlocal.py +0 -0
  223. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/uuid.py +0 -0
  224. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/version.py +0 -0
  225. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/warnings.py +0 -0
  226. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/whenever.py +0 -0
  227. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/zipfile.py +0 -0
  228. {dycw_utilities-0.112.9 → dycw_utilities-0.112.10}/src/utilities/zoneinfo.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.112.9
3
+ Version: 0.112.10
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -24,7 +24,7 @@ Provides-Extra: zzz-test-altair
24
24
  Requires-Dist: altair<5.6,>=5.5.0; extra == 'zzz-test-altair'
25
25
  Requires-Dist: atomicwrites<1.5,>=1.4.1; extra == 'zzz-test-altair'
26
26
  Requires-Dist: img2pdf<0.7,>=0.6.0; extra == 'zzz-test-altair'
27
- Requires-Dist: polars-lts-cpu<1.29,>=1.28.1; extra == 'zzz-test-altair'
27
+ Requires-Dist: polars-lts-cpu<1.30,>=1.29.0; extra == 'zzz-test-altair'
28
28
  Requires-Dist: vl-convert-python<1.8,>=1.7.0; extra == 'zzz-test-altair'
29
29
  Requires-Dist: whenever<0.8,>=0.7.3; extra == 'zzz-test-altair'
30
30
  Provides-Extra: zzz-test-astor
@@ -48,7 +48,7 @@ Provides-Extra: zzz-test-cvxpy
48
48
  Requires-Dist: cvxpy<1.7,>=1.6.5; extra == 'zzz-test-cvxpy'
49
49
  Provides-Extra: zzz-test-dataclasses
50
50
  Requires-Dist: orjson<3.11,>=3.10.15; extra == 'zzz-test-dataclasses'
51
- Requires-Dist: polars-lts-cpu<1.29,>=1.28.1; extra == 'zzz-test-dataclasses'
51
+ Requires-Dist: polars-lts-cpu<1.30,>=1.29.0; extra == 'zzz-test-dataclasses'
52
52
  Requires-Dist: whenever<0.8,>=0.7.3; extra == 'zzz-test-dataclasses'
53
53
  Provides-Extra: zzz-test-datetime
54
54
  Requires-Dist: tzlocal<5.4,>=5.3.1; extra == 'zzz-test-datetime'
@@ -70,7 +70,7 @@ Provides-Extra: zzz-test-getpass
70
70
  Provides-Extra: zzz-test-git
71
71
  Provides-Extra: zzz-test-hashlib
72
72
  Requires-Dist: orjson<3.11,>=3.10.15; extra == 'zzz-test-hashlib'
73
- Requires-Dist: polars-lts-cpu<1.29,>=1.28.1; extra == 'zzz-test-hashlib'
73
+ Requires-Dist: polars-lts-cpu<1.30,>=1.29.0; extra == 'zzz-test-hashlib'
74
74
  Requires-Dist: whenever<0.8,>=0.7.3; extra == 'zzz-test-hashlib'
75
75
  Provides-Extra: zzz-test-http
76
76
  Requires-Dist: atomicwrites<1.5,>=1.4.1; extra == 'zzz-test-http'
@@ -92,12 +92,12 @@ Requires-Dist: whenever<0.8,>=0.7.3; extra == 'zzz-test-hypothesis'
92
92
  Provides-Extra: zzz-test-ipython
93
93
  Requires-Dist: ipython<9.1,>=9.0.1; extra == 'zzz-test-ipython'
94
94
  Provides-Extra: zzz-test-iterables
95
- Requires-Dist: polars-lts-cpu<1.29,>=1.28.1; extra == 'zzz-test-iterables'
95
+ Requires-Dist: polars-lts-cpu<1.30,>=1.29.0; extra == 'zzz-test-iterables'
96
96
  Requires-Dist: whenever<0.8,>=0.7.3; extra == 'zzz-test-iterables'
97
97
  Provides-Extra: zzz-test-jupyter
98
98
  Requires-Dist: jupyterlab<4.3,>=4.2.0; extra == 'zzz-test-jupyter'
99
99
  Requires-Dist: pandas<2.3,>=2.2.2; extra == 'zzz-test-jupyter'
100
- Requires-Dist: polars-lts-cpu<1.29,>=1.28.1; extra == 'zzz-test-jupyter'
100
+ Requires-Dist: polars-lts-cpu<1.30,>=1.29.0; extra == 'zzz-test-jupyter'
101
101
  Provides-Extra: zzz-test-logging
102
102
  Requires-Dist: atomicwrites<1.5,>=1.4.1; extra == 'zzz-test-logging'
103
103
  Requires-Dist: coloredlogs<15.1,>=15.0.1; extra == 'zzz-test-logging'
@@ -121,13 +121,13 @@ Requires-Dist: more-itertools<10.8,>=10.7.0; extra == 'zzz-test-more-itertools'
121
121
  Provides-Extra: zzz-test-numpy
122
122
  Requires-Dist: numpy<2.3,>=2.2.5; extra == 'zzz-test-numpy'
123
123
  Provides-Extra: zzz-test-operator
124
- Requires-Dist: polars-lts-cpu<1.29,>=1.28.1; extra == 'zzz-test-operator'
124
+ Requires-Dist: polars-lts-cpu<1.30,>=1.29.0; extra == 'zzz-test-operator'
125
125
  Requires-Dist: whenever<0.8,>=0.7.3; extra == 'zzz-test-operator'
126
126
  Provides-Extra: zzz-test-optuna
127
127
  Requires-Dist: optuna<4.4,>=4.3.0; extra == 'zzz-test-optuna'
128
128
  Provides-Extra: zzz-test-orjson
129
129
  Requires-Dist: orjson<3.11,>=3.10.15; extra == 'zzz-test-orjson'
130
- Requires-Dist: polars-lts-cpu<1.29,>=1.28.1; extra == 'zzz-test-orjson'
130
+ Requires-Dist: polars-lts-cpu<1.30,>=1.29.0; extra == 'zzz-test-orjson'
131
131
  Requires-Dist: rich<14.1,>=14.0.0; extra == 'zzz-test-orjson'
132
132
  Requires-Dist: tzlocal<5.4,>=5.3.1; extra == 'zzz-test-orjson'
133
133
  Requires-Dist: whenever<0.8,>=0.7.3; extra == 'zzz-test-orjson'
@@ -138,7 +138,7 @@ Requires-Dist: atomicwrites<1.5,>=1.4.1; extra == 'zzz-test-pickle'
138
138
  Provides-Extra: zzz-test-platform
139
139
  Provides-Extra: zzz-test-polars
140
140
  Requires-Dist: dacite<1.10,>=1.9.2; extra == 'zzz-test-polars'
141
- Requires-Dist: polars-lts-cpu<1.29,>=1.28.1; extra == 'zzz-test-polars'
141
+ Requires-Dist: polars-lts-cpu<1.30,>=1.29.0; extra == 'zzz-test-polars'
142
142
  Requires-Dist: whenever<0.8,>=0.7.3; extra == 'zzz-test-polars'
143
143
  Provides-Extra: zzz-test-pqdm
144
144
  Requires-Dist: pqdm<0.3,>=0.2.0; extra == 'zzz-test-pqdm'
@@ -164,7 +164,7 @@ Provides-Extra: zzz-test-random
164
164
  Provides-Extra: zzz-test-re
165
165
  Provides-Extra: zzz-test-redis
166
166
  Requires-Dist: orjson<3.11,>=3.10.15; extra == 'zzz-test-redis'
167
- Requires-Dist: polars-lts-cpu<1.29,>=1.28.1; extra == 'zzz-test-redis'
167
+ Requires-Dist: polars-lts-cpu<1.30,>=1.29.0; extra == 'zzz-test-redis'
168
168
  Requires-Dist: redis<5.3,>=5.2.1; extra == 'zzz-test-redis'
169
169
  Requires-Dist: rich<14.1,>=14.0.0; extra == 'zzz-test-redis'
170
170
  Requires-Dist: tenacity<9.0,>=8.5.0; extra == 'zzz-test-redis'
@@ -192,7 +192,7 @@ Requires-Dist: aiosqlite<0.22,>=0.21.0; extra == 'zzz-test-sqlalchemy-polars'
192
192
  Requires-Dist: asyncpg<0.31,>=0.30.0; extra == 'zzz-test-sqlalchemy-polars'
193
193
  Requires-Dist: greenlet<3.3,>=3.2.0; extra == 'zzz-test-sqlalchemy-polars'
194
194
  Requires-Dist: nest-asyncio<1.7,>=1.6.0; extra == 'zzz-test-sqlalchemy-polars'
195
- Requires-Dist: polars-lts-cpu<1.29,>=1.28.1; extra == 'zzz-test-sqlalchemy-polars'
195
+ Requires-Dist: polars-lts-cpu<1.30,>=1.29.0; extra == 'zzz-test-sqlalchemy-polars'
196
196
  Requires-Dist: sqlalchemy<2.1,>=2.0.40; extra == 'zzz-test-sqlalchemy-polars'
197
197
  Requires-Dist: tenacity<9.0,>=8.5.0; extra == 'zzz-test-sqlalchemy-polars'
198
198
  Requires-Dist: whenever<0.8,>=0.7.3; extra == 'zzz-test-sqlalchemy-polars'
@@ -217,7 +217,7 @@ Requires-Dist: tzlocal<5.4,>=5.3.1; extra == 'zzz-test-traceback'
217
217
  Requires-Dist: whenever<0.8,>=0.7.3; extra == 'zzz-test-traceback'
218
218
  Provides-Extra: zzz-test-types
219
219
  Provides-Extra: zzz-test-typing
220
- Requires-Dist: polars-lts-cpu<1.29,>=1.28.1; extra == 'zzz-test-typing'
220
+ Requires-Dist: polars-lts-cpu<1.30,>=1.29.0; extra == 'zzz-test-typing'
221
221
  Requires-Dist: whenever<0.8,>=0.7.3; extra == 'zzz-test-typing'
222
222
  Provides-Extra: zzz-test-tzlocal
223
223
  Requires-Dist: tzlocal<5.4,>=5.3.1; extra == 'zzz-test-tzlocal'
@@ -40,7 +40,7 @@ dev = [
40
40
  "optuna >= 4.3.0, < 4.4",
41
41
  "orjson >= 3.10.18, < 3.11",
42
42
  "pathvalidate >= 3.2.3, < 3.3",
43
- "polars-lts-cpu >= 1.28.1, < 1.29",
43
+ "polars-lts-cpu >= 1.29.0, < 1.30",
44
44
  "polars-ols >= 0.3.5, < 0.4",
45
45
  "pqdm >= 0.2.0, < 0.3",
46
46
  "psycopg2-binary >= 2.9.10, < 2.10", # for sqlalchemy
@@ -93,7 +93,7 @@ dependencies = [
93
93
  name = "dycw-utilities"
94
94
  readme = "README.md"
95
95
  requires-python = ">= 3.12"
96
- version = "0.112.9"
96
+ version = "0.112.10"
97
97
 
98
98
  [project.optional-dependencies]
99
99
  test = [
@@ -116,7 +116,7 @@ zzz-test-altair = [
116
116
  "altair >= 5.5.0, < 5.6",
117
117
  "atomicwrites >= 1.4.1, < 1.5",
118
118
  "img2pdf >= 0.6.0, < 0.7",
119
- "polars-lts-cpu >= 1.28.1, < 1.29",
119
+ "polars-lts-cpu >= 1.29.0, < 1.30",
120
120
  "vl-convert-python >= 1.7.0, < 1.8",
121
121
  "whenever >= 0.7.3, < 0.8",
122
122
  ]
@@ -138,7 +138,7 @@ zzz-test-cryptography = ["cryptography >= 44.0.2, < 44.1"]
138
138
  zzz-test-cvxpy = ["cvxpy >= 1.6.5, < 1.7"]
139
139
  zzz-test-dataclasses = [
140
140
  "orjson >= 3.10.15, < 3.11",
141
- "polars-lts-cpu >= 1.28.1, < 1.29",
141
+ "polars-lts-cpu >= 1.29.0, < 1.30",
142
142
  "whenever >= 0.7.3, < 0.8",
143
143
  ]
144
144
  zzz-test-datetime = [
@@ -162,7 +162,7 @@ zzz-test-functools = []
162
162
  zzz-test-getpass = []
163
163
  zzz-test-git = []
164
164
  zzz-test-hashlib = [
165
- "polars-lts-cpu >= 1.28.1, < 1.29",
165
+ "polars-lts-cpu >= 1.29.0, < 1.30",
166
166
  "orjson >= 3.10.15, < 3.11",
167
167
  "whenever >= 0.7.3, < 0.8",
168
168
  ]
@@ -187,13 +187,13 @@ zzz-test-hypothesis = [
187
187
  ]
188
188
  zzz-test-ipython = ["ipython >= 9.0.1, < 9.1"]
189
189
  zzz-test-iterables = [
190
- "polars-lts-cpu >= 1.28.1, < 1.29",
190
+ "polars-lts-cpu >= 1.29.0, < 1.30",
191
191
  "whenever >= 0.7.3, < 0.8",
192
192
  ]
193
193
  zzz-test-jupyter = [
194
194
  "jupyterlab >= 4.2.0, < 4.3",
195
195
  "pandas >= 2.2.2, < 2.3",
196
- "polars-lts-cpu >= 1.28.1, < 1.29",
196
+ "polars-lts-cpu >= 1.29.0, < 1.30",
197
197
  ]
198
198
  zzz-test-logging = [
199
199
  "atomicwrites >= 1.4.1, < 1.5",
@@ -215,13 +215,13 @@ zzz-test-modules = []
215
215
  zzz-test-more-itertools = ["more-itertools >= 10.7.0, < 10.8"]
216
216
  zzz-test-numpy = ["numpy >= 2.2.5, < 2.3"]
217
217
  zzz-test-operator = [
218
- "polars-lts-cpu >= 1.28.1, < 1.29",
218
+ "polars-lts-cpu >= 1.29.0, < 1.30",
219
219
  "whenever >= 0.7.3, < 0.8",
220
220
  ]
221
221
  zzz-test-optuna = ["optuna >= 4.3.0, < 4.4"]
222
222
  zzz-test-orjson = [
223
223
  "orjson >= 3.10.15, < 3.11",
224
- "polars-lts-cpu >= 1.28.1, < 1.29",
224
+ "polars-lts-cpu >= 1.29.0, < 1.30",
225
225
  "rich >= 14.0.0, < 14.1",
226
226
  "tzlocal >= 5.3.1, < 5.4",
227
227
  "whenever >= 0.7.3, < 0.8",
@@ -232,7 +232,7 @@ zzz-test-pickle = ["atomicwrites >= 1.4.1, < 1.5"]
232
232
  zzz-test-platform = []
233
233
  zzz-test-polars = [
234
234
  "dacite >= 1.9.2, < 1.10",
235
- "polars-lts-cpu >= 1.28.1, < 1.29",
235
+ "polars-lts-cpu >= 1.29.0, < 1.30",
236
236
  "whenever >= 0.7.3, < 0.8",
237
237
  ]
238
238
  zzz-test-pqdm = ["pqdm >= 0.2.0, < 0.3"]
@@ -260,7 +260,7 @@ zzz-test-random = []
260
260
  zzz-test-re = []
261
261
  zzz-test-redis = [
262
262
  "orjson >= 3.10.15, < 3.11",
263
- "polars-lts-cpu >= 1.28.1, < 1.29",
263
+ "polars-lts-cpu >= 1.29.0, < 1.30",
264
264
  "redis >= 5.2.1, < 5.3",
265
265
  "rich >= 14.0.0, < 14.1",
266
266
  "tenacity >= 8.5.0, < 9.0", # limited by luigi
@@ -289,7 +289,7 @@ zzz-test-sqlalchemy-polars = [
289
289
  "asyncpg >= 0.30.0, < 0.31", # for sqlalchemy async
290
290
  "greenlet >= 3.2.0, < 3.3", # for sqlalchemy async
291
291
  "nest-asyncio >= 1.6.0, < 1.7", # for sqlalchemy async
292
- "polars-lts-cpu >= 1.28.1, < 1.29",
292
+ "polars-lts-cpu >= 1.29.0, < 1.30",
293
293
  "sqlalchemy >= 2.0.40, < 2.1",
294
294
  "tenacity >= 8.5.0, < 9.0", # limited by luigi
295
295
  "whenever >= 0.7.3, < 0.8",
@@ -317,7 +317,7 @@ zzz-test-traceback = [
317
317
  ]
318
318
  zzz-test-types = []
319
319
  zzz-test-typing = [
320
- "polars-lts-cpu >= 1.28.1, < 1.29",
320
+ "polars-lts-cpu >= 1.29.0, < 1.30",
321
321
  "whenever >= 0.7.3, < 0.8",
322
322
  ]
323
323
  zzz-test-tzlocal = ["tzlocal >= 5.3.1, < 5.4"]
@@ -336,7 +336,7 @@ zzz-test-zoneinfo = [
336
336
  # bump-my-version
337
337
  [tool.bumpversion]
338
338
  allow_dirty = true
339
- current_version = "0.112.9"
339
+ current_version = "0.112.10"
340
340
 
341
341
  [[tool.bumpversion.files]]
342
342
  filename = "src/utilities/__init__.py"
@@ -5,7 +5,8 @@ from typing import TYPE_CHECKING, Any, Literal
5
5
 
6
6
  import numpy as np
7
7
  from hypothesis import assume, given
8
- from hypothesis.strategies import DataObject, data, floats, integers, none
8
+ from hypothesis.extra.numpy import array_shapes
9
+ from hypothesis.strategies import DataObject, data, floats, integers, none, sampled_from
9
10
  from numpy import (
10
11
  arange,
11
12
  array,
@@ -36,6 +37,7 @@ from utilities.numpy import (
36
37
  FlatN0MultipleError,
37
38
  NDArrayF,
38
39
  NDArrayI,
40
+ ShapeLike,
39
41
  ShiftError,
40
42
  SigmoidError,
41
43
  _BoxCarLocationsError,
@@ -44,6 +46,7 @@ from utilities.numpy import (
44
46
  adjust_frequencies,
45
47
  array_indexer,
46
48
  as_int,
49
+ bernoulli,
47
50
  boxcar,
48
51
  discretize,
49
52
  fillna,
@@ -285,6 +288,15 @@ class TestDiscretize:
285
288
  assert_equal(result, expected)
286
289
 
287
290
 
291
+ class TestBernoulli:
292
+ @given(case=sampled_from([(0.0, False), (1.0, True)]), size=array_shapes())
293
+ def test_main(self, *, case: tuple[float, bool], size: ShapeLike) -> None:
294
+ true, expected = case
295
+ result = bernoulli(true=true, size=size)
296
+ assert (result == expected).all()
297
+ assert result.shape == size
298
+
299
+
288
300
  class TestBoxCar:
289
301
  @given(
290
302
  locs=pairs(floats(-10.0, 10.0), sorted=True),
@@ -50,6 +50,10 @@ from polars import (
50
50
  int_range,
51
51
  lit,
52
52
  )
53
+ from polars._typing import (
54
+ IntoExprColumn, # pyright: ignore[reportPrivateImportUsage]
55
+ SchemaDict, # pyright: ignore[reportPrivateImportUsage]
56
+ )
53
57
  from polars.testing import assert_frame_equal, assert_series_equal
54
58
  from pytest import raises
55
59
 
@@ -67,6 +71,7 @@ from utilities.numpy import DEFAULT_RNG
67
71
  from utilities.pathlib import PWD
68
72
  from utilities.polars import (
69
73
  AppendDataClassError,
74
+ BooleanValueCountsError,
70
75
  ColumnsToDictError,
71
76
  DatetimeHongKong,
72
77
  DatetimeTokyo,
@@ -113,8 +118,11 @@ from utilities.polars import (
113
118
  adjust_frequencies,
114
119
  append_dataclass,
115
120
  are_frames_equal,
121
+ bernoulli,
122
+ boolean_value_counts,
116
123
  ceil_datetime,
117
124
  check_polars_dataframe,
125
+ choice,
118
126
  collect_series,
119
127
  columns_to_dict,
120
128
  concat_series,
@@ -126,6 +134,7 @@ from utilities.polars import (
126
134
  drop_null_struct_series,
127
135
  ensure_data_type,
128
136
  ensure_expr_or_series,
137
+ ensure_expr_or_series_many,
129
138
  finite_ewm_mean,
130
139
  floor_datetime,
131
140
  get_data_type_or_series_time_zone,
@@ -160,11 +169,12 @@ from utilities.tzdata import HongKong, Tokyo, USCentral, USEastern
160
169
  from utilities.zoneinfo import UTC, get_time_zone_name
161
170
 
162
171
  if TYPE_CHECKING:
163
- from collections.abc import Callable, Mapping, Sequence
172
+ from collections.abc import Callable, Iterable, Mapping, Sequence
164
173
  from zoneinfo import ZoneInfo
165
174
 
166
175
  from polars._typing import (
167
176
  IntoExprColumn, # pyright: ignore[reportPrivateImportUsage]
177
+ PolarsDataType, # pyright: ignore[reportPrivateImportUsage]
168
178
  SchemaDict, # pyright: ignore[reportPrivateImportUsage]
169
179
  )
170
180
  from polars.datatypes import DataTypeClass
@@ -342,6 +352,87 @@ class TestAreFramesEqual:
342
352
  assert result is expected
343
353
 
344
354
 
355
+ class TestBernoulli:
356
+ @given(length=hypothesis.strategies.integers(0, 10))
357
+ def test_int(self, *, length: int) -> None:
358
+ series = bernoulli(length)
359
+ self._assert(series, length)
360
+
361
+ @given(length=hypothesis.strategies.integers(0, 10))
362
+ def test_series(self, *, length: int) -> None:
363
+ orig = int_range(end=length, eager=True)
364
+ series = bernoulli(orig)
365
+ self._assert(series, length)
366
+
367
+ @given(length=hypothesis.strategies.integers(0, 10))
368
+ def test_dataframe(self, *, length: int) -> None:
369
+ df = int_range(end=length, eager=True).to_frame()
370
+ series = bernoulli(df)
371
+ self._assert(series, length)
372
+
373
+ def _assert(self, series: Series, length: int, /) -> None:
374
+ assert series.dtype == Boolean
375
+ assert series.len() == length
376
+ assert series.is_not_null().all()
377
+
378
+
379
+ class TestBooleanValueCounts:
380
+ df: ClassVar[DataFrame] = DataFrame(
381
+ data=[
382
+ (False, False),
383
+ (True, None),
384
+ (True, True),
385
+ (True, None),
386
+ (False, True),
387
+ (None, True),
388
+ (False, False),
389
+ (False, True),
390
+ (False, False),
391
+ (None, True),
392
+ ],
393
+ schema={"x": Boolean, "y": Boolean},
394
+ orient="row",
395
+ )
396
+ schema: ClassVar[SchemaDict] = {
397
+ "name": String,
398
+ "true": UInt32,
399
+ "false": UInt32,
400
+ "null": UInt32,
401
+ "total": UInt32,
402
+ "true (%)": Float64,
403
+ "false (%)": Float64,
404
+ "null (%)": Float64,
405
+ }
406
+
407
+ def test_series(self) -> None:
408
+ result = boolean_value_counts(self.df["x"], "x")
409
+ check_polars_dataframe(result, height=1, schema_list=self.schema)
410
+
411
+ def test_dataframe(self) -> None:
412
+ result = boolean_value_counts(
413
+ self.df,
414
+ "x",
415
+ "y",
416
+ (col("x") & col("y")).alias("x_and_y"),
417
+ x_or_y=col("x") | col("y"),
418
+ )
419
+ check_polars_dataframe(result, height=4, schema_list=self.schema)
420
+
421
+ def test_empty(self) -> None:
422
+ result = boolean_value_counts(self.df[:0], "x")
423
+ check_polars_dataframe(result, height=1, schema_list=self.schema)
424
+ for column in ["true", "false", "null", "total"]:
425
+ assert (result[column] == 0).all()
426
+ for column in ["true (%)", "false (%)", "null (%)"]:
427
+ assert result[column].is_nan().all()
428
+
429
+ def test_error(self) -> None:
430
+ with raises(
431
+ BooleanValueCountsError, match="Column 'z' must be Boolean; got Int64"
432
+ ):
433
+ _ = boolean_value_counts(self.df, col("x").cast(Int64).alias("z"))
434
+
435
+
345
436
  class TestCeilDateTime:
346
437
  start: ClassVar[dt.datetime] = dt.datetime(2000, 1, 1, 0, 0, tzinfo=UTC)
347
438
  end: ClassVar[dt.datetime] = dt.datetime(2000, 1, 1, 0, 3, tzinfo=UTC)
@@ -634,6 +725,47 @@ class TestCheckPolarsDataFrameSchemaSubset:
634
725
  _check_polars_dataframe_schema_subset(df, schema_inc)
635
726
 
636
727
 
728
+ class TestChoice:
729
+ @given(length=hypothesis.strategies.integers(0, 10))
730
+ def test_int_with_bool(self, *, length: int) -> None:
731
+ elements = [True, False, None]
732
+ series = choice(length, elements, dtype=Boolean)
733
+ self._assert(series, length, elements, dtype=Boolean)
734
+
735
+ @given(length=hypothesis.strategies.integers(0, 10))
736
+ def test_int_with_str(self, *, length: int) -> None:
737
+ elements = ["A", "B", "C"]
738
+ series = choice(length, elements, dtype=String)
739
+ self._assert(series, length, elements, dtype=String)
740
+
741
+ @given(length=hypothesis.strategies.integers(0, 10))
742
+ def test_series(self, *, length: int) -> None:
743
+ orig = int_range(end=length, eager=True)
744
+ elements = ["A", "B", "C"]
745
+ series = choice(orig, elements, dtype=String)
746
+ self._assert(series, length, elements, dtype=String)
747
+
748
+ @given(length=hypothesis.strategies.integers(0, 10))
749
+ def test_dataframe(self, *, length: int) -> None:
750
+ df = int_range(end=length, eager=True).to_frame()
751
+ elements = ["A", "B", "C"]
752
+ series = choice(df, elements, dtype=String)
753
+ self._assert(series, length, elements, dtype=String)
754
+
755
+ def _assert(
756
+ self,
757
+ series: Series,
758
+ length: int,
759
+ elements: Iterable[Any],
760
+ /,
761
+ *,
762
+ dtype: PolarsDataType = Float64,
763
+ ) -> None:
764
+ assert series.dtype == dtype
765
+ assert series.len() == length
766
+ assert series.is_in(list(elements)).all()
767
+
768
+
637
769
  class TestCollectSeries:
638
770
  def test_main(self) -> None:
639
771
  expr = int_range(end=10)
@@ -1185,6 +1317,15 @@ class TestEnsureExprOrSeries:
1185
1317
  assert isinstance(result, Expr | Series)
1186
1318
 
1187
1319
 
1320
+ class TestEnsureExprOrSeriesMany:
1321
+ @given(column=sampled_from(["column", col("column"), int_range(end=10)]))
1322
+ def test_main(self, *, column: IntoExprColumn) -> None:
1323
+ result = ensure_expr_or_series_many(column, column=column)
1324
+ assert len(result) == 2
1325
+ for r in result:
1326
+ assert isinstance(r, Expr | Series)
1327
+
1328
+
1188
1329
  class TestFiniteEWMMean:
1189
1330
  alpha_0_75_values: ClassVar[list[float]] = [
1190
1331
  -8.269850726503885,
@@ -1472,8 +1613,7 @@ class TestIntegers:
1472
1613
  )
1473
1614
  def test_int(self, *, length: int, high: int) -> None:
1474
1615
  series = utilities.polars.integers(length, high)
1475
- assert series.len() == length
1476
- assert series.is_between(0, high, closed="left").all()
1616
+ self._assert(series, length, high)
1477
1617
 
1478
1618
  @given(
1479
1619
  length=hypothesis.strategies.integers(0, 10),
@@ -1482,8 +1622,7 @@ class TestIntegers:
1482
1622
  def test_series(self, *, length: int, high: int) -> None:
1483
1623
  orig = int_range(end=length, eager=True)
1484
1624
  series = utilities.polars.integers(orig, high)
1485
- assert series.len() == length
1486
- assert series.is_between(0, high, closed="left").all()
1625
+ self._assert(series, length, high)
1487
1626
 
1488
1627
  @given(
1489
1628
  length=hypothesis.strategies.integers(0, 10),
@@ -1492,6 +1631,10 @@ class TestIntegers:
1492
1631
  def test_dataframe(self, *, length: int, high: int) -> None:
1493
1632
  df = int_range(end=length, eager=True).to_frame()
1494
1633
  series = utilities.polars.integers(df, high)
1634
+ self._assert(series, length, high)
1635
+
1636
+ def _assert(self, series: Series, length: int, high: int, /) -> None:
1637
+ assert series.dtype == Int64
1495
1638
  assert series.len() == length
1496
1639
  assert series.is_between(0, high, closed="left").all()
1497
1640
 
@@ -1714,20 +1857,22 @@ class TestNormal:
1714
1857
  @given(length=hypothesis.strategies.integers(0, 10))
1715
1858
  def test_int(self, *, length: int) -> None:
1716
1859
  series = normal(length)
1717
- assert series.len() == length
1718
- assert series.is_finite().all()
1860
+ self._assert(series, length)
1719
1861
 
1720
1862
  @given(length=hypothesis.strategies.integers(0, 10))
1721
1863
  def test_series(self, *, length: int) -> None:
1722
1864
  orig = int_range(end=length, eager=True)
1723
1865
  series = normal(orig)
1724
- assert series.len() == length
1725
- assert series.is_finite().all()
1866
+ self._assert(series, length)
1726
1867
 
1727
1868
  @given(length=hypothesis.strategies.integers(0, 10))
1728
1869
  def test_dataframe(self, *, length: int) -> None:
1729
1870
  df = int_range(end=length, eager=True).to_frame()
1730
1871
  series = normal(df)
1872
+ self._assert(series, length)
1873
+
1874
+ def _assert(self, series: Series, length: int, /) -> None:
1875
+ assert series.dtype == Float64
1731
1876
  assert series.len() == length
1732
1877
  assert series.is_finite().all()
1733
1878
 
@@ -1927,6 +2072,7 @@ class TestUniform:
1927
2072
  series = uniform(length, low=low, high=high)
1928
2073
  assert series.len() == length
1929
2074
  assert series.is_between(low, high).all()
2075
+ self._assert(series, length, low, high)
1930
2076
 
1931
2077
  @given(
1932
2078
  length=hypothesis.strategies.integers(0, 10),
@@ -1938,6 +2084,7 @@ class TestUniform:
1938
2084
  series = uniform(orig, low=low, high=high)
1939
2085
  assert series.len() == length
1940
2086
  assert series.is_between(low, high).all()
2087
+ self._assert(series, length, low, high)
1941
2088
 
1942
2089
  @given(
1943
2090
  length=hypothesis.strategies.integers(0, 10),
@@ -1947,6 +2094,10 @@ class TestUniform:
1947
2094
  low, high = bounds
1948
2095
  df = int_range(end=length, eager=True).to_frame()
1949
2096
  series = uniform(df, low=low, high=high)
2097
+ self._assert(series, length, low, high)
2098
+
2099
+ def _assert(self, series: Series, length: int, low: float, high: float, /) -> None:
2100
+ assert series.dtype == Float64
1950
2101
  assert series.len() == length
1951
2102
  assert series.is_between(low, high).all()
1952
2103
 
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.112.9"
3
+ __version__ = "0.112.10"
@@ -1,9 +1,10 @@
1
1
  from __future__ import annotations
2
2
 
3
+ from collections.abc import Sequence
3
4
  from dataclasses import dataclass
4
5
  from functools import partial, reduce
5
6
  from itertools import repeat
6
- from typing import TYPE_CHECKING, Any, overload, override
7
+ from typing import TYPE_CHECKING, Any, SupportsIndex, overload, override
7
8
 
8
9
  import numpy as np
9
10
  from numpy import (
@@ -46,6 +47,9 @@ if TYPE_CHECKING:
46
47
  from utilities.types import MaybeIterable
47
48
 
48
49
 
50
+ type ShapeLike = SupportsIndex | Sequence[SupportsIndex]
51
+
52
+
49
53
  ##
50
54
 
51
55
 
@@ -136,6 +140,19 @@ class AsIntError(Exception): ...
136
140
  ##
137
141
 
138
142
 
143
+ def bernoulli(
144
+ *, true: float = 0.5, seed: int | None = None, size: ShapeLike = ()
145
+ ) -> NDArrayB:
146
+ """Return a set of Bernoulli random variates."""
147
+ from numpy.random import default_rng
148
+
149
+ rng = default_rng(seed=seed)
150
+ return rng.binomial(1, true, size=size).astype(bool)
151
+
152
+
153
+ ##
154
+
155
+
139
156
  def boxcar(
140
157
  array: NDArrayF,
141
158
  /,
@@ -980,11 +997,13 @@ __all__ = [
980
997
  "NDArrayF",
981
998
  "NDArrayI",
982
999
  "NDArrayO",
1000
+ "ShapeLike",
983
1001
  "ShiftError",
984
1002
  "SigmoidError",
985
1003
  "adjust_frequencies",
986
1004
  "array_indexer",
987
1005
  "as_int",
1006
+ "bernoulli",
988
1007
  "boxcar",
989
1008
  "datetime64D",
990
1009
  "datetime64M",