polars-runtime-compat 1.34.0b2__cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.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.

Potentially problematic release.


This version of polars-runtime-compat might be problematic. Click here for more details.

Files changed (203) hide show
  1. _polars_runtime_compat/.gitkeep +0 -0
  2. _polars_runtime_compat/_polars_runtime_compat.abi3.so +0 -0
  3. polars/__init__.py +528 -0
  4. polars/_cpu_check.py +265 -0
  5. polars/_dependencies.py +355 -0
  6. polars/_plr.py +99 -0
  7. polars/_plr.pyi +2496 -0
  8. polars/_reexport.py +23 -0
  9. polars/_typing.py +478 -0
  10. polars/_utils/__init__.py +37 -0
  11. polars/_utils/async_.py +102 -0
  12. polars/_utils/cache.py +176 -0
  13. polars/_utils/cloud.py +40 -0
  14. polars/_utils/constants.py +29 -0
  15. polars/_utils/construction/__init__.py +46 -0
  16. polars/_utils/construction/dataframe.py +1397 -0
  17. polars/_utils/construction/other.py +72 -0
  18. polars/_utils/construction/series.py +560 -0
  19. polars/_utils/construction/utils.py +118 -0
  20. polars/_utils/convert.py +224 -0
  21. polars/_utils/deprecation.py +406 -0
  22. polars/_utils/getitem.py +457 -0
  23. polars/_utils/logging.py +11 -0
  24. polars/_utils/nest_asyncio.py +264 -0
  25. polars/_utils/parquet.py +15 -0
  26. polars/_utils/parse/__init__.py +12 -0
  27. polars/_utils/parse/expr.py +242 -0
  28. polars/_utils/polars_version.py +19 -0
  29. polars/_utils/pycapsule.py +53 -0
  30. polars/_utils/scan.py +27 -0
  31. polars/_utils/serde.py +63 -0
  32. polars/_utils/slice.py +215 -0
  33. polars/_utils/udfs.py +1251 -0
  34. polars/_utils/unstable.py +63 -0
  35. polars/_utils/various.py +782 -0
  36. polars/_utils/wrap.py +25 -0
  37. polars/api.py +370 -0
  38. polars/catalog/__init__.py +0 -0
  39. polars/catalog/unity/__init__.py +19 -0
  40. polars/catalog/unity/client.py +733 -0
  41. polars/catalog/unity/models.py +152 -0
  42. polars/config.py +1571 -0
  43. polars/convert/__init__.py +25 -0
  44. polars/convert/general.py +1046 -0
  45. polars/convert/normalize.py +261 -0
  46. polars/dataframe/__init__.py +5 -0
  47. polars/dataframe/_html.py +186 -0
  48. polars/dataframe/frame.py +12582 -0
  49. polars/dataframe/group_by.py +1067 -0
  50. polars/dataframe/plotting.py +257 -0
  51. polars/datatype_expr/__init__.py +5 -0
  52. polars/datatype_expr/array.py +56 -0
  53. polars/datatype_expr/datatype_expr.py +304 -0
  54. polars/datatype_expr/list.py +18 -0
  55. polars/datatype_expr/struct.py +69 -0
  56. polars/datatypes/__init__.py +122 -0
  57. polars/datatypes/_parse.py +195 -0
  58. polars/datatypes/_utils.py +48 -0
  59. polars/datatypes/classes.py +1213 -0
  60. polars/datatypes/constants.py +11 -0
  61. polars/datatypes/constructor.py +172 -0
  62. polars/datatypes/convert.py +366 -0
  63. polars/datatypes/group.py +130 -0
  64. polars/exceptions.py +230 -0
  65. polars/expr/__init__.py +7 -0
  66. polars/expr/array.py +964 -0
  67. polars/expr/binary.py +346 -0
  68. polars/expr/categorical.py +306 -0
  69. polars/expr/datetime.py +2620 -0
  70. polars/expr/expr.py +11272 -0
  71. polars/expr/list.py +1408 -0
  72. polars/expr/meta.py +444 -0
  73. polars/expr/name.py +321 -0
  74. polars/expr/string.py +3045 -0
  75. polars/expr/struct.py +357 -0
  76. polars/expr/whenthen.py +185 -0
  77. polars/functions/__init__.py +193 -0
  78. polars/functions/aggregation/__init__.py +33 -0
  79. polars/functions/aggregation/horizontal.py +298 -0
  80. polars/functions/aggregation/vertical.py +341 -0
  81. polars/functions/as_datatype.py +848 -0
  82. polars/functions/business.py +138 -0
  83. polars/functions/col.py +384 -0
  84. polars/functions/datatype.py +121 -0
  85. polars/functions/eager.py +524 -0
  86. polars/functions/escape_regex.py +29 -0
  87. polars/functions/lazy.py +2751 -0
  88. polars/functions/len.py +68 -0
  89. polars/functions/lit.py +210 -0
  90. polars/functions/random.py +22 -0
  91. polars/functions/range/__init__.py +19 -0
  92. polars/functions/range/_utils.py +15 -0
  93. polars/functions/range/date_range.py +303 -0
  94. polars/functions/range/datetime_range.py +370 -0
  95. polars/functions/range/int_range.py +348 -0
  96. polars/functions/range/linear_space.py +311 -0
  97. polars/functions/range/time_range.py +287 -0
  98. polars/functions/repeat.py +301 -0
  99. polars/functions/whenthen.py +353 -0
  100. polars/interchange/__init__.py +10 -0
  101. polars/interchange/buffer.py +77 -0
  102. polars/interchange/column.py +190 -0
  103. polars/interchange/dataframe.py +230 -0
  104. polars/interchange/from_dataframe.py +328 -0
  105. polars/interchange/protocol.py +303 -0
  106. polars/interchange/utils.py +170 -0
  107. polars/io/__init__.py +64 -0
  108. polars/io/_utils.py +317 -0
  109. polars/io/avro.py +49 -0
  110. polars/io/clipboard.py +36 -0
  111. polars/io/cloud/__init__.py +17 -0
  112. polars/io/cloud/_utils.py +80 -0
  113. polars/io/cloud/credential_provider/__init__.py +17 -0
  114. polars/io/cloud/credential_provider/_builder.py +520 -0
  115. polars/io/cloud/credential_provider/_providers.py +618 -0
  116. polars/io/csv/__init__.py +9 -0
  117. polars/io/csv/_utils.py +38 -0
  118. polars/io/csv/batched_reader.py +142 -0
  119. polars/io/csv/functions.py +1495 -0
  120. polars/io/database/__init__.py +6 -0
  121. polars/io/database/_arrow_registry.py +70 -0
  122. polars/io/database/_cursor_proxies.py +147 -0
  123. polars/io/database/_executor.py +578 -0
  124. polars/io/database/_inference.py +314 -0
  125. polars/io/database/_utils.py +144 -0
  126. polars/io/database/functions.py +516 -0
  127. polars/io/delta.py +499 -0
  128. polars/io/iceberg/__init__.py +3 -0
  129. polars/io/iceberg/_utils.py +697 -0
  130. polars/io/iceberg/dataset.py +556 -0
  131. polars/io/iceberg/functions.py +151 -0
  132. polars/io/ipc/__init__.py +8 -0
  133. polars/io/ipc/functions.py +514 -0
  134. polars/io/json/__init__.py +3 -0
  135. polars/io/json/read.py +101 -0
  136. polars/io/ndjson.py +332 -0
  137. polars/io/parquet/__init__.py +17 -0
  138. polars/io/parquet/field_overwrites.py +140 -0
  139. polars/io/parquet/functions.py +722 -0
  140. polars/io/partition.py +491 -0
  141. polars/io/plugins.py +187 -0
  142. polars/io/pyarrow_dataset/__init__.py +5 -0
  143. polars/io/pyarrow_dataset/anonymous_scan.py +109 -0
  144. polars/io/pyarrow_dataset/functions.py +79 -0
  145. polars/io/scan_options/__init__.py +5 -0
  146. polars/io/scan_options/_options.py +59 -0
  147. polars/io/scan_options/cast_options.py +126 -0
  148. polars/io/spreadsheet/__init__.py +6 -0
  149. polars/io/spreadsheet/_utils.py +52 -0
  150. polars/io/spreadsheet/_write_utils.py +647 -0
  151. polars/io/spreadsheet/functions.py +1323 -0
  152. polars/lazyframe/__init__.py +9 -0
  153. polars/lazyframe/engine_config.py +61 -0
  154. polars/lazyframe/frame.py +8564 -0
  155. polars/lazyframe/group_by.py +669 -0
  156. polars/lazyframe/in_process.py +42 -0
  157. polars/lazyframe/opt_flags.py +333 -0
  158. polars/meta/__init__.py +14 -0
  159. polars/meta/build.py +33 -0
  160. polars/meta/index_type.py +27 -0
  161. polars/meta/thread_pool.py +50 -0
  162. polars/meta/versions.py +120 -0
  163. polars/ml/__init__.py +0 -0
  164. polars/ml/torch.py +213 -0
  165. polars/ml/utilities.py +30 -0
  166. polars/plugins.py +155 -0
  167. polars/py.typed +0 -0
  168. polars/pyproject.toml +96 -0
  169. polars/schema.py +265 -0
  170. polars/selectors.py +3117 -0
  171. polars/series/__init__.py +5 -0
  172. polars/series/array.py +776 -0
  173. polars/series/binary.py +254 -0
  174. polars/series/categorical.py +246 -0
  175. polars/series/datetime.py +2275 -0
  176. polars/series/list.py +1087 -0
  177. polars/series/plotting.py +191 -0
  178. polars/series/series.py +9197 -0
  179. polars/series/string.py +2367 -0
  180. polars/series/struct.py +154 -0
  181. polars/series/utils.py +191 -0
  182. polars/sql/__init__.py +7 -0
  183. polars/sql/context.py +677 -0
  184. polars/sql/functions.py +139 -0
  185. polars/string_cache.py +185 -0
  186. polars/testing/__init__.py +13 -0
  187. polars/testing/asserts/__init__.py +9 -0
  188. polars/testing/asserts/frame.py +231 -0
  189. polars/testing/asserts/series.py +219 -0
  190. polars/testing/asserts/utils.py +12 -0
  191. polars/testing/parametric/__init__.py +33 -0
  192. polars/testing/parametric/profiles.py +107 -0
  193. polars/testing/parametric/strategies/__init__.py +22 -0
  194. polars/testing/parametric/strategies/_utils.py +14 -0
  195. polars/testing/parametric/strategies/core.py +615 -0
  196. polars/testing/parametric/strategies/data.py +452 -0
  197. polars/testing/parametric/strategies/dtype.py +436 -0
  198. polars/testing/parametric/strategies/legacy.py +169 -0
  199. polars/type_aliases.py +24 -0
  200. polars_runtime_compat-1.34.0b2.dist-info/METADATA +190 -0
  201. polars_runtime_compat-1.34.0b2.dist-info/RECORD +203 -0
  202. polars_runtime_compat-1.34.0b2.dist-info/WHEEL +4 -0
  203. polars_runtime_compat-1.34.0b2.dist-info/licenses/LICENSE +20 -0
