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.
- {dycw_utilities-0.112.9.dist-info → dycw_utilities-0.112.10.dist-info}/METADATA +12 -12
- {dycw_utilities-0.112.9.dist-info → dycw_utilities-0.112.10.dist-info}/RECORD +7 -7
- utilities/__init__.py +1 -1
- utilities/numpy.py +20 -1
- utilities/polars.py +165 -1
- {dycw_utilities-0.112.9.dist-info → dycw_utilities-0.112.10.dist-info}/WHEEL +0 -0
- {dycw_utilities-0.112.9.dist-info → dycw_utilities-0.112.10.dist-info}/licenses/LICENSE +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: dycw-utilities
|
3
|
-
Version: 0.112.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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=
|
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=
|
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=
|
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.
|
91
|
-
dycw_utilities-0.112.
|
92
|
-
dycw_utilities-0.112.
|
93
|
-
dycw_utilities-0.112.
|
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
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:
|
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",
|
File without changes
|
File without changes
|