Flowfile 0.3.5__py3-none-any.whl → 0.3.7__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.

Potentially problematic release.


This version of Flowfile might be problematic. Click here for more details.

Files changed (145) hide show
  1. flowfile/__init__.py +27 -6
  2. flowfile/api.py +1 -0
  3. flowfile/web/__init__.py +2 -2
  4. flowfile/web/static/assets/CloudConnectionManager-2dfdce2f.css +86 -0
  5. flowfile/web/static/assets/CloudConnectionManager-c20a740f.js +783 -0
  6. flowfile/web/static/assets/CloudStorageReader-29d14fcc.css +143 -0
  7. flowfile/web/static/assets/CloudStorageReader-960b400a.js +437 -0
  8. flowfile/web/static/assets/CloudStorageWriter-49c9a4b2.css +138 -0
  9. flowfile/web/static/assets/CloudStorageWriter-e3decbdd.js +430 -0
  10. flowfile/web/static/assets/{CrossJoin-dfcf7351.js → CrossJoin-d67e2405.js} +8 -8
  11. flowfile/web/static/assets/{DatabaseConnectionSettings-b2afb1d7.js → DatabaseConnectionSettings-a81e0f7e.js} +2 -2
  12. flowfile/web/static/assets/{DatabaseManager-824a49b2.js → DatabaseManager-9ea35e84.js} +2 -2
  13. flowfile/web/static/assets/{DatabaseReader-a48124d8.js → DatabaseReader-9578bfa5.js} +9 -9
  14. flowfile/web/static/assets/{DatabaseWriter-b47cbae2.js → DatabaseWriter-19531098.js} +9 -9
  15. flowfile/web/static/assets/{ExploreData-fdfc45a4.js → ExploreData-40476474.js} +47141 -43697
  16. flowfile/web/static/assets/{ExternalSource-861b0e71.js → ExternalSource-2297ef96.js} +6 -6
  17. flowfile/web/static/assets/{Filter-f87bb897.js → Filter-f211c03a.js} +8 -8
  18. flowfile/web/static/assets/{Formula-b8cefc31.css → Formula-29f19d21.css} +10 -0
  19. flowfile/web/static/assets/{Formula-1e2ed720.js → Formula-4207ea31.js} +75 -9
  20. flowfile/web/static/assets/{FuzzyMatch-b6cc4fdd.js → FuzzyMatch-bf120df0.js} +9 -9
  21. flowfile/web/static/assets/{GraphSolver-6a371f4c.js → GraphSolver-5bb7497a.js} +5 -5
  22. flowfile/web/static/assets/{GroupBy-f7b7f472.js → GroupBy-92c81b65.js} +6 -6
  23. flowfile/web/static/assets/{Join-eec38203.js → Join-4e49a274.js} +23 -15
  24. flowfile/web/static/assets/{Join-41c0f331.css → Join-f45eff22.css} +20 -20
  25. flowfile/web/static/assets/{ManualInput-9aaa46fb.js → ManualInput-90998ae8.js} +106 -34
  26. flowfile/web/static/assets/{ManualInput-ac7b9972.css → ManualInput-a71b52c6.css} +29 -17
  27. flowfile/web/static/assets/{Output-3b2ca045.js → Output-81e3e917.js} +4 -4
  28. flowfile/web/static/assets/{Pivot-a4f5d88f.js → Pivot-a3419842.js} +6 -6
  29. flowfile/web/static/assets/{PolarsCode-49ce444f.js → PolarsCode-72710deb.js} +6 -6
  30. flowfile/web/static/assets/{Read-07acdc9a.js → Read-c4059daf.js} +6 -6
  31. flowfile/web/static/assets/{RecordCount-6a21da56.js → RecordCount-c2b5e095.js} +5 -5
  32. flowfile/web/static/assets/{RecordId-949bdc17.js → RecordId-10baf191.js} +6 -6
  33. flowfile/web/static/assets/{Sample-7afca6e1.js → Sample-3ed9a0ae.js} +5 -5
  34. flowfile/web/static/assets/{SecretManager-b41c029d.js → SecretManager-0d49c0e8.js} +2 -2
  35. flowfile/web/static/assets/{Select-32b28406.js → Select-8a02a0b3.js} +8 -8
  36. flowfile/web/static/assets/{SettingsSection-a0f15a05.js → SettingsSection-4c0f45f5.js} +1 -1
  37. flowfile/web/static/assets/{Sort-fc6ba0e2.js → Sort-f55c9f9d.js} +6 -6
  38. flowfile/web/static/assets/{TextToRows-23127596.js → TextToRows-5dbc2145.js} +8 -8
  39. flowfile/web/static/assets/{UnavailableFields-c42880a3.js → UnavailableFields-a1768e52.js} +2 -2
  40. flowfile/web/static/assets/{Union-39eecc6c.js → Union-f2aefdc9.js} +5 -5
  41. flowfile/web/static/assets/{Unique-a0e8fe61.js → Unique-46b250da.js} +8 -8
  42. flowfile/web/static/assets/{Unpivot-1e2d43f0.js → Unpivot-25ac84cc.js} +5 -5
  43. flowfile/web/static/assets/api-6ef0dcef.js +80 -0
  44. flowfile/web/static/assets/{api-44ca9e9c.js → api-a0abbdc7.js} +1 -1
  45. flowfile/web/static/assets/cloud_storage_reader-aa1415d6.png +0 -0
  46. flowfile/web/static/assets/{designer-267d44f1.js → designer-13eabd83.js} +36 -34
  47. flowfile/web/static/assets/{documentation-6c0810a2.js → documentation-b87e7f6f.js} +1 -1
  48. flowfile/web/static/assets/{dropDown-52790b15.js → dropDown-13564764.js} +1 -1
  49. flowfile/web/static/assets/{fullEditor-e272b506.js → fullEditor-fd2cd6f9.js} +2 -2
  50. flowfile/web/static/assets/{genericNodeSettings-4bdcf98e.js → genericNodeSettings-71e11604.js} +3 -3
  51. flowfile/web/static/assets/{index-e235a8bc.js → index-f6c15e76.js} +59 -22
  52. flowfile/web/static/assets/{nodeTitle-fc3fc4b7.js → nodeTitle-988d9efe.js} +3 -3
  53. flowfile/web/static/assets/{secretApi-cdc2a3fd.js → secretApi-dd636aa2.js} +1 -1
  54. flowfile/web/static/assets/{selectDynamic-96aa82cd.js → selectDynamic-af36165e.js} +3 -3
  55. flowfile/web/static/assets/{vue-codemirror.esm-25e75a08.js → vue-codemirror.esm-2847001e.js} +2 -1
  56. flowfile/web/static/assets/{vue-content-loader.es-6c4b1c24.js → vue-content-loader.es-0371da73.js} +1 -1
  57. flowfile/web/static/index.html +1 -1
  58. {flowfile-0.3.5.dist-info → flowfile-0.3.7.dist-info}/METADATA +9 -4
  59. {flowfile-0.3.5.dist-info → flowfile-0.3.7.dist-info}/RECORD +131 -124
  60. {flowfile-0.3.5.dist-info → flowfile-0.3.7.dist-info}/entry_points.txt +2 -0
  61. flowfile_core/__init__.py +3 -0
  62. flowfile_core/auth/jwt.py +39 -0
  63. flowfile_core/configs/node_store/nodes.py +9 -6
  64. flowfile_core/configs/settings.py +6 -5
  65. flowfile_core/database/connection.py +63 -15
  66. flowfile_core/database/init_db.py +0 -1
  67. flowfile_core/database/models.py +49 -2
  68. flowfile_core/flowfile/code_generator/code_generator.py +472 -17
  69. flowfile_core/flowfile/connection_manager/models.py +1 -1
  70. flowfile_core/flowfile/database_connection_manager/db_connections.py +216 -2
  71. flowfile_core/flowfile/extensions.py +1 -1
  72. flowfile_core/flowfile/flow_data_engine/cloud_storage_reader.py +259 -0
  73. flowfile_core/flowfile/flow_data_engine/create/funcs.py +19 -8
  74. flowfile_core/flowfile/flow_data_engine/flow_data_engine.py +1062 -311
  75. flowfile_core/flowfile/flow_data_engine/flow_file_column/main.py +12 -2
  76. flowfile_core/flowfile/flow_data_engine/fuzzy_matching/settings_validator.py +1 -1
  77. flowfile_core/flowfile/flow_data_engine/join/__init__.py +2 -1
  78. flowfile_core/flowfile/flow_data_engine/join/utils.py +25 -0
  79. flowfile_core/flowfile/flow_data_engine/polars_code_parser.py +3 -1
  80. flowfile_core/flowfile/flow_data_engine/subprocess_operations/subprocess_operations.py +29 -22
  81. flowfile_core/flowfile/flow_data_engine/utils.py +1 -40
  82. flowfile_core/flowfile/flow_graph.py +718 -253
  83. flowfile_core/flowfile/flow_graph_utils.py +2 -2
  84. flowfile_core/flowfile/flow_node/flow_node.py +563 -117
  85. flowfile_core/flowfile/flow_node/models.py +154 -20
  86. flowfile_core/flowfile/flow_node/schema_callback.py +3 -2
  87. flowfile_core/flowfile/handler.py +2 -33
  88. flowfile_core/flowfile/manage/open_flowfile.py +1 -2
  89. flowfile_core/flowfile/sources/external_sources/__init__.py +0 -2
  90. flowfile_core/flowfile/sources/external_sources/factory.py +4 -7
  91. flowfile_core/flowfile/util/calculate_layout.py +0 -2
  92. flowfile_core/flowfile/utils.py +35 -26
  93. flowfile_core/main.py +35 -15
  94. flowfile_core/routes/cloud_connections.py +77 -0
  95. flowfile_core/routes/logs.py +2 -7
  96. flowfile_core/routes/public.py +1 -0
  97. flowfile_core/routes/routes.py +130 -90
  98. flowfile_core/routes/secrets.py +72 -14
  99. flowfile_core/schemas/__init__.py +8 -0
  100. flowfile_core/schemas/cloud_storage_schemas.py +215 -0
  101. flowfile_core/schemas/input_schema.py +121 -71
  102. flowfile_core/schemas/output_model.py +19 -3
  103. flowfile_core/schemas/schemas.py +150 -12
  104. flowfile_core/schemas/transform_schema.py +175 -35
  105. flowfile_core/utils/utils.py +40 -1
  106. flowfile_core/utils/validate_setup.py +41 -0
  107. flowfile_frame/__init__.py +9 -1
  108. flowfile_frame/cloud_storage/frame_helpers.py +39 -0
  109. flowfile_frame/cloud_storage/secret_manager.py +73 -0
  110. flowfile_frame/expr.py +28 -1
  111. flowfile_frame/expr.pyi +76 -61
  112. flowfile_frame/flow_frame.py +481 -208
  113. flowfile_frame/flow_frame.pyi +140 -91
  114. flowfile_frame/flow_frame_methods.py +160 -22
  115. flowfile_frame/group_frame.py +3 -0
  116. flowfile_frame/utils.py +25 -3
  117. flowfile_worker/external_sources/s3_source/main.py +216 -0
  118. flowfile_worker/external_sources/s3_source/models.py +142 -0
  119. flowfile_worker/funcs.py +51 -6
  120. flowfile_worker/models.py +22 -2
  121. flowfile_worker/routes.py +40 -38
  122. flowfile_worker/utils.py +1 -1
  123. test_utils/s3/commands.py +46 -0
  124. test_utils/s3/data_generator.py +292 -0
  125. test_utils/s3/demo_data_generator.py +186 -0
  126. test_utils/s3/fixtures.py +214 -0
  127. flowfile/web/static/assets/AirbyteReader-1ac35765.css +0 -314
  128. flowfile/web/static/assets/AirbyteReader-e08044e5.js +0 -922
  129. flowfile/web/static/assets/dropDownGeneric-60f56a8a.js +0 -72
  130. flowfile/web/static/assets/dropDownGeneric-895680d6.css +0 -10
  131. flowfile_core/flowfile/sources/external_sources/airbyte_sources/airbyte.py +0 -159
  132. flowfile_core/flowfile/sources/external_sources/airbyte_sources/models.py +0 -172
  133. flowfile_core/flowfile/sources/external_sources/airbyte_sources/settings.py +0 -173
  134. flowfile_core/schemas/defaults.py +0 -9
  135. flowfile_core/schemas/external_sources/airbyte_schemas.py +0 -20
  136. flowfile_core/schemas/models.py +0 -193
  137. flowfile_worker/external_sources/airbyte_sources/cache_manager.py +0 -161
  138. flowfile_worker/external_sources/airbyte_sources/main.py +0 -89
  139. flowfile_worker/external_sources/airbyte_sources/models.py +0 -133
  140. flowfile_worker/external_sources/airbyte_sources/settings.py +0 -0
  141. {flowfile-0.3.5.dist-info → flowfile-0.3.7.dist-info}/LICENSE +0 -0
  142. {flowfile-0.3.5.dist-info → flowfile-0.3.7.dist-info}/WHEEL +0 -0
  143. {flowfile_core/flowfile/sources/external_sources/airbyte_sources → flowfile_frame/cloud_storage}/__init__.py +0 -0
  144. {flowfile_core/schemas/external_sources → flowfile_worker/external_sources/s3_source}/__init__.py +0 -0
  145. {flowfile_worker/external_sources/airbyte_sources → test_utils/s3}/__init__.py +0 -0
