dycw-utilities 0.112.9__py3-none-any.whl → 0.112.10__py3-none-any.whl

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.
@@ -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'
@@ -1,4 +1,4 @@
1
- utilities/__init__.py,sha256=4oIYPUfPGTr8vXSSPtcMMTgcanNRfFAjAkM3ufwN-Mg,60
1
+ utilities/__init__.py,sha256=mALrkpjRtE0nW8tAmwclFaEZyShTCa75IjKVwftuFOc,61
2
2
  utilities/altair.py,sha256=Gpja-flOo-Db0PIPJLJsgzAlXWoKUjPU1qY-DQ829ek,9156
3
3
  utilities/astor.py,sha256=xuDUkjq0-b6fhtwjhbnebzbqQZAjMSHR1IIS5uOodVg,777
4
4
  utilities/asyncio.py,sha256=41oQUurWMvadFK5gFnaG21hMM0Vmfn2WS6OpC0R9mas,14757
@@ -36,7 +36,7 @@ utilities/math.py,sha256=TexfvLCI12d9Sw5_W4pKVBZ3nRr3zk2iPkcEU7xdEWU,26771
36
36
  utilities/memory_profiler.py,sha256=tf2C51P2lCujPGvRt2Rfc7VEw5LDXmVPCG3z_AvBmbU,962
37
37
  utilities/modules.py,sha256=iuvLluJya-hvl1Q25-Jk3dLgx2Es3ck4SjJiEkAlVTs,3195
38
38
  utilities/more_itertools.py,sha256=CPUxrMAcTwRxbzbhiqPKi3Xx9hxqI0t6gkWjutaibGk,5534
39
- utilities/numpy.py,sha256=cBgCBet8YfZP_rb4nkCJHZx9_03qPEinVENMk1dGVYQ,25683
39
+ utilities/numpy.py,sha256=Xn23sA2ZbVNqwUYEgNJD3XBYH6IbCri_WkHSNhg3NkY,26122
40
40
  utilities/operator.py,sha256=0M2yZJ0PODH47ogFEnkGMBe_cfxwZR02T_92LZVZvHo,3715
41
41
  utilities/optuna.py,sha256=loyJGWTzljgdJaoLhP09PT8Jz6o_pwBOwehY33lHkhw,1923
42
42
  utilities/orjson.py,sha256=DBm2zPP04kcHpY3l1etL24ksNynu-R3duFyx3U-RjqQ,36948
@@ -46,7 +46,7 @@ utilities/pathlib.py,sha256=31WPMXdLIyXgYOMMl_HOI2wlo66MGSE-cgeelk-Lias,1410
46
46
  utilities/period.py,sha256=RWfcNVoNlW07RNdU47g_zuLZMKbtgfK4bE6G-9tVjY8,11024
47
47
  utilities/pickle.py,sha256=Bhvd7cZl-zQKQDFjUerqGuSKlHvnW1K2QXeU5UZibtg,657
48
48
  utilities/platform.py,sha256=NU7ycTvAXAG-fdYmDXaM1m4EOml2cGiaYwaUzfzSqyU,1767
49
- utilities/polars.py,sha256=q8a2hTX9tyPxtxUarIm2BxlnckIwF1RCpcJz03OoIoY,58458
49
+ utilities/polars.py,sha256=ZdhGu9qMlgbwfdYYDEV3Pk3kfJr1V5FSolfCWHI3Nxc,63283
50
50
  utilities/polars_ols.py,sha256=efhXf0gjrHUpQrvS6a7g8yJQJWf_ATKtJnqqF2inCOU,5680
51
51
  utilities/pqdm.py,sha256=foRytQybmOQ05pjt5LF7ANyzrIa--4ScDE3T2wd31a4,3118
52
52
  utilities/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -87,7 +87,7 @@ utilities/warnings.py,sha256=un1LvHv70PU-LLv8RxPVmugTzDJkkGXRMZTE2-fTQHw,1771
87
87
  utilities/whenever.py,sha256=iLRP_-8CZtBpHKbGZGu-kjSMg1ZubJ-VSmgSy7Eudxw,17787
88
88
  utilities/zipfile.py,sha256=24lQc9ATcJxHXBPc_tBDiJk48pWyRrlxO2fIsFxU0A8,699
89
89
  utilities/zoneinfo.py,sha256=-Xm57PMMwDTYpxJdkiJG13wnbwK--I7XItBh5WVhD-o,1874