@@ -0,0 +1,154 @@
1
+ from __future__ import annotations
2
+
3
+ import sys
4
+ from typing import TYPE_CHECKING
5
+
6
+ from polars._utils.various import (
7
+ BUILDING_SPHINX_DOCS,
8
+ qualified_type_name,
9
+ sphinx_accessor,
10
+ )
11
+ from polars._utils.wrap import wrap_df
12
+ from polars.schema import Schema
13
+ from polars.series.utils import expr_dispatch
14
+
15
+ if TYPE_CHECKING:
16
+ from collections.abc import Sequence
17
+
18
+ from polars import DataFrame, Series
19
+ from polars._plr import PySeries
20
+ elif BUILDING_SPHINX_DOCS:
21
+ # note: we assign this way to work around an autocomplete issue in ipython/jedi
22
+ # (ref: https://github.com/davidhalter/jedi/issues/2057)
23
+ current_module = sys.modules[__name__]
24
+ current_module.property = sphinx_accessor
25
+
26
+
27
+ @expr_dispatch
28
+ class StructNameSpace:
29
+ """Series.struct namespace."""
30
+
31
+ _accessor = "struct"
32
+
33
+ def __init__(self, series: Series) -> None:
34
+ self._s: PySeries = series._s
35
+
36
+ def __getitem__(self, item: int | str) -> Series:
37
+ if isinstance(item, int):
38
+ return self.field(self.fields[item])
39
+ elif isinstance(item, str):
40
+ return self.field(item)
41
+ else:
42
+ msg = f"expected type 'int | str', got {qualified_type_name(item)!r}"
43
+ raise TypeError(msg)
44
+
45
+ def _ipython_key_completions_(self) -> list[str]:
46
+ return self.fields
47
+
48
+ @property
49
+ def fields(self) -> list[str]:
50
+ """
51
+ Get the names of the fields.
52
+
53
+ Examples
54
+ --------
55
+ >>> s = pl.Series([{"a": 1, "b": 2}, {"a": 3, "b": 4}])
56
+ >>> s.struct.fields
57
+ ['a', 'b']
58
+ """
59
+ if getattr(self, "_s", None) is None:
60
+ return []
61
+ return self._s.struct_fields()
62
+
63
+ def field(self, name: str) -> Series:
64
+ """
65
+ Retrieve one of the fields of this `Struct` as a new Series.
66
+
67
+ Parameters
68
+ ----------
69
+ name
70
+ Name of the field.
71
+
72
+ Examples
73
+ --------
74
+ >>> s = pl.Series([{"a": 1, "b": 2}, {"a": 3, "b": 4}])
75
+ >>> s.struct.field("a")
76
+ shape: (2,)
77
+ Series: 'a' [i64]
78
+ [
79
+ 1
80
+ 3
81
+ ]
82
+ """
83
+
84
+ def rename_fields(self, names: Sequence[str]) -> Series:
85
+ """
86
+ Rename the fields of the struct.
87
+
88
+ Parameters
89
+ ----------
90
+ names
91
+ New names in the order of the struct's fields.
92
+
93
+ Examples
94
+ --------
95
+ >>> s = pl.Series([{"a": 1, "b": 2}, {"a": 3, "b": 4}])
96
+ >>> s.struct.fields
97
+ ['a', 'b']
98
+ >>> s = s.struct.rename_fields(["c", "d"])
99
+ >>> s.struct.fields
100
+ ['c', 'd']
101
+ """
102
+
103
+ @property
104
+ def schema(self) -> Schema:
105
+ """
106
+ Get the struct definition as a name/dtype schema dict.
107
+
108
+ Examples
109
+ --------
110
+ >>> s = pl.Series([{"a": 1, "b": 2}, {"a": 3, "b": 4}])
111
+ >>> s.struct.schema
112
+ Schema({'a': Int64, 'b': Int64})
113
+ """
114
+ if getattr(self, "_s", None) is None:
115
+ return Schema({})
116
+
117
+ schema = self._s.dtype().to_schema()
118
+ return Schema(schema, check_dtypes=False)
119
+
120
+ def unnest(self) -> DataFrame:
121
+ """
122
+ Convert this struct Series to a DataFrame with a separate column for each field.
123
+
124
+ Examples
125
+ --------
126
+ >>> s = pl.Series([{"a": 1, "b": 2}, {"a": 3, "b": 4}])
127
+ >>> s.struct.unnest()
128
+ shape: (2, 2)
129
+ ┌─────┬─────┐
130
+ │ a ┆ b │
131
+ │ --- ┆ --- │
132
+ │ i64 ┆ i64 │
133
+ ╞═════╪═════╡
134
+ │ 1 ┆ 2 │
135
+ │ 3 ┆ 4 │
136
+ └─────┴─────┘
137
+ """
138
+ return wrap_df(self._s.struct_unnest())
139
+
140
+ def json_encode(self) -> Series:
141
+ """
142
+ Convert this struct to a string column with json values.
143
+
144
+ Examples
145
+ --------
146
+ >>> s = pl.Series("a", [{"a": [1, 2], "b": [45]}, {"a": [9, 1, 3], "b": None}])
147
+ >>> s.struct.json_encode()
148
+ shape: (2,)
149
+ Series: 'a' [str]
150
+ [
151
+ "{"a":[1,2],"b":[45]}"
152
+ "{"a":[9,1,3],"b":null}"
153
+ ]
154
+ """
polars/series/utils.py ADDED
@@ -0,0 +1,191 @@
1
+ from __future__ import annotations
2
+
3
+ import inspect
4
+ import sys
5
+ from functools import wraps
6
+ from typing import TYPE_CHECKING, Any, Callable, TypeVar
7
+
8
+ import polars._reexport as pl
9
+ from polars import functions as F
10
+ from polars._utils.wrap import wrap_s
11
+ from polars.datatypes import dtype_to_ffiname
12
+
13
+ if TYPE_CHECKING:
14
+ from polars import Series
15
+ from polars._plr import PySeries
16
+ from polars._typing import PolarsDataType
17
+
18
+ if sys.version_info >= (3, 10):
19
+ from typing import ParamSpec
20
+ else:
21
+ from typing_extensions import ParamSpec
22
+
23
+ T = TypeVar("T")
24
+ P = ParamSpec("P")
25
+ SeriesMethod = Callable[..., Series]
26
+
27
+
28
+ def expr_dispatch(cls: type[T]) -> type[T]:
29
+ """
30
+ Series/NameSpace class decorator that sets up expression dispatch.
31
+
32
+ * Applied to the Series class, and/or any Series 'NameSpace' classes.
33
+ * Walks the class attributes, looking for methods that have empty function
34
+ bodies, with signatures compatible with an existing Expr function.
35
+ * IFF both conditions are met, the empty method is decorated with @call_expr.
36
+ """
37
+ # create lookup of expression functions in this namespace
38
+ namespace = getattr(cls, "_accessor", None)
39
+ expr_lookup = _expr_lookup(namespace)
40
+
41
+ for name in dir(cls):
42
+ if (
43
+ # private
44
+ not name.startswith("_")
45
+ # Avoid error when building docs
46
+ # https://github.com/pola-rs/polars/pull/13238#discussion_r1438787093
47
+ # TODO: is there a better way to do this?
48
+ and name != "plot"
49
+ ):
50
+ attr = getattr(cls, name)
51
+ if callable(attr):
52
+ attr = _undecorated(attr)
53
+ # note: `co_varnames` starts with the function args, but needs to be
54
+ # constrained by `co_argcount` as it also includes function-level consts
55
+ args = attr.__code__.co_varnames[: attr.__code__.co_argcount]
56
+ # if an expression method with compatible method exists, further check
57
+ # that the series implementation has an empty function body
58
+ if (namespace, name, args) in expr_lookup and _is_empty_method(attr):
59
+ setattr(cls, name, call_expr(attr))
60
+ return cls
61
+
62
+
63
+ def _expr_lookup(namespace: str | None) -> set[tuple[str | None, str, tuple[str, ...]]]:
64
+ """Create lookup of potential Expr methods (in the given namespace)."""
65
+ # dummy Expr object that we can introspect
66
+ expr = pl.Expr()
67
+ expr._pyexpr = None # type: ignore[assignment]
68
+
69
+ # optional indirection to "expr.str", "expr.dt", etc
70
+ if namespace is not None:
71
+ expr = getattr(expr, namespace)
72
+
73
+ lookup = set()
74
+ for name in dir(expr):
75
+ if not name.startswith("_"):
76
+ try:
77
+ m = getattr(expr, name)
78
+ except AttributeError: # may raise for @property methods
79
+ continue
80
+ if callable(m):
81
+ # add function signature (argument names only) to the lookup
82
+ # as a _possible_ candidate for expression-dispatch
83
+ m = _undecorated(m)
84
+ args = m.__code__.co_varnames[: m.__code__.co_argcount]
85
+ lookup.add((namespace, name, args))
86
+ return lookup
87
+
88
+
89
+ def _undecorated(function: Callable[P, T]) -> Callable[P, T]:
90
+ """Return the given function without any decorators."""
91
+ while hasattr(function, "__wrapped__"):
92
+ function = function.__wrapped__
93
+ return function
94
+
95
+
96
+ def call_expr(func: SeriesMethod) -> SeriesMethod:
97
+ """Dispatch Series method to an expression implementation."""
98
+
99
+ @wraps(func)
100
+ def wrapper(self: Any, *args: P.args, **kwargs: P.kwargs) -> Series:
101
+ s = wrap_s(self._s)
102
+ expr = F.col(s.name)
103
+ if (namespace := getattr(self, "_accessor", None)) is not None:
104
+ expr = getattr(expr, namespace)
105
+ f = getattr(expr, func.__name__)
106
+ return s.to_frame().select_seq(f(*args, **kwargs)).to_series()
107
+
108
+ # note: applying explicit '__signature__' helps IDEs (especially PyCharm)
109
+ # with proper autocomplete, in addition to what @functools.wraps does
110
+ setattr(wrapper, "__signature__", inspect.signature(func)) # noqa: B010
111
+ return wrapper
112
+
113
+
114
+ def _is_empty_method(func: SeriesMethod) -> bool:
115
+ """
116
+ Confirm that the given function has no implementation.
117
+
118
+ Definitions of empty:
119
+
120
+ - only has a docstring (body is empty)
121
+ - has no docstring and just contains 'pass' (or equivalent)
122
+ """
123
+ fc = func.__code__
124
+ return (fc.co_code in _EMPTY_BYTECODE) and (
125
+ (len(fc.co_consts) == 2 and fc.co_consts[1] is None)
126
+ # account for optimized-out docstrings (eg: running 'python -OO')
127
+ or (sys.flags.optimize == 2 and fc.co_consts == (None,))
128
+ )
129
+
130
+
131
+ class _EmptyBytecodeHelper:
132
+ def __init__(self) -> None:
133
+ # generate bytecode for empty functions with/without a docstring
134
+ def _empty_with_docstring() -> None:
135
+ """""" # noqa: D419
136
+
137
+ def _empty_without_docstring() -> None:
138
+ pass
139
+
140
+ self.empty_bytecode = (
141
+ _empty_with_docstring.__code__.co_code,
142
+ _empty_without_docstring.__code__.co_code,
143
+ )
144
+
145
+ def __contains__(self, item: bytes) -> bool:
146
+ return item in self.empty_bytecode
147
+
148
+
149
+ _EMPTY_BYTECODE = _EmptyBytecodeHelper()
150
+
151
+
152
+ def get_ffi_func(
153
+ name: str, dtype: PolarsDataType, obj: PySeries
154
+ ) -> Callable[..., Any] | None:
155
+ """
156
+ Dynamically obtain the proper FFI function/ method.
157
+
158
+ Parameters
159
+ ----------
160
+ name
161
+ function or method name where dtype is replaced by <>
162
+ for example
163
+ "call_foo_<>"
164
+ dtype
165
+ polars dtype.
166
+ obj
167
+ Object to find the method for.
168
+
169
+ Returns
170
+ -------
171
+ callable or None
172
+ FFI function, or None if not found.
173
+ """
174
+ ffi_name = dtype_to_ffiname(dtype)
175
+ fname = name.replace("<>", ffi_name)
176
+ return getattr(obj, fname, None)
177
+
178
+
179
+ def _with_no_check_length(func: Callable[..., Any]) -> Any:
180
+ from polars._plr import check_length
181
+
182
+ # Catch any error so that we can be sure that we always restore length checks
183
+ try:
184
+ check_length(False)
185
+ result = func()
186
+ check_length(True)
187
+ except Exception:
188
+ check_length(True)
189
+ raise
190
+ else:
191
+ return result
polars/sql/__init__.py ADDED
@@ -0,0 +1,7 @@
1
+ from polars.sql.context import SQLContext
2
+ from polars.sql.functions import sql
3
+
4
+ __all__ = [
5
+ "SQLContext",
6
+ "sql",
7
+ ]