@@ -0,0 +1,73 @@
1
+ from typing import List
2
+
3
+ from flowfile_core.schemas.cloud_storage_schemas import FullCloudStorageConnection, FullCloudStorageConnectionInterface
4
+ from flowfile_core.flowfile.database_connection_manager.db_connections import (store_cloud_connection,
5
+ get_all_cloud_connections_interface,
6
+ delete_cloud_connection)
7
+ from flowfile_core.database.connection import get_db_context
8
+ from flowfile_core.auth.jwt import get_current_user_sync, create_access_token
9
+ from asyncio import run
10
+
11
+
12
+ def get_current_user_id() -> int | None:
13
+ access_token = create_access_token(data={"sub": "local_user"})
14
+ with get_db_context() as db:
15
+ current_user_id = get_current_user_sync(
16
+ access_token,
17
+ db
18
+ ).id
19
+ return current_user_id
20
+
21
+
22
+ def create_cloud_storage_connection(connection: FullCloudStorageConnection) -> None:
23
+ """
24
+ Create a cloud storage connection using the provided connection details.
25
+
26
+ Args:
27
+ connection (FullCloudStorageConnection): The connection details for cloud storage.
28
+
29
+ Returns:
30
+ None
31
+ """
32
+ access_token = create_access_token(data={"sub": "local_user"})
33
+
34
+ with get_db_context() as db:
35
+ current_user_id = get_current_user_sync(
36
+ access_token,
37
+ db
38
+ ).id
39
+ store_cloud_connection(
40
+ db,
41
+ connection,
42
+ current_user_id
43
+ )
44
+
45
+
46
+ def create_cloud_storage_connection_if_not_exists(connection: FullCloudStorageConnection) -> None:
47
+ """
48
+ Create a cloud storage connection if it does not already exist.
49
+
50
+ Args:
51
+ connection (FullCloudStorageConnection): The connection details for cloud storage.
52
+
53
+ Returns:
54
+ None
55
+ """
56
+ all_connections = get_all_available_cloud_storage_connections()
57
+ if not any(conn.connection_name == connection.connection_name for conn in all_connections):
58
+ create_cloud_storage_connection(connection)
59
+
60
+
61
+ def get_all_available_cloud_storage_connections() -> List[FullCloudStorageConnectionInterface]:
62
+ with get_db_context() as db:
63
+ all_connections = get_all_cloud_connections_interface(
64
+ db,
65
+ get_current_user_id()
66
+ )
67
+ return all_connections
68
+
69
+
70
+ def del_cloud_storage_connection(connection_name: str) -> None:
71
+ with get_db_context() as db:
72
+ user_id = get_current_user_id()
73
+ delete_cloud_connection(db, connection_name, user_id)
flowfile_frame/expr.py CHANGED
@@ -20,6 +20,13 @@ if TYPE_CHECKING:
20
20
  from flowfile_frame.selectors import Selector