90
- dycw_utilities-0.112.9.dist-info/METADATA,sha256=w5dmojTlh4MG3_sA2rTFFQLP-BclPCLPCQ98Rf4RF-o,13004
91
- dycw_utilities-0.112.9.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
92
- dycw_utilities-0.112.9.dist-info/licenses/LICENSE,sha256=gppZp16M6nSVpBbUBrNL6JuYfvKwZiKgV7XoKKsHzqo,1066
93
- dycw_utilities-0.112.9.dist-info/RECORD,,
90
+ dycw_utilities-0.112.10.dist-info/METADATA,sha256=HXZIn_uHvb-xc5-RuCEn_T8pPkJ58gnElO7ootr182o,13005
91
+ dycw_utilities-0.112.10.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
92
+ dycw_utilities-0.112.10.dist-info/licenses/LICENSE,sha256=gppZp16M6nSVpBbUBrNL6JuYfvKwZiKgV7XoKKsHzqo,1066
93
+ dycw_utilities-0.112.10.dist-info/RECORD,,
utilities/__init__.py CHANGED
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.112.9"
3
+ __version__ = "0.112.10"
utilities/numpy.py CHANGED
@@ -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",
utilities/polars.py CHANGED
@@ -39,17 +39,20 @@ from polars import (
39
39
  Series,
40
40
  String,
41
41
  Struct,
42
+ UInt32,
42
43
  all_horizontal,
43
44
  col,
44
45
  concat,
45
46
  int_range,
46
47
  lit,
47
48
  struct,
49
+ sum_horizontal,
48
50
  when,
49
51
  )
50
52
  from polars.datatypes import DataType, DataTypeClass
51
53
  from polars.exceptions import (
52
54
  ColumnNotFoundError,
55
+ NoRowsReturnedError,
53
56
  OutOfBoundsError,
54
57
  PolarsInefficientMapWarning,
55
58
  )
