polars-runtime-compat 1.34.0b2__cp39-abi3-macosx_11_0_arm64.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
polars/_utils/slice.py ADDED
@@ -0,0 +1,215 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING, Union
4
+
5
+ import polars._reexport as pl
6
+
7
+ if TYPE_CHECKING:
8
+ from polars import DataFrame, LazyFrame, Series
9
+
10
+ FrameOrSeries = Union["DataFrame", "Series"]
11
+
12
+
13
+ class PolarsSlice:
14
+ """
15
+ Apply Python slice object to Polars DataFrame or Series.
16
+
17
+ Has full support for negative indexing and/or stride.
18
+ """
19
+
20
+ stop: int
21
+ start: int
22
+ stride: int
23
+ slice_length: int
24
+ is_unbounded: bool
25
+ obj: FrameOrSeries
26
+
27
+ def __init__(self, obj: FrameOrSeries) -> None:
28
+ self.obj = obj
29
+
30
+ @staticmethod
31
+ def _as_original(lazy: LazyFrame, original: FrameOrSeries) -> FrameOrSeries:
32
+ """Return lazy variant back to its original type."""
33
+ frame = lazy.collect()
34
+ return frame if isinstance(original, pl.DataFrame) else frame.to_series()
35
+
36
+ @staticmethod
37
+ def _lazify(obj: FrameOrSeries) -> LazyFrame:
38
+ """Make lazy to ensure efficient/consistent handling."""
39
+ return obj.to_frame().lazy() if isinstance(obj, pl.Series) else obj.lazy()
40
+
41
+ def _slice_positive(self, obj: LazyFrame) -> LazyFrame:
42
+ """Logic for slices with positive stride."""
43
+ # note: at this point stride is guaranteed to be > 1
44
+ return obj.slice(self.start, self.slice_length).gather_every(self.stride)
45
+
46
+ def _slice_negative(self, obj: LazyFrame) -> LazyFrame:
47
+ """Logic for slices with negative stride."""
48
+ stride = abs(self.stride)
49
+ lazyslice = obj.slice(self.stop + 1, self.slice_length).reverse()
50
+ return lazyslice.gather_every(stride) if (stride > 1) else lazyslice
51
+
52
+ def _slice_setup(self, s: slice) -> None:
53
+ """Normalise slice bounds, identify unbounded and/or zero-length slices."""
54
+ # can normalise slice indices as we know object size
55
+ obj_len = len(self.obj)
56
+ start, stop, stride = slice(s.start, s.stop, s.step).indices(obj_len)
57
+
58
+ # check if slice is actually unbounded
59
+ if stride >= 1:
60
+ self.is_unbounded = (start <= 0) and (stop >= obj_len)
61
+ else:
62
+ self.is_unbounded = (stop == -1) and (start >= obj_len - 1)
63
+
64
+ # determine slice length
65
+ if self.obj.is_empty():
66
+ self.slice_length = 0
67
+ elif self.is_unbounded:
68
+ self.slice_length = obj_len
69
+ else:
70
+ self.slice_length = (
71
+ 0
72
+ if (
73
+ (start == stop)
74
+ or (stride > 0 and start > stop)
75
+ or (stride < 0 and start < stop)
76
+ )
77
+ else abs(stop - start)
78
+ )
79
+ self.start, self.stop, self.stride = start, stop, stride
80
+
81
+ def apply(self, s: slice) -> FrameOrSeries:
82
+ """Apply a slice operation, taking advantage of any potential fast paths."""
83
+ # normalise slice
84
+ self._slice_setup(s)
85
+
86
+ # check for fast-paths / single-operation calls
87
+ if self.slice_length == 0:
88
+ return self.obj.clear()
89
+
90
+ elif self.is_unbounded and self.stride in (-1, 1):
91
+ return self.obj.reverse() if (self.stride < 0) else self.obj.clone()
92
+
93
+ elif self.start >= 0 and self.stop >= 0 and self.stride == 1:
94
+ return self.obj.slice(self.start, self.slice_length)
95
+
96
+ elif self.stride < 0 and self.slice_length == 1:
97
+ return self.obj.slice(self.stop + 1, 1)
98
+ else:
99
+ # multi-operation calls; make lazy
100
+ lazyobj = self._lazify(self.obj)
101
+ sliced = (
102
+ self._slice_positive(lazyobj)
103
+ if self.stride > 0
104
+ else self._slice_negative(lazyobj)
105
+ )
106
+ return self._as_original(sliced, self.obj)
107
+
108
+
109
+ class LazyPolarsSlice:
110
+ """
111
+ Apply python slice object to Polars LazyFrame.
112
+
113
+ Only slices with efficient computation paths that map directly
114
+ to existing lazy methods are supported.
115
+ """
116
+
117
+ obj: LazyFrame
118
+
119
+ def __init__(self, obj: LazyFrame) -> None:
120
+ self.obj = obj
121
+
122
+ def apply(self, s: slice) -> LazyFrame:
123
+ """
124
+ Apply a slice operation.
125
+
126
+ Note that LazyFrame is designed primarily for efficient computation and does not
127
+ know its own length so, unlike DataFrame, certain slice patterns (such as those
128
+ requiring negative stop/step) may not be supported.
129
+ """
130
+ start = s.start or 0
131
+ step = s.step or 1
132
+
133
+ # fail on operations that require length to do efficiently
134
+ if s.stop and s.stop < 0:
135
+ msg = "negative stop is not supported for lazy slices"
136
+ raise ValueError(msg)
137
+ if step < 0 and (start > 0 or s.stop is not None) and (start != s.stop):
138
+ if not (start > 0 > step and s.stop is None):
139
+ msg = "negative stride is not supported in conjunction with start+stop"
140
+ raise ValueError(msg)
141
+
142
+ # ---------------------------------------
143
+ # empty slice patterns
144
+ # ---------------------------------------
145
+ # [:0]
146
+ # [i:<=i]
147
+ # [i:>=i:-k]
148
+ if (step > 0 and (s.stop is not None and start >= s.stop)) or (
149
+ step < 0
150
+ and (s.start is not None and s.stop is not None and s.stop >= s.start >= 0)
151
+ ):
152
+ return self.obj.clear()
153
+
154
+ # ---------------------------------------
155
+ # straight-through mappings for "reverse"
156
+ # and/or "gather_every"
157
+ # ---------------------------------------
158
+ # [:] => clone()
159
+ # [::k] => gather_every(k),
160
+ # [::-1] => reverse(),
161
+ # [::-k] => reverse().gather_every(abs(k))
162
+ elif s.start is None and s.stop is None:
163
+ if step == 1:
164
+ return self.obj.clone()
165
+ elif step > 1:
166
+ return self.obj.gather_every(step)
167
+ elif step == -1:
168
+ return self.obj.reverse()
169
+ elif step < -1:
170
+ return self.obj.reverse().gather_every(abs(step))
171
+
172
+ # ---------------------------------------
173
+ # straight-through mappings for "head",
174
+ # "reverse" and "gather_every"
175
+ # ---------------------------------------
176
+ # [i::-1] => head(i+1).reverse()
177
+ # [i::k], k<-1 => head(i+1).reverse().gather_every(abs(k))
178
+ elif start >= 0 > step and s.stop is None:
179
+ obj = self.obj.head(s.start + 1).reverse()
180
+ return obj if (abs(step) == 1) else obj.gather_every(abs(step))
181
+
182
+ # ---------------------------------------
183
+ # straight-through mappings for "head"
184
+ # ---------------------------------------
185
+ # [:j] => head(j)
186
+ # [:j:k] => head(j).gather_every(k)
187
+ elif start == 0 and (s.stop or 0) >= 1:
188
+ obj = self.obj.head(s.stop)
189
+ return obj if (step == 1) else obj.gather_every(step)
190
+
191
+ # ---------------------------------------
192
+ # straight-through mappings for "tail"
193
+ # ---------------------------------------
194
+ # [-i:] => tail(abs(i))
195
+ # [-i::k] => tail(abs(i)).gather_every(k)
196
+ elif start < 0 and s.stop is None and step > 0:
197
+ obj = self.obj.tail(abs(start))
198
+ return obj if (step == 1) else obj.gather_every(step)
199
+
200
+ # ---------------------------------------
201
+ # straight-through mappings for "slice"
202
+ # ---------------------------------------
203
+ # [i:] => slice(i)
204
+ # [i:j] => slice(i,j-i)
205
+ # [i:j:k] => slice(i,j-i).gather_every(k)
206
+ elif start > 0 and (s.stop is None or s.stop >= 0):
207
+ slice_length = None if (s.stop is None) else (s.stop - start)
208
+ obj = self.obj.slice(start, slice_length)
209
+ return obj if (step == 1) else obj.gather_every(step)
210
+
211
+ msg = (
212
+ f"the given slice {s!r} is not supported by lazy computation"
213
+ "\n\nConsider a more efficient approach, or construct explicitly with other methods."
214
+ )
215
+ raise ValueError(msg)