21
21
  ExprType = TypeVar('ExprType', bound='Expr')
22
22
  ColumnType = "Column" # Use string literal instead of direct class reference
23
+ from polars._typing import (
24
+ Ambiguous,
25
+ IntoExpr,
26
+ IntoExprColumn,
27
+ PolarsDataType,
28
+ PolarsTemporalType,
29
+ TimeUnit)
23
30
 
24
31
  ExprOrStr = Union['Expr', str]
25
32
  ExprOrStrList = List[ExprOrStr]
@@ -110,6 +117,11 @@ class StringMethods:
110
117
  res_expr = self.expr.to_uppercase() if self.expr is not None else None
111
118
  return self._create_next_expr(method_name="to_uppercase", result_expr=res_expr, is_complex=True)
112
119
 
120
+ def slice(self, offset: int | IntoExprColumn, length: int | IntoExprColumn | None = None) -> Expr:
121
+ res_expr = self.expr.slice(offset=offset, length=length)
122
+ return self._create_next_expr(method_name="slice", result_expr=res_expr, is_complex=True,
123
+ offset=offset, length=length)
124
+
113
125
  def to_lowercase(self):
114
126
  res_expr = self.expr.to_lowercase() if self.expr is not None else None
115
127
  return self._create_next_expr(method_name="to_lowercase", result_expr=res_expr, is_complex=True)
@@ -138,13 +150,28 @@ class StringMethods:
138
150
  strict: bool = True,
139
151
  exact: bool = True,
140
152
  cache: bool = True,
141
- ambiguous: Literal["earliest", "latest", "raise", "null"] | Expr = "raise",):
153
+ ambiguous: Literal["earliest", "latest", "raise", "null"] | Expr = "raise",) -> 'Expr':
142
154
  res_expr = self.expr.to_datetime(format, time_unit=time_unit, time_zone=time_zone, strict=strict,
143
155
  exact=exact, cache=cache, ambiguous=ambiguous)
144
156
  return self._create_next_expr(method_name="to_datetime", result_expr=res_expr, is_complex=True,
145
157
  format=format, time_unit=time_unit, time_zone=time_zone, strict=strict,
146
158
  exact=exact, cache=cache, ambiguous=ambiguous)
147
159
 
160
+ def strptime(self,
161
+ dtype: PolarsTemporalType,
162
+ format: str | None = None,
163
+ *,
164
+ strict: bool = True,
165
+ exact: bool = True,
166
+ cache: bool = True,
167
+ ambiguous: Literal["earliest", "latest", "raise", "null"] | Expr = "raise",) -> 'Expr':
168
+ res_expr = self.expr.strptime(dtype, format, strict=strict, exact=exact, cache=cache, ambiguous=ambiguous)
169
+ return self._create_next_expr(method_name="strptime", dtype=dtype, result_expr=res_expr, is_complex=True,
170
+ format=format, strict=strict,
171
+ exact=exact, cache=cache, ambiguous=ambiguous)
172
+
173
+
174
+
148
175
  def __getattr__(self, name):
149
176
  if self.expr is None or not hasattr(self.expr, name):
150
177
  if self.expr is None:
flowfile_frame/expr.pyi CHANGED
@@ -56,6 +56,12 @@ class StringMethods:
56
56
 
57
57
  def starts_with(self, prefix) -> Any: ...
58
58
 