@@ -337,6 +340,102 @@ def are_frames_equal(
337
340
  ##
338
341
 
339
342
 
343
+ def bernoulli(
344
+ obj: int | Series | DataFrame,
345
+ /,
346
+ *,
347
+ true: float = 0.5,
348
+ seed: int | None = None,
349
+ name: str | None = None,
350
+ ) -> Series:
351
+ """Construct a series of Bernoulli-random variables."""
352
+ match obj:
353
+ case int() as height:
354
+ import utilities.numpy
355
+
356
+ values = utilities.numpy.bernoulli(true=true, seed=seed, size=height)
357
+ return Series(name=name, values=values)
358
+ case Series() as series:
359
+ return bernoulli(series.len(), true=true, seed=seed, name=name)
360
+ case DataFrame() as df:
361
+ return bernoulli(df.height, true=true, seed=seed, name=name)
362
+ case _ as never:
363
+ assert_never(never)
364
+
365
+
366
+ ##
367
+
368
+
369
+ def boolean_value_counts(
370
+ obj: Series | DataFrame, /, *exprs: IntoExprColumn, **named_exprs: IntoExprColumn
371
+ ) -> DataFrame:
372
+ """Conduct a set of boolean value counts."""
373
+ match obj:
374
+ case Series() as series:
375
+ return boolean_value_counts(series.to_frame(), *exprs, **named_exprs)
376
+ case DataFrame() as df:
377
+ all_exprs = ensure_expr_or_series_many(*exprs, **named_exprs)
378
+ rows = [_boolean_value_counts_one(df, expr) for expr in all_exprs]
379
+ true, false, null = [col(c) for c in ["true", "false", "null"]]
380
+ total = sum_horizontal(true, false, null).alias("total")
381
+ return DataFrame(
382
+ rows,
383
+ schema={
384
+ "name": String,
385
+ "true": UInt32,
386
+ "false": UInt32,
387
+ "null": UInt32,
388
+ },
389
+ orient="row",
390
+ ).with_columns(
391
+ total,
392
+ (true / total).alias("true (%)"),
393
+ (false / total).alias("false (%)"),
394
+ (null / total).alias("null (%)"),
395
+ )
396
+ case _ as never:
397
+ assert_never(never)
398
+
399
+
400
+ def _boolean_value_counts_one(
401
+ df: DataFrame, expr: IntoExprColumn, /
402
+ ) -> Mapping[str, Any]:
403
+ name = get_expr_name(df, expr)
404
+ sr = df.select(expr)[name]
405
+ if not isinstance(sr.dtype, Boolean):
406
+ raise BooleanValueCountsError(name=name, dtype=sr.dtype)
407
+ counts = sr.value_counts()
408
+ truth = col(name)
409
+ try:
410
+ true = counts.row(by_predicate=truth.is_not_null() & truth, named=True)["count"]
411
+ except NoRowsReturnedError:
412
+ true = 0
413
+ try:
414
+ false = counts.row(by_predicate=(truth.is_not_null() & ~truth), named=True)[
415
+ "count"
416
+ ]
417
+ except NoRowsReturnedError:
418
+ false = 0
419
+ try:
420
+ null = counts.row(by_predicate=truth.is_null(), named=True)["count"]
421
+ except NoRowsReturnedError:
422
+ null = 0
423
+ return {"name": name, "true": true, "false": false, "null": null}
424
+
425
+
426
+ @dataclass(kw_only=True, slots=True)
427
+ class BooleanValueCountsError(Exception):
428
+ name: str
429
+ dtype: DataType
430
+
431
+ @override
432
+ def __str__(self) -> str:
433
+ return f"Column {self.name!r} must be Boolean; got {self.dtype!r}"
434
+
435
+
436
+ ##
437
+
438
+
340
439
  @overload
341
440
  def ceil_datetime(column: ExprLike, every: ExprLike, /) -> Expr: ...
342
441
  @overload
@@ -637,6 +736,54 @@ class _CheckPolarsDataFrameWidthError(CheckPolarsDataFrameError):
637
736
  ##
638
737
 
639
738
 
739
+ def choice(
740
+ obj: int | Series | DataFrame,
741
+ elements: Iterable[Any],
742
+ /,
743
+ *,
744
+ replace: bool = True,
745
+ p: Iterable[float] | None = None,
746
+ seed: int | None = None,
747
+ name: str | None = None,
748
+ dtype: PolarsDataType = Float64,
749
+ ) -> Series:
750
+ """Construct a series of random samples."""
751
+ match obj:
752
+ case int() as height:
753
+ from numpy.random import default_rng
754
+
755
+ rng = default_rng(seed=seed)
756
+ elements = list(elements)
757
+ p = None if p is None else list(p)
758
+ values = rng.choice(elements, size=height, replace=replace, p=p)
759
+ return Series(name=name, values=values.tolist(), dtype=dtype)
760
+ case Series() as series:
761
+ return choice(
762
+ series.len(),
763
+ elements,
764
+ replace=replace,
765
+ p=p,
766
+ seed=seed,
767
+ name=name,
768
+ dtype=dtype,
769
+ )
770
+ case DataFrame() as df:
771
+ return choice(
772
+ df.height,
773
+ elements,
774
+ replace=replace,
775
+ p=p,
776
+ seed=seed,
777
+ name=name,
778
+ dtype=dtype,
779
+ )
780
+ case _ as never:
781
+ assert_never(never)
782
+
783
+
784
+ ##
785
+
786
+
640
787
  def collect_series(expr: Expr, /) -> Series:
641
788
  """Collect a column expression into a Series."""
642
789
  data = DataFrame().with_columns(expr)
@@ -1053,6 +1200,18 @@ def ensure_expr_or_series(column: IntoExprColumn, /) -> Expr | Series:
1053
1200
  ##
1054
1201
 
1055
1202
 
1203
+ def ensure_expr_or_series_many(
1204
+ *columns: IntoExprColumn, **named_columns: IntoExprColumn
1205
+ ) -> Sequence[Expr | Series]:
1206
+ """Ensure a set of column expressions and/or Series are returned."""
1207
+ args = map(ensure_expr_or_series, columns)
1208
+ kwargs = (ensure_expr_or_series(v).alias(k) for k, v in named_columns.items())
1209
+ return list(chain(args, kwargs))
1210
+
1211
+
1212
+ ##
1213
+
1214
+
1056
1215
  @overload
1057
1216
  def finite_ewm_mean(
1058
1217
  column: ExprLike,
@@ -1227,7 +1386,7 @@ class _GetDataTypeOrSeriesTimeZoneNotZonedError(GetDataTypeOrSeriesTimeZoneError
1227
1386
  ##
1228
1387
 
1229
1388
 
1230
- def get_expr_name(obj: Series | DataFrame, expr: Expr, /) -> str:
1389
+ def get_expr_name(obj: Series | DataFrame, expr: IntoExprColumn, /) -> str:
1231
1390
  """Get the name of an expression."""
1232
1391
  match obj:
1233
1392
  case Series() as series:
@@ -1948,6 +2107,7 @@ def zoned_datetime(
1948
2107
 
1949
2108
 
1950
2109
  __all__ = [
2110
+ "BooleanValueCountsError",
1951
2111
  "CheckPolarsDataFrameError",
1952
2112
  "ColumnsToDictError",
1953
2113
  "DataClassToDataFrameError",
@@ -1971,8 +2131,11 @@ __all__ = [
1971
2131
  "adjust_frequencies",
1972
2132
  "append_dataclass",
1973
2133
  "are_frames_equal",
2134
+ "bernoulli",
2135
+ "boolean_value_counts",
1974
2136
  "ceil_datetime",
1975
2137
  "check_polars_dataframe",
2138
+ "choice",
1976
2139
  "collect_series",
1977
2140
  "columns_to_dict",
1978
2141
  "concat_series",
@@ -1983,6 +2146,7 @@ __all__ = [
1983
2146
  "drop_null_struct_series",
1984
2147
  "ensure_data_type",
1985
2148
  "ensure_expr_or_series",
2149
+ "ensure_expr_or_series_many",
1986
2150
  "finite_ewm_mean",
1987
2151
  "floor_datetime",
1988
2152
  "get_data_type_or_series_time_zone",