polars-runtime-compat 1.34.0b2__cp39-abi3-win_amd64.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.pyd +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,139 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING, Literal, overload
4
+
5
+ if TYPE_CHECKING:
6
+ from polars.dataframe import DataFrame
7
+ from polars.lazyframe import LazyFrame
8
+
9
+
10
+ __all__ = ["sql"]
11
+
12
+
13
+ @overload
14
+ def sql(query: str, *, eager: Literal[False] = False) -> LazyFrame: ...
15
+
16
+
17
+ @overload
18
+ def sql(query: str, *, eager: Literal[True]) -> DataFrame: ...
19
+
20
+
21
+ def sql(query: str, *, eager: bool = False) -> DataFrame | LazyFrame:
22
+ """
23
+ Execute a SQL query against frames in the global namespace.
24
+
25
+ .. versionadded:: 0.20.31
26
+
27
+ Parameters
28
+ ----------
29
+ query
30
+ SQL query to execute.
31
+ eager
32
+ Automatically collect the result and return a DataFrame instead of a LazyFrame.
33
+
34
+ Notes
35
+ -----
36
+ * The Polars SQL engine can operate against Polars DataFrame, LazyFrame, and Series
37
+ objects, as well as Pandas DataFrame and Series, PyArrow Table and RecordBatch.
38
+ * Additional control over registration and execution behaviour is available
39
+ with the :class:`SQLContext` object.
40
+
41
+ See Also
42
+ --------
43
+ SQLContext
44
+
45
+ Examples
46
+ --------
47
+ >>> lf1 = pl.LazyFrame({"a": [1, 2, 3], "b": [6, 7, 8], "c": ["z", "y", "x"]})
48
+ >>> lf2 = pl.LazyFrame({"a": [3, 2, 1], "d": [125, -654, 888]})
49
+
50
+ Query the LazyFrame using SQL:
51
+
52
+ >>> lf1.sql("SELECT c, b FROM self WHERE a > 1").collect()
53
+ shape: (2, 2)
54
+ ┌─────┬─────┐
55
+ │ c ┆ b │
56
+ │ --- ┆ --- │
57
+ │ str ┆ i64 │
58
+ ╞═════╪═════╡
59
+ │ y ┆ 7 │
60
+ │ x ┆ 8 │
61
+ └─────┴─────┘
62
+
63
+ Join two LazyFrames:
64
+
65
+ >>> pl.sql(
66
+ ... '''
67
+ ... SELECT lf1.*, d
68
+ ... FROM lf1
69
+ ... INNER JOIN lf2 USING (a)
70
+ ... WHERE a > 1 AND b < 8
71
+ ... '''
72
+ ... ).collect()
73
+ shape: (1, 4)
74
+ ┌─────┬─────┬─────┬──────┐
75
+ │ a ┆ b ┆ c ┆ d │
76
+ │ --- ┆ --- ┆ --- ┆ --- │
77
+ │ i64 ┆ i64 ┆ str ┆ i64 │
78
+ ╞═════╪═════╪═════╪══════╡
79
+ │ 2 ┆ 7 ┆ y ┆ -654 │
80
+ └─────┴─────┴─────┴──────┘
81
+
82
+ Apply SQL transforms and subsequently filter natively (you can freely mix SQL and
83
+ native operations):
84
+
85
+ >>> pl.sql(
86
+ ... query='''
87
+ ... SELECT
88
+ ... a,
89
+ ... (a % 2 == 0) AS a_is_even,
90
+ ... (b::float4 / 2) AS "b/2",
91
+ ... CONCAT_WS(':', c, c, c) AS c_c_c
92
+ ... FROM lf1
93
+ ... ORDER BY a
94
+ ... ''',
95
+ ... ).filter(~pl.col("c_c_c").str.starts_with("x")).collect()
96
+ shape: (2, 4)
97
+ ┌─────┬───────────┬─────┬───────┐
98
+ │ a ┆ a_is_even ┆ b/2 ┆ c_c_c │
99
+ │ --- ┆ --- ┆ --- ┆ --- │
100
+ │ i64 ┆ bool ┆ f32 ┆ str │
101
+ ╞═════╪═══════════╪═════╪═══════╡
102
+ │ 1 ┆ false ┆ 3.0 ┆ z:z:z │
103
+ │ 2 ┆ true ┆ 3.5 ┆ y:y:y │
104
+ └─────┴───────────┴─────┴───────┘
105
+
106
+ Join polars LazyFrame with a pandas DataFrame and a pyarrow Table:
107
+
108
+ >>> import pandas as pd
109
+ >>> import pyarrow as pa
110
+ >>> pl_frame = lf1
111
+ >>> pd_frame = pd.DataFrame({"a": [2, 3, 4], "d": [-0.5, 0.0, 0.5]})
112
+ >>> pa_table = pa.Table.from_arrays(
113
+ ... [pa.array([1, 2, 3]), pa.array(["x", "y", "z"])],
114
+ ... names=["a", "e"],
115
+ ... )
116
+ >>> pl.sql(
117
+ ... query='''
118
+ ... SELECT pl_frame.*, d, e
119
+ ... FROM pl_frame
120
+ ... JOIN pd_frame USING(a)
121
+ ... JOIN pa_table USING(a)
122
+ ... ''',
123
+ ... ).collect()
124
+ shape: (2, 5)
125
+ ┌─────┬─────┬─────┬──────┬─────┐
126
+ │ a ┆ b ┆ c ┆ d ┆ e │
127
+ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │
128
+ │ i64 ┆ i64 ┆ str ┆ f64 ┆ str │
129
+ ╞═════╪═════╪═════╪══════╪═════╡
130
+ │ 2 ┆ 7 ┆ y ┆ -0.5 ┆ y │
131
+ │ 3 ┆ 8 ┆ x ┆ 0.0 ┆ z │
132
+ └─────┴─────┴─────┴──────┴─────┘
133
+ """
134
+ from polars.sql import SQLContext
135
+
136
+ return SQLContext.execute_global(
137
+ query=query,
138
+ eager=eager,
139
+ )
polars/string_cache.py ADDED
@@ -0,0 +1,185 @@
1
+ from __future__ import annotations
2
+
3
+ import contextlib
4
+ from typing import TYPE_CHECKING
5
+
6
+ with contextlib.suppress(ImportError): # Module not available when building docs
7
+ import polars._plr as plr
8
+ from polars._plr import PyStringCacheHolder
9
+
10
+ if TYPE_CHECKING:
11
+ import sys
12
+ from types import TracebackType
13
+
14
+ if sys.version_info >= (3, 11):
15
+ from typing import Self
16
+ else:
17
+ from typing_extensions import Self
18
+
19
+
20
+ __all__ = [
21
+ "StringCache",
22
+ "disable_string_cache",
23
+ "enable_string_cache",
24
+ "using_string_cache",
25
+ ]
26
+
27
+
28
+ class StringCache(contextlib.ContextDecorator):
29
+ """
30
+ Context manager for enabling and disabling the global string cache.
31
+
32
+ :class:`Categorical` columns created under the same global string cache have
33
+ the same underlying physical value when string values are equal. This allows the
34
+ columns to be concatenated or used in a join operation, for example.
35
+
36
+ Notes
37
+ -----
38
+ Enabling the global string cache introduces some overhead.
39
+ The amount of overhead depends on the number of categories in your data.
40
+ It is advised to enable the global string cache only when strictly necessary.
41
+
42
+ If `StringCache` calls are nested, the global string cache will only be disabled
43
+ and cleared when the outermost context exits.
44
+
45
+ Examples
46
+ --------
47
+ Construct two Series using the same global string cache.
48
+
49
+ >>> with pl.StringCache():
50
+ ... s1 = pl.Series("color", ["red", "green", "red"], dtype=pl.Categorical)
51
+ ... s2 = pl.Series("color", ["blue", "red", "green"], dtype=pl.Categorical)
52
+
53
+ As both Series are constructed under the same global string cache,
54
+ they can be concatenated.
55
+
56
+ >>> pl.concat([s1, s2])
57
+ shape: (6,)
58
+ Series: 'color' [cat]
59
+ [
60
+ "red"
61
+ "green"
62
+ "red"
63
+ "blue"
64
+ "red"
65
+ "green"
66
+ ]
67
+
68
+ The class can also be used as a function decorator, in which case the string cache
69
+ is enabled during function execution, and disabled afterwards.
70
+
71
+ >>> @pl.StringCache()
72
+ ... def construct_categoricals() -> pl.Series:
73
+ ... s1 = pl.Series("color", ["red", "green", "red"], dtype=pl.Categorical)
74
+ ... s2 = pl.Series("color", ["blue", "red", "green"], dtype=pl.Categorical)
75
+ ... return pl.concat([s1, s2])
76
+ """
77
+
78
+ def __enter__(self) -> Self:
79
+ self._string_cache = PyStringCacheHolder()
80
+ return self
81
+
82
+ def __exit__(
83
+ self,
84
+ exc_type: type[BaseException] | None,
85
+ exc_val: BaseException | None,
86
+ exc_tb: TracebackType | None,
87
+ ) -> None:
88
+ del self._string_cache
89
+
90
+
91
+ def enable_string_cache() -> None:
92
+ """
93
+ Enable the global string cache.
94
+
95
+ :class:`Categorical` columns created under the same global string cache have
96
+ the same underlying physical value when string values are equal. This allows the
97
+ columns to be concatenated or used in a join operation, for example.
98
+
99
+ See Also
100
+ --------
101
+ StringCache : Context manager for enabling and disabling the string cache.
102
+ disable_string_cache : Function to disable the string cache.
103
+
104
+ Notes
105
+ -----
106
+ Enabling the global string cache introduces some overhead.
107
+ The amount of overhead depends on the number of categories in your data.
108
+ It is advised to enable the global string cache only when strictly necessary.
109
+
110
+ Consider using the :class:`StringCache` context manager for a more reliable way of
111
+ enabling and disabling the string cache.
112
+
113
+ Examples
114
+ --------
115
+ Construct two Series using the same global string cache.
116
+
117
+ >>> pl.enable_string_cache()
118
+ >>> s1 = pl.Series("color", ["red", "green", "red"], dtype=pl.Categorical)
119
+ >>> s2 = pl.Series("color", ["blue", "red", "green"], dtype=pl.Categorical)
120
+ >>> pl.disable_string_cache()
121
+
122
+ As both Series are constructed under the same global string cache,
123
+ they can be concatenated.
124
+
125
+ >>> pl.concat([s1, s2])
126
+ shape: (6,)
127
+ Series: 'color' [cat]
128
+ [
129
+ "red"
130
+ "green"
131
+ "red"
132
+ "blue"
133
+ "red"
134
+ "green"
135
+ ]
136
+ """
137
+ plr.enable_string_cache()
138
+
139
+
140
+ def disable_string_cache() -> None:
141
+ """
142
+ Disable and clear the global string cache.
143
+
144
+ See Also
145
+ --------
146
+ enable_string_cache : Function to enable the string cache.
147
+ StringCache : Context manager for enabling and disabling the string cache.
148
+
149
+ Notes
150
+ -----
151
+ Consider using the :class:`StringCache` context manager for a more reliable way of
152
+ enabling and disabling the string cache.
153
+
154
+ When used in conjunction with the :class:`StringCache` context manager, the string
155
+ cache will not be disabled until the context manager exits.
156
+
157
+ Examples
158
+ --------
159
+ Construct two Series using the same global string cache.
160
+
161
+ >>> pl.enable_string_cache()
162
+ >>> s1 = pl.Series("color", ["red", "green", "red"], dtype=pl.Categorical)
163
+ >>> s2 = pl.Series("color", ["blue", "red", "green"], dtype=pl.Categorical)
164
+ >>> pl.disable_string_cache()
165
+
166
+ As both Series are constructed under the same global string cache,
167
+ they can be concatenated.
168
+
169
+ >>> pl.concat([s1, s2])
170
+ shape: (6,)
171
+ Series: 'color' [cat]
172
+ [
173
+ "red"
174
+ "green"
175
+ "red"
176
+ "blue"
177
+ "red"
178
+ "green"
179
+ ]
180
+ """
181
+
182
+
183
+ def using_string_cache() -> bool:
184
+ """Check whether the global string cache is enabled."""
185
+ return plr.using_string_cache()
@@ -0,0 +1,13 @@
1
+ from polars.testing.asserts import (
2
+ assert_frame_equal,
3
+ assert_frame_not_equal,
4
+ assert_series_equal,
5
+ assert_series_not_equal,
6
+ )
7
+
8
+ __all__ = [
9
+ "assert_frame_equal",
10
+ "assert_frame_not_equal",
11
+ "assert_series_equal",
12
+ "assert_series_not_equal",
13
+ ]
@@ -0,0 +1,9 @@
1
+ from polars.testing.asserts.frame import assert_frame_equal, assert_frame_not_equal
2
+ from polars.testing.asserts.series import assert_series_equal, assert_series_not_equal
3
+
4
+ __all__ = [
5
+ "assert_frame_equal",
6
+ "assert_frame_not_equal",
7
+ "assert_series_equal",
8
+ "assert_series_not_equal",
9
+ ]
@@ -0,0 +1,231 @@
1
+ from __future__ import annotations
2
+
3
+ import contextlib
4
+ from typing import cast
5
+
6
+ from polars._utils.deprecation import deprecate_renamed_parameter
7
+ from polars.dataframe import DataFrame
8
+ from polars.lazyframe import LazyFrame
9
+ from polars.testing.asserts.utils import raise_assertion_error
10
+
11
+ with contextlib.suppress(ImportError): # Module not available when building docs
12
+ from polars._plr import assert_dataframe_equal_py
13
+
14
+
15
+ def _assert_correct_input_type(
16
+ left: DataFrame | LazyFrame, right: DataFrame | LazyFrame
17
+ ) -> bool:
18
+ __tracebackhide__ = True
19
+
20
+ if isinstance(left, DataFrame) and isinstance(right, DataFrame):
21
+ return False
22
+ elif isinstance(left, LazyFrame) and isinstance(right, LazyFrame):
23
+ return True
24
+ else:
25
+ raise_assertion_error(
26
+ "inputs",
27
+ "unexpected input types",
28
+ type(left).__name__,
29
+ type(right).__name__,
30
+ )
31
+
32
+
33
+ @deprecate_renamed_parameter("check_dtype", "check_dtypes", version="0.20.31")
34
+ @deprecate_renamed_parameter("rtol", "rel_tol", version="1.32.3")
35
+ @deprecate_renamed_parameter("atol", "abs_tol", version="1.32.3")
36
+ def assert_frame_equal(
37
+ left: DataFrame | LazyFrame,
38
+ right: DataFrame | LazyFrame,
39
+ *,
40
+ check_row_order: bool = True,
41
+ check_column_order: bool = True,
42
+ check_dtypes: bool = True,
43
+ check_exact: bool = False,
44
+ rel_tol: float = 1e-5,
45
+ abs_tol: float = 1e-8,
46
+ categorical_as_str: bool = False,
47
+ ) -> None:
48
+ """
49
+ Assert that the left and right frame are equal.
50
+
51
+ Raises a detailed `AssertionError` if the frames differ.
52
+ This function is intended for use in unit tests.
53
+
54
+ .. versionchanged:: 0.20.31
55
+ The `check_dtype` parameter was renamed `check_dtypes`.
56
+
57
+ .. versionchanged:: 1.32.3
58
+ The `rtol` and `atol` parameters were renamed to `rel_tol` and `abs_tol`,
59
+ respectively.
60
+
61
+ Parameters
62
+ ----------
63
+ left
64
+ The first DataFrame or LazyFrame to compare.
65
+ right
66
+ The second DataFrame or LazyFrame to compare.
67
+ check_row_order
68
+ Requires row order to match.
69
+ check_column_order
70
+ Requires column order to match.
71
+ check_dtypes
72
+ Requires data types to match.
73
+ check_exact
74
+ Requires float values to match exactly. If set to `False`, values are considered
75
+ equal when within tolerance of each other (see `rel_tol` and `abs_tol`).
76
+ Only affects columns with a Float data type.
77
+ rel_tol
78
+ Relative tolerance for inexact checking. Fraction of values in `right`.
79
+ abs_tol
80
+ Absolute tolerance for inexact checking.
81
+ categorical_as_str
82
+ Cast categorical columns to string before comparing. Enabling this helps
83
+ compare columns that do not share the same string cache.
84
+
85
+ See Also
86
+ --------
87
+ assert_series_equal
88
+ assert_frame_not_equal
89
+
90
+ Notes
91
+ -----
92
+ When using pytest, it may be worthwhile to shorten Python traceback printing
93
+ by passing `--tb=short`. The default mode tends to be unhelpfully verbose.
94
+ More information in the
95
+ `pytest docs <https://docs.pytest.org/en/latest/how-to/output.html#modifying-python-traceback-printing>`_.
96
+
97
+ Examples
98
+ --------
99
+ >>> from polars.testing import assert_frame_equal
100
+ >>> df1 = pl.DataFrame({"a": [1, 2, 3]})
101
+ >>> df2 = pl.DataFrame({"a": [1, 5, 3]})
102
+ >>> assert_frame_equal(df1, df2)
103
+ Traceback (most recent call last):
104
+ ...
105
+ AssertionError: DataFrames are different (value mismatch for column "a")
106
+ [left]: shape: (3,)
107
+ Series: 'a' [i64]
108
+ [
109
+ 1
110
+ 2
111
+ 3
112
+ ]
113
+ [right]: shape: (3,)
114
+ Series: 'a' [i64]
115
+ [
116
+ 1
117
+ 5
118
+ 3
119
+ ]
120
+ """
121
+ __tracebackhide__ = True
122
+
123
+ lazy = _assert_correct_input_type(left, right)
124
+
125
+ # Rust back-end function expects DataFrames so LazyFrames must be collected
126
+ if lazy:
127
+ left, right = left.collect(), right.collect() # type: ignore[union-attr]
128
+
129
+ # Tell type checker these are now DataFrames to prevent type errors
130
+ left, right = cast("DataFrame", left), cast("DataFrame", right)
131
+
132
+ assert_dataframe_equal_py(
133
+ left._df,
134
+ right._df,
135
+ check_row_order=check_row_order,
136
+ check_column_order=check_column_order,
137
+ check_dtypes=check_dtypes,
138
+ check_exact=check_exact,
139
+ rel_tol=rel_tol,
140
+ abs_tol=abs_tol,
141
+ categorical_as_str=categorical_as_str,
142
+ )
143
+
144
+
145
+ @deprecate_renamed_parameter("check_dtype", "check_dtypes", version="0.20.31")
146
+ @deprecate_renamed_parameter("rtol", "rel_tol", version="1.32.3")
147
+ @deprecate_renamed_parameter("atol", "abs_tol", version="1.32.3")
148
+ def assert_frame_not_equal(
149
+ left: DataFrame | LazyFrame,
150
+ right: DataFrame | LazyFrame,
151
+ *,
152
+ check_row_order: bool = True,
153
+ check_column_order: bool = True,
154
+ check_dtypes: bool = True,
155
+ check_exact: bool = False,
156
+ rel_tol: float = 1e-5,
157
+ abs_tol: float = 1e-8,
158
+ categorical_as_str: bool = False,
159
+ ) -> None:
160
+ """
161
+ Assert that the left and right frame are **not** equal.
162
+
163
+ This function is intended for use in unit tests.
164
+
165
+ .. versionchanged:: 0.20.31
166
+ The `check_dtype` parameter was renamed `check_dtypes`.
167
+
168
+ .. versionchanged:: 1.32.3
169
+ The `rtol` and `atol` parameters were renamed to `rel_tol` and `abs_tol`,
170
+ respectively.
171
+
172
+ Parameters
173
+ ----------
174
+ left
175
+ The first DataFrame or LazyFrame to compare.
176
+ right
177
+ The second DataFrame or LazyFrame to compare.
178
+ check_row_order
179
+ Requires row order to match.
180
+ check_column_order
181
+ Requires column order to match.
182
+ check_dtypes
183
+ Requires data types to match.
184
+ check_exact
185
+ Requires float values to match exactly. If set to `False`, values are considered
186
+ equal when within tolerance of each other (see `rel_tol` and `abs_tol`).
187
+ Only affects columns with a Float data type.
188
+ rel_tol
189
+ Relative tolerance for inexact checking. Fraction of values in `right`.
190
+ abs_tol
191
+ Absolute tolerance for inexact checking.
192
+ categorical_as_str
193
+ Cast categorical columns to string before comparing. Enabling this helps
194
+ compare columns that do not share the same string cache.
195
+
196
+ See Also
197
+ --------
198
+ assert_frame_equal
199
+ assert_series_not_equal
200
+
201
+ Examples
202
+ --------
203
+ >>> from polars.testing import assert_frame_not_equal
204
+ >>> df1 = pl.DataFrame({"a": [1, 2, 3]})
205
+ >>> df2 = pl.DataFrame({"a": [1, 2, 3]})
206
+ >>> assert_frame_not_equal(df1, df2)
207
+ Traceback (most recent call last):
208
+ ...
209
+ AssertionError: DataFrames are equal (but are expected not to be)
210
+ """
211
+ __tracebackhide__ = True
212
+
213
+ lazy = _assert_correct_input_type(left, right)
214
+ try:
215
+ assert_frame_equal(
216
+ left=left,
217
+ right=right,
218
+ check_column_order=check_column_order,
219
+ check_row_order=check_row_order,
220
+ check_dtypes=check_dtypes,
221
+ check_exact=check_exact,
222
+ rel_tol=rel_tol,
223
+ abs_tol=abs_tol,
224
+ categorical_as_str=categorical_as_str,
225
+ )
226
+ except AssertionError:
227
+ return
228
+ else:
229
+ objects = "LazyFrames" if lazy else "DataFrames"
230
+ msg = f"{objects} are equal (but are expected not to be)"
231
+ raise AssertionError(msg)