59
+ def strptime(self, dtype: PolarsTemporalType, format: str | None=None, strict: bool=True, exact: bool=True, cache: bool=True, ambiguous: Literal['earliest', 'latest', 'raise', 'null'] | Expr='raise') -> 'Expr': ...
60
+
61
+ def to_date(self, format: str, strict: bool=True, exact: bool=True, cache: bool=True) -> Any: ...
62
+
63
+ def to_datetime(self, format: str | None=None, time_unit: Literal['ns', 'us', 'ms'] | None=None, time_zone: str | None=None, strict: bool=True, exact: bool=True, cache: bool=True, ambiguous: Literal['earliest', 'latest', 'raise', 'null'] | Expr='raise') -> 'Expr': ...
64
+
59
65
  def to_lowercase(self, ) -> Any: ...
60
66
 
61
67
  def to_titlecase(self, ) -> Any: ...
@@ -297,7 +303,7 @@ class Expr:
297
303
  def cum_sum(self, reverse: bool=False) -> Expr: ...
298
304
 
299
305
  # Run an expression over a sliding window that increases `1` slot every iteration.
300
- def cumulative_eval(self, expr: Expr, min_samples: int=1, parallel: bool=False) -> Expr: ...
306
+ def cumulative_eval(self, expr: Expr, min_samples: int=1) -> Expr: ...
301
307
 
302
308
  # Bin continuous values into discrete categories.
303
309
  def cut(self, breaks: Sequence[float], labels: Sequence[str] | None=None, left_closed: bool=False, include_breaks: bool=False) -> Expr: ...
@@ -309,7 +315,7 @@ class Expr:
309
315
  def deserialize(self, source: str | Path | IOBase | bytes, format: SerializationFormat='binary') -> Expr: ...
310
316
 
311
317
  # Calculate the first discrete difference between shifted items.
312
- def diff(self, n: int=1, null_behavior: NullBehavior='ignore') -> Expr: ...
318
+ def diff(self, n: int | IntoExpr=1, null_behavior: NullBehavior='ignore') -> Expr: ...
313
319
 
314
320
  # Compute the dot/inner product between two Expressions.
315
321
  def dot(self, other: Expr | str) -> Expr: ...
@@ -414,7 +420,7 @@ class Expr:
414
420
  # Print the value that this expression evaluates to and pass on the value.
415
421
  def inspect(self, fmt: str='{}') -> Expr: ...
416
422
 
417
- # Fill null values using interpolation.
423
+ # Interpolate intermediate values.
418
424
  def interpolate(self, method: InterpolationMethod='linear') -> Expr: ...
419
425
 
420
426
  # Fill null values using interpolation based on another column.
@@ -483,7 +489,7 @@ class Expr:
483
489
  def lt(self, other: Any) -> Expr: ...
484
490
 
485
491
  # Apply a custom python function to a whole Series or sequence of Series.
486
- def map_batches(self, function: Callable[[Series], Series | Any], return_dtype: PolarsDataType | None=None, agg_list: bool=False, is_elementwise: bool=False, returns_scalar: bool=False) -> Expr: ...
492
+ def map_batches(self, function: Callable[[Series], Series | Any], return_dtype: PolarsDataType | pl.DataTypeExpr | None=None, agg_list: bool=False, is_elementwise: bool=False, returns_scalar: bool=False) -> Expr: ...
487
493
 
488
494
  # Map a custom/user-defined function (UDF) to each element of a column.
489
495
  def map_elements(self, function: Callable[[Any], Any], return_dtype: PolarsDataType | None=None, skip_nulls: bool=True, pass_name: bool=False, strategy: MapElementsStrategy='thread_local', returns_scalar: bool=False) -> Expr: ...
@@ -556,7 +562,7 @@ class Expr:
556
562
  def qcut(self, quantiles: Sequence[float] | int, labels: Sequence[str] | None=None, left_closed: bool=False, allow_duplicates: bool=False, include_breaks: bool=False) -> Expr: ...
557
563
 
558
564
  # Get quantile value.
559
- def quantile(self, quantile: float | Expr, interpolation: RollingInterpolationMethod='nearest') -> Expr: ...
565
+ def quantile(self, quantile: float | Expr, interpolation: QuantileMethod='nearest') -> Expr: ...
560
566
 
561
567
  # Convert from degrees to radians.
562
568
  def radians(self, ) -> Expr: ...
@@ -580,7 +586,7 @@ class Expr:
580
586
  def replace(self, old: IntoExpr | Sequence[Any] | Mapping[Any, Any], new: IntoExpr | Sequence[Any], default: IntoExpr, return_dtype: PolarsDataType | None=None) -> Expr: ...
581
587
 
582
588
  # Replace all values by different values.
583
- def replace_strict(self, old: IntoExpr | Sequence[Any] | Mapping[Any, Any], new: IntoExpr | Sequence[Any], default: IntoExpr, return_dtype: PolarsDataType | None=None) -> Expr: ...
589
+ def replace_strict(self, old: IntoExpr | Sequence[Any] | Mapping[Any, Any], new: IntoExpr | Sequence[Any], default: IntoExpr, return_dtype: PolarsDataType | pl.DataTypeExpr | None=None) -> Expr: ...
584
590
 
585
591
  # Reshape this Expr to a flat column or an Array column.
586
592
  def reshape(self, dimensions: tuple[int, ...]) -> Expr: ...
@@ -597,6 +603,9 @@ class Expr:
597
603
  # Create rolling groups based on a temporal or integer column.
598
604
  def rolling(self, index_column: str, period: str | timedelta, offset: str | timedelta | None=None, closed: ClosedInterval='right') -> Expr: ...
599
605
 
606
+ # Compute a rolling kurtosis.
607
+ def rolling_kurtosis(self, window_size: int, fisher: bool=True, bias: bool=True, min_samples: int | None=None, center: bool=False) -> Expr: ...
608
+
600
609
  # Compute a custom rolling window function.
601
610
  def rolling_map(self, function: Callable[[Series], Any], window_size: int, weights: list[float] | None=None, min_samples: int | None=None, center: bool=False) -> Expr: ...
602
611
 
@@ -625,13 +634,13 @@ class Expr:
625
634
  def rolling_min_by(self, by: IntoExpr, window_size: timedelta | str, min_samples: int=1, closed: ClosedInterval='right') -> Expr: ...
626
635
 
627
636
  # Compute a rolling quantile.
628
- def rolling_quantile(self, quantile: float, interpolation: RollingInterpolationMethod='nearest', window_size: int=2, weights: list[float] | None=None, min_samples: int | None=None, center: bool=False) -> Expr: ...
637
+ def rolling_quantile(self, quantile: float, interpolation: QuantileMethod='nearest', window_size: int=2, weights: list[float] | None=None, min_samples: int | None=None, center: bool=False) -> Expr: ...
629
638
 
630
639
  # Compute a rolling quantile based on another column.
631
- def rolling_quantile_by(self, by: IntoExpr, window_size: timedelta | str, quantile: float, interpolation: RollingInterpolationMethod='nearest', min_samples: int=1, closed: ClosedInterval='right') -> Expr: ...
640
+ def rolling_quantile_by(self, by: IntoExpr, window_size: timedelta | str, quantile: float, interpolation: QuantileMethod='nearest', min_samples: int=1, closed: ClosedInterval='right') -> Expr: ...
632
641
 
633
642
  # Compute a rolling skew.
634
- def rolling_skew(self, window_size: int, bias: bool=True) -> Expr: ...
643
+ def rolling_skew(self, window_size: int, bias: bool=True, min_samples: int | None=None, center: bool=False) -> Expr: ...
635
644
 
636
645
  # Compute a rolling standard deviation.
637
646
  def rolling_std(self, window_size: int, weights: list[float] | None=None, min_samples: int | None=None, center: bool=False, ddof: int=1) -> Expr: ...
@@ -652,7 +661,7 @@ class Expr:
652
661
  def rolling_var_by(self, by: IntoExpr, window_size: timedelta | str, min_samples: int=1, closed: ClosedInterval='right', ddof: int=1) -> Expr: ...
653
662
 
654
663
  # Round underlying floating point data by `decimals` digits.
655
- def round(self, decimals: int=0) -> Expr: ...
664
+ def round(self, decimals: int=0, mode: RoundMode='half_to_even') -> Expr: ...
656
665
 
657
666
  # Round to a number of significant figures.
658
667
  def round_sig_figs(self, digits: int) -> Expr: ...
@@ -661,7 +670,7 @@ class Expr:
661
670
  def sample(self, n: int | IntoExprColumn | None=None, fraction: float | IntoExprColumn | None=None, with_replacement: bool=False, shuffle: bool=False, seed: int | None=None) -> Expr: ...
662
671
 
663
672
  # Find indices where elements should be inserted to maintain order.
664
- def search_sorted(self, element: IntoExpr | np.ndarray[Any, Any], side: SearchSortedSide='any') -> Expr: ...
673
+ def search_sorted(self, element: IntoExpr | np.ndarray[Any, Any], side: SearchSortedSide='any', descending: bool=False) -> Expr: ...
665
674
 
666
675
  # Flags the expression as 'sorted'.
667
676
  def set_sorted(self, descending: bool=False) -> Expr: ...
@@ -735,7 +744,7 @@ class Expr:
735
744
  # Calculate the upper bound.
736
745
  def upper_bound(self, ) -> Expr: ...
737
746
 
738
- # Count the occurrences of unique values.
747
+ # Count the occurrence of unique values.
739
748
  def value_counts(self, sort: bool=False, parallel: bool=False, name: str | None=None, normalize: bool=False) -> Expr: ...
740
749
 
741
750
  def var(self, ddof=1) -> Any: ...
@@ -746,59 +755,59 @@ class Expr:
746
755
  # Method equivalent of bitwise exclusive-or operator `expr ^ other`.
747
756
  def xor(self, other: Any) -> Expr: ...
748
757
 
749
- def __init_subclass__(self, *args, **kwargs) -> 'Expr': ...
758
+ def __pos__(self, *args, **kwargs) -> 'Expr': ...
750
759
 
751
- def _repr_html_(self, *args, **kwargs) -> 'Expr': ...
760
+ def __rxor__(self, *args, **kwargs) -> 'Expr': ...
752
761
 
753
- def _from_pyexpr(self, *args, **kwargs) -> 'Expr': ...
762
+ def __sizeof__(self, *args, **kwargs) -> 'Expr': ...
754
763
 
755
- def __bool__(self, *args, **kwargs) -> 'Expr': ...
764
+ def __init_subclass__(self, *args, **kwargs) -> 'Expr': ...
756
765
 
757
- def _map_batches_wrapper(self, *args, **kwargs) -> 'Expr': ...
766
+ def __new__(self, *args, **kwargs) -> 'Expr': ...
758
767
 
759
- def _skip_batch_predicate(self, *args, **kwargs) -> 'Expr': ...
768
+ def __reduce__(self, *args, **kwargs) -> 'Expr': ...
760
769
 
761
- def __delattr__(self, *args, **kwargs) -> 'Expr': ...
770
+ def __setattr__(self, *args, **kwargs) -> 'Expr': ...
762
771
 
763
- def __reduce_ex__(self, *args, **kwargs) -> 'Expr': ...
772
+ def __subclasshook__(self, *args, **kwargs) -> 'Expr': ...
764
773
 
765
- def __new__(self, *args, **kwargs) -> 'Expr': ...
774
+ def _skip_batch_predicate(self, *args, **kwargs) -> 'Expr': ...
766
775
 
767
- def __reduce__(self, *args, **kwargs) -> 'Expr': ...
776
+ def __getattribute__(self, *args, **kwargs) -> 'Expr': ...
768
777
 
769
778
  def __class__(self, *args, **kwargs) -> 'Expr': ...
770
779
 
771
- def __sizeof__(self, *args, **kwargs) -> 'Expr': ...
780
+ def _from_pyexpr(self, *args, **kwargs) -> 'Expr': ...
772
781
 
773
- def __setstate__(self, *args, **kwargs) -> 'Expr': ...
782
+ def __bool__(self, *args, **kwargs) -> 'Expr': ...
774
783
 
775
- def __dir__(self, *args, **kwargs) -> 'Expr': ...
784
+ def __setstate__(self, *args, **kwargs) -> 'Expr': ...
776
785
 
777
- def __subclasshook__(self, *args, **kwargs) -> 'Expr': ...
786
+ def __format__(self, *args, **kwargs) -> 'Expr': ...
778
787
 
779
- def __pos__(self, *args, **kwargs) -> 'Expr': ...
788
+ def __getstate__(self, *args, **kwargs) -> 'Expr': ...
780
789
 
781
- def __rxor__(self, *args, **kwargs) -> 'Expr': ...
790
+ def __array_ufunc__(self, *args, **kwargs) -> 'Expr': ...
782
791
 
783
792
  def __xor__(self, *args, **kwargs) -> 'Expr': ...
784
793
 
785
- def __array_ufunc__(self, *args, **kwargs) -> 'Expr': ...
786
-
787
- def __rand__(self, *args, **kwargs) -> 'Expr': ...
794
+ def __reduce_ex__(self, *args, **kwargs) -> 'Expr': ...
788
795
 
789
- def __str__(self, *args, **kwargs) -> 'Expr': ...
796
+ def _repr_html_(self, *args, **kwargs) -> 'Expr': ...
790
797
 
791
- def __ror__(self, *args, **kwargs) -> 'Expr': ...
798
+ def __dir__(self, *args, **kwargs) -> 'Expr': ...
792
799
 
793
800
  def __abs__(self, *args, **kwargs) -> 'Expr': ...
794
801
 
795
- def __setattr__(self, *args, **kwargs) -> 'Expr': ...
802
+ def __ror__(self, *args, **kwargs) -> 'Expr': ...
796
803
 
797
- def __format__(self, *args, **kwargs) -> 'Expr': ...
804
+ def _map_batches_wrapper(self, *args, **kwargs) -> 'Expr': ...
798
805
 
799
- def __getattribute__(self, *args, **kwargs) -> 'Expr': ...
806
+ def __rand__(self, *args, **kwargs) -> 'Expr': ...
800
807
 
801
- def __getstate__(self, *args, **kwargs) -> 'Expr': ...
808
+ def __str__(self, *args, **kwargs) -> 'Expr': ...
809
+
810
+ def __delattr__(self, *args, **kwargs) -> 'Expr': ...
802
811
 
803
812
 
804
813
  class Column(Expr):
@@ -1005,7 +1014,7 @@ class Column(Expr):
1005
1014
  def cum_sum(self, reverse: bool=False) -> Expr: ...
1006
1015
 
1007
1016
  # Run an expression over a sliding window that increases `1` slot every iteration.
1008
- def cumulative_eval(self, expr: Expr, min_samples: int=1, parallel: bool=False) -> Expr: ...
1017
+ def cumulative_eval(self, expr: Expr, min_samples: int=1) -> Expr: ...
1009
1018
 
1010
1019
  # Bin continuous values into discrete categories.
1011
1020
  def cut(self, breaks: Sequence[float], labels: Sequence[str] | None=None, left_closed: bool=False, include_breaks: bool=False) -> Expr: ...
@@ -1017,7 +1026,7 @@ class Column(Expr):
1017
1026
  def deserialize(self, source: str | Path | IOBase | bytes, format: SerializationFormat='binary') -> Expr: ...
1018
1027
 
1019
1028
  # Calculate the first discrete difference between shifted items.
1020
- def diff(self, n: int=1, null_behavior: NullBehavior='ignore') -> Expr: ...
1029
+ def diff(self, n: int | IntoExpr=1, null_behavior: NullBehavior='ignore') -> Expr: ...
1021
1030
 
1022
1031
  # Compute the dot/inner product between two Expressions.
1023
1032
  def dot(self, other: Expr | str) -> Expr: ...
@@ -1122,7 +1131,7 @@ class Column(Expr):
1122
1131
  # Print the value that this expression evaluates to and pass on the value.
1123
1132
  def inspect(self, fmt: str='{}') -> Expr: ...
1124
1133
 
1125
- # Fill null values using interpolation.
1134
+ # Interpolate intermediate values.
1126
1135
  def interpolate(self, method: InterpolationMethod='linear') -> Expr: ...
1127
1136
 
1128
1137
  # Fill null values using interpolation based on another column.
@@ -1191,7 +1200,7 @@ class Column(Expr):
1191
1200
  def lt(self, other: Any) -> Expr: ...
1192
1201
 
1193
1202
  # Apply a custom python function to a whole Series or sequence of Series.
1194
- def map_batches(self, function: Callable[[Series], Series | Any], return_dtype: PolarsDataType | None=None, agg_list: bool=False, is_elementwise: bool=False, returns_scalar: bool=False) -> Expr: ...
1203
+ def map_batches(self, function: Callable[[Series], Series | Any], return_dtype: PolarsDataType | pl.DataTypeExpr | None=None, agg_list: bool=False, is_elementwise: bool=False, returns_scalar: bool=False) -> Expr: ...
1195
1204
 
1196
1205
  # Map a custom/user-defined function (UDF) to each element of a column.
1197
1206
  def map_elements(self, function: Callable[[Any], Any], return_dtype: PolarsDataType | None=None, skip_nulls: bool=True, pass_name: bool=False, strategy: MapElementsStrategy='thread_local', returns_scalar: bool=False) -> Expr: ...
@@ -1264,7 +1273,7 @@ class Column(Expr):
1264
1273
  def qcut(self, quantiles: Sequence[float] | int, labels: Sequence[str] | None=None, left_closed: bool=False, allow_duplicates: bool=False, include_breaks: bool=False) -> Expr: ...
1265
1274
 
1266
1275
  # Get quantile value.
1267
- def quantile(self, quantile: float | Expr, interpolation: RollingInterpolationMethod='nearest') -> Expr: ...
1276
+ def quantile(self, quantile: float | Expr, interpolation: QuantileMethod='nearest') -> Expr: ...
1268
1277
 
1269
1278
  # Convert from degrees to radians.
1270
1279
  def radians(self, ) -> Expr: ...
@@ -1288,7 +1297,7 @@ class Column(Expr):
1288
1297
  def replace(self, old: IntoExpr | Sequence[Any] | Mapping[Any, Any], new: IntoExpr | Sequence[Any], default: IntoExpr, return_dtype: PolarsDataType | None=None) -> Expr: ...
1289
1298
 
1290
1299
  # Replace all values by different values.
1291
- def replace_strict(self, old: IntoExpr | Sequence[Any] | Mapping[Any, Any], new: IntoExpr | Sequence[Any], default: IntoExpr, return_dtype: PolarsDataType | None=None) -> Expr: ...
1300
+ def replace_strict(self, old: IntoExpr | Sequence[Any] | Mapping[Any, Any], new: IntoExpr | Sequence[Any], default: IntoExpr, return_dtype: PolarsDataType | pl.DataTypeExpr | None=None) -> Expr: ...
1292
1301
 
1293
1302
  # Reshape this Expr to a flat column or an Array column.
1294
1303
  def reshape(self, dimensions: tuple[int, ...]) -> Expr: ...
@@ -1305,6 +1314,9 @@ class Column(Expr):
1305
1314
  # Create rolling groups based on a temporal or integer column.
1306
1315
  def rolling(self, index_column: str, period: str | timedelta, offset: str | timedelta | None=None, closed: ClosedInterval='right') -> Expr: ...
1307
1316
 
1317
+ # Compute a rolling kurtosis.
1318
+ def rolling_kurtosis(self, window_size: int, fisher: bool=True, bias: bool=True, min_samples: int | None=None, center: bool=False) -> Expr: ...
1319
+
1308
1320
  # Compute a custom rolling window function.
1309
1321
  def rolling_map(self, function: Callable[[Series], Any], window_size: int, weights: list[float] | None=None, min_samples: int | None=None, center: bool=False) -> Expr: ...
1310
1322
 
@@ -1333,13 +1345,13 @@ class Column(Expr):
1333
1345
  def rolling_min_by(self, by: IntoExpr, window_size: timedelta | str, min_samples: int=1, closed: ClosedInterval='right') -> Expr: ...
1334
1346
 
1335
1347
  # Compute a rolling quantile.
1336
- def rolling_quantile(self, quantile: float, interpolation: RollingInterpolationMethod='nearest', window_size: int=2, weights: list[float] | None=None, min_samples: int | None=None, center: bool=False) -> Expr: ...
1348
+ def rolling_quantile(self, quantile: float, interpolation: QuantileMethod='nearest', window_size: int=2, weights: list[float] | None=None, min_samples: int | None=None, center: bool=False) -> Expr: ...
1337
1349
 
1338
1350
  # Compute a rolling quantile based on another column.
1339
- def rolling_quantile_by(self, by: IntoExpr, window_size: timedelta | str, quantile: float, interpolation: RollingInterpolationMethod='nearest', min_samples: int=1, closed: ClosedInterval='right') -> Expr: ...
1351
+ def rolling_quantile_by(self, by: IntoExpr, window_size: timedelta | str, quantile: float, interpolation: QuantileMethod='nearest', min_samples: int=1, closed: ClosedInterval='right') -> Expr: ...
1340
1352
 
1341
1353
  # Compute a rolling skew.
1342
- def rolling_skew(self, window_size: int, bias: bool=True) -> Expr: ...
1354
+ def rolling_skew(self, window_size: int, bias: bool=True, min_samples: int | None=None, center: bool=False) -> Expr: ...
1343
1355
 
1344
1356
  # Compute a rolling standard deviation.
1345
1357
  def rolling_std(self, window_size: int, weights: list[float] | None=None, min_samples: int | None=None, center: bool=False, ddof: int=1) -> Expr: ...
@@ -1360,7 +1372,7 @@ class Column(Expr):
1360
1372
  def rolling_var_by(self, by: IntoExpr, window_size: timedelta | str, min_samples: int=1, closed: ClosedInterval='right', ddof: int=1) -> Expr: ...
1361
1373
 
1362
1374
  # Round underlying floating point data by `decimals` digits.
1363
- def round(self, decimals: int=0) -> Expr: ...
1375
+ def round(self, decimals: int=0, mode: RoundMode='half_to_even') -> Expr: ...
1364
1376
 
1365
1377
  # Round to a number of significant figures.
1366
1378
  def round_sig_figs(self, digits: int) -> Expr: ...
@@ -1369,7 +1381,7 @@ class Column(Expr):
1369
1381
  def sample(self, n: int | IntoExprColumn | None=None, fraction: float | IntoExprColumn | None=None, with_replacement: bool=False, shuffle: bool=False, seed: int | None=None) -> Expr: ...
1370
1382
 
1371
1383
  # Find indices where elements should be inserted to maintain order.
1372
- def search_sorted(self, element: IntoExpr | np.ndarray[Any, Any], side: SearchSortedSide='any') -> Expr: ...
1384
+ def search_sorted(self, element: IntoExpr | np.ndarray[Any, Any], side: SearchSortedSide='any', descending: bool=False) -> Expr: ...
1373
1385
 
1374
1386
  # Flags the expression as 'sorted'.
1375
1387
  def set_sorted(self, descending: bool=False) -> Expr: ...
@@ -1446,7 +1458,7 @@ class Column(Expr):
1446
1458
  # Calculate the upper bound.
1447
1459
  def upper_bound(self, ) -> Expr: ...
1448
1460
 
1449
- # Count the occurrences of unique values.
1461
+ # Count the occurrence of unique values.
1450
1462
  def value_counts(self, sort: bool=False, parallel: bool=False, name: str | None=None, normalize: bool=False) -> Expr: ...
1451
1463
 
1452
1464
  def var(self, ddof=1) -> Any: ...
@@ -1666,7 +1678,7 @@ class When(Expr):
1666
1678
  def cum_sum(self, reverse: bool=False) -> Expr: ...
1667
1679
 
1668
1680
  # Run an expression over a sliding window that increases `1` slot every iteration.
1669
- def cumulative_eval(self, expr: Expr, min_samples: int=1, parallel: bool=False) -> Expr: ...
1681
+ def cumulative_eval(self, expr: Expr, min_samples: int=1) -> Expr: ...
1670
1682
 
1671
1683
  # Bin continuous values into discrete categories.
1672
1684
  def cut(self, breaks: Sequence[float], labels: Sequence[str] | None=None, left_closed: bool=False, include_breaks: bool=False) -> Expr: ...
@@ -1678,7 +1690,7 @@ class When(Expr):
1678
1690
  def deserialize(self, source: str | Path | IOBase | bytes, format: SerializationFormat='binary') -> Expr: ...
1679
1691
 
1680
1692
  # Calculate the first discrete difference between shifted items.
1681
- def diff(self, n: int=1, null_behavior: NullBehavior='ignore') -> Expr: ...
1693
+ def diff(self, n: int | IntoExpr=1, null_behavior: NullBehavior='ignore') -> Expr: ...
1682
1694
 
1683
1695
  # Compute the dot/inner product between two Expressions.
1684
1696
  def dot(self, other: Expr | str) -> Expr: ...
@@ -1783,7 +1795,7 @@ class When(Expr):
1783
1795
  # Print the value that this expression evaluates to and pass on the value.
1784
1796
  def inspect(self, fmt: str='{}') -> Expr: ...
1785
1797
 
1786
- # Fill null values using interpolation.
1798
+ # Interpolate intermediate values.
1787
1799
  def interpolate(self, method: InterpolationMethod='linear') -> Expr: ...
1788
1800
 
1789
1801
  # Fill null values using interpolation based on another column.
@@ -1852,7 +1864,7 @@ class When(Expr):
1852
1864
  def lt(self, other: Any) -> Expr: ...
1853
1865
 
1854
1866
  # Apply a custom python function to a whole Series or sequence of Series.
1855
- def map_batches(self, function: Callable[[Series], Series | Any], return_dtype: PolarsDataType | None=None, agg_list: bool=False, is_elementwise: bool=False, returns_scalar: bool=False) -> Expr: ...
1867
+ def map_batches(self, function: Callable[[Series], Series | Any], return_dtype: PolarsDataType | pl.DataTypeExpr | None=None, agg_list: bool=False, is_elementwise: bool=False, returns_scalar: bool=False) -> Expr: ...
1856
1868
 
1857
1869
  # Map a custom/user-defined function (UDF) to each element of a column.
1858
1870
  def map_elements(self, function: Callable[[Any], Any], return_dtype: PolarsDataType | None=None, skip_nulls: bool=True, pass_name: bool=False, strategy: MapElementsStrategy='thread_local', returns_scalar: bool=False) -> Expr: ...
@@ -1928,7 +1940,7 @@ class When(Expr):
1928
1940
  def qcut(self, quantiles: Sequence[float] | int, labels: Sequence[str] | None=None, left_closed: bool=False, allow_duplicates: bool=False, include_breaks: bool=False) -> Expr: ...
1929
1941
 
1930
1942
  # Get quantile value.
1931
- def quantile(self, quantile: float | Expr, interpolation: RollingInterpolationMethod='nearest') -> Expr: ...
1943
+ def quantile(self, quantile: float | Expr, interpolation: QuantileMethod='nearest') -> Expr: ...
1932
1944
 
1933
1945
  # Convert from degrees to radians.
1934
1946
  def radians(self, ) -> Expr: ...
@@ -1952,7 +1964,7 @@ class When(Expr):
1952
1964
  def replace(self, old: IntoExpr | Sequence[Any] | Mapping[Any, Any], new: IntoExpr | Sequence[Any], default: IntoExpr, return_dtype: PolarsDataType | None=None) -> Expr: ...
1953
1965
 
1954
1966
  # Replace all values by different values.
1955
- def replace_strict(self, old: IntoExpr | Sequence[Any] | Mapping[Any, Any], new: IntoExpr | Sequence[Any], default: IntoExpr, return_dtype: PolarsDataType | None=None) -> Expr: ...
1967
+ def replace_strict(self, old: IntoExpr | Sequence[Any] | Mapping[Any, Any], new: IntoExpr | Sequence[Any], default: IntoExpr, return_dtype: PolarsDataType | pl.DataTypeExpr | None=None) -> Expr: ...
1956
1968
 
1957
1969
  # Reshape this Expr to a flat column or an Array column.
1958
1970
  def reshape(self, dimensions: tuple[int, ...]) -> Expr: ...
@@ -1969,6 +1981,9 @@ class When(Expr):
1969
1981
  # Create rolling groups based on a temporal or integer column.
1970
1982
  def rolling(self, index_column: str, period: str | timedelta, offset: str | timedelta | None=None, closed: ClosedInterval='right') -> Expr: ...
1971
1983
 
1984
+ # Compute a rolling kurtosis.
1985
+ def rolling_kurtosis(self, window_size: int, fisher: bool=True, bias: bool=True, min_samples: int | None=None, center: bool=False) -> Expr: ...
1986
+
1972
1987
  # Compute a custom rolling window function.
1973
1988
  def rolling_map(self, function: Callable[[Series], Any], window_size: int, weights: list[float] | None=None, min_samples: int | None=None, center: bool=False) -> Expr: ...
1974
1989
 
@@ -1997,13 +2012,13 @@ class When(Expr):
1997
2012
  def rolling_min_by(self, by: IntoExpr, window_size: timedelta | str, min_samples: int=1, closed: ClosedInterval='right') -> Expr: ...
1998
2013
 
1999
2014
  # Compute a rolling quantile.
2000
- def rolling_quantile(self, quantile: float, interpolation: RollingInterpolationMethod='nearest', window_size: int=2, weights: list[float] | None=None, min_samples: int | None=None, center: bool=False) -> Expr: ...
2015
+ def rolling_quantile(self, quantile: float, interpolation: QuantileMethod='nearest', window_size: int=2, weights: list[float] | None=None, min_samples: int | None=None, center: bool=False) -> Expr: ...
2001
2016
 
2002
2017
  # Compute a rolling quantile based on another column.
2003
- def rolling_quantile_by(self, by: IntoExpr, window_size: timedelta | str, quantile: float, interpolation: RollingInterpolationMethod='nearest', min_samples: int=1, closed: ClosedInterval='right') -> Expr: ...
2018
+ def rolling_quantile_by(self, by: IntoExpr, window_size: timedelta | str, quantile: float, interpolation: QuantileMethod='nearest', min_samples: int=1, closed: ClosedInterval='right') -> Expr: ...
2004
2019
 
2005
2020
  # Compute a rolling skew.
2006
- def rolling_skew(self, window_size: int, bias: bool=True) -> Expr: ...
2021
+ def rolling_skew(self, window_size: int, bias: bool=True, min_samples: int | None=None, center: bool=False) -> Expr: ...
2007
2022
 
2008
2023
  # Compute a rolling standard deviation.
2009
2024
  def rolling_std(self, window_size: int, weights: list[float] | None=None, min_samples: int | None=None, center: bool=False, ddof: int=1) -> Expr: ...
@@ -2024,7 +2039,7 @@ class When(Expr):
2024
2039
  def rolling_var_by(self, by: IntoExpr, window_size: timedelta | str, min_samples: int=1, closed: ClosedInterval='right', ddof: int=1) -> Expr: ...
2025
2040
 
2026
2041
  # Round underlying floating point data by `decimals` digits.
2027
- def round(self, decimals: int=0) -> Expr: ...
2042
+ def round(self, decimals: int=0, mode: RoundMode='half_to_even') -> Expr: ...
2028
2043
 
2029
2044
  # Round to a number of significant figures.
2030
2045
  def round_sig_figs(self, digits: int) -> Expr: ...
@@ -2033,7 +2048,7 @@ class When(Expr):
2033
2048
  def sample(self, n: int | IntoExprColumn | None=None, fraction: float | IntoExprColumn | None=None, with_replacement: bool=False, shuffle: bool=False, seed: int | None=None) -> Expr: ...
2034
2049
 
2035
2050
  # Find indices where elements should be inserted to maintain order.
2036
- def search_sorted(self, element: IntoExpr | np.ndarray[Any, Any], side: SearchSortedSide='any') -> Expr: ...
2051
+ def search_sorted(self, element: IntoExpr | np.ndarray[Any, Any], side: SearchSortedSide='any', descending: bool=False) -> Expr: ...
2037
2052
 
2038
2053
  # Flags the expression as 'sorted'.
2039
2054
  def set_sorted(self, descending: bool=False) -> Expr: ...
@@ -2110,7 +2125,7 @@ class When(Expr):
2110
2125
  # Calculate the upper bound.
2111
2126
  def upper_bound(self, ) -> Expr: ...
2112
2127
 
2113
- # Count the occurrences of unique values.
2128
+ # Count the occurrence of unique values.
2114
2129
  def value_counts(self, sort: bool=False, parallel: bool=False, name: str | None=None, normalize: bool=False) -> Expr: ...
2115
2130
 
2116
2131
  def var(self, ddof=1) -> Any: ...