polars-df 0.7.0 → 0.9.0

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.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +41 -0
  3. data/Cargo.lock +353 -237
  4. data/Cargo.toml +0 -3
  5. data/LICENSE.txt +1 -1
  6. data/README.md +2 -2
  7. data/ext/polars/Cargo.toml +17 -6
  8. data/ext/polars/src/batched_csv.rs +6 -7
  9. data/ext/polars/src/conversion/anyvalue.rs +185 -0
  10. data/ext/polars/src/conversion/chunked_array.rs +140 -0
  11. data/ext/polars/src/{conversion.rs → conversion/mod.rs} +268 -347
  12. data/ext/polars/src/dataframe.rs +96 -116
  13. data/ext/polars/src/expr/array.rs +74 -0
  14. data/ext/polars/src/expr/categorical.rs +8 -1
  15. data/ext/polars/src/expr/datetime.rs +22 -56
  16. data/ext/polars/src/expr/general.rs +124 -37
  17. data/ext/polars/src/expr/list.rs +52 -4
  18. data/ext/polars/src/expr/meta.rs +48 -0
  19. data/ext/polars/src/expr/rolling.rs +16 -10
  20. data/ext/polars/src/expr/string.rs +68 -17
  21. data/ext/polars/src/expr/struct.rs +8 -4
  22. data/ext/polars/src/functions/aggregation.rs +6 -0
  23. data/ext/polars/src/functions/lazy.rs +103 -48
  24. data/ext/polars/src/functions/meta.rs +45 -1
  25. data/ext/polars/src/functions/range.rs +5 -10
  26. data/ext/polars/src/functions/string_cache.rs +14 -0
  27. data/ext/polars/src/{lazyframe.rs → lazyframe/mod.rs} +166 -41
  28. data/ext/polars/src/lib.rs +245 -187
  29. data/ext/polars/src/map/dataframe.rs +1 -1
  30. data/ext/polars/src/map/mod.rs +2 -2
  31. data/ext/polars/src/map/series.rs +6 -6
  32. data/ext/polars/src/object.rs +0 -30
  33. data/ext/polars/src/on_startup.rs +32 -0
  34. data/ext/polars/src/series/aggregation.rs +23 -0
  35. data/ext/polars/src/series/construction.rs +1 -1
  36. data/ext/polars/src/series/export.rs +2 -2
  37. data/ext/polars/src/{series.rs → series/mod.rs} +45 -21
  38. data/ext/polars/src/series/{set_at_idx.rs → scatter.rs} +18 -18
  39. data/ext/polars/src/utils.rs +1 -1
  40. data/lib/polars/array_expr.rb +449 -0
  41. data/lib/polars/array_name_space.rb +346 -0
  42. data/lib/polars/cat_expr.rb +24 -0
  43. data/lib/polars/cat_name_space.rb +75 -0
  44. data/lib/polars/config.rb +2 -2
  45. data/lib/polars/data_frame.rb +248 -108
  46. data/lib/polars/data_types.rb +195 -29
  47. data/lib/polars/date_time_expr.rb +41 -24
  48. data/lib/polars/date_time_name_space.rb +12 -12
  49. data/lib/polars/exceptions.rb +12 -1
  50. data/lib/polars/expr.rb +1080 -195
  51. data/lib/polars/functions/aggregation/horizontal.rb +246 -0
  52. data/lib/polars/functions/aggregation/vertical.rb +282 -0
  53. data/lib/polars/functions/as_datatype.rb +248 -0
  54. data/lib/polars/functions/col.rb +47 -0
  55. data/lib/polars/functions/eager.rb +182 -0
  56. data/lib/polars/functions/lazy.rb +1280 -0
  57. data/lib/polars/functions/len.rb +49 -0
  58. data/lib/polars/functions/lit.rb +35 -0
  59. data/lib/polars/functions/random.rb +16 -0
  60. data/lib/polars/functions/range/date_range.rb +103 -0
  61. data/lib/polars/functions/range/int_range.rb +51 -0
  62. data/lib/polars/functions/repeat.rb +144 -0
  63. data/lib/polars/functions/whenthen.rb +27 -0
  64. data/lib/polars/functions.rb +29 -416
  65. data/lib/polars/group_by.rb +3 -3
  66. data/lib/polars/io.rb +21 -28
  67. data/lib/polars/lazy_frame.rb +390 -76
  68. data/lib/polars/list_expr.rb +152 -6
  69. data/lib/polars/list_name_space.rb +102 -0
  70. data/lib/polars/meta_expr.rb +175 -7
  71. data/lib/polars/series.rb +557 -59
  72. data/lib/polars/sql_context.rb +1 -1
  73. data/lib/polars/string_cache.rb +75 -0
  74. data/lib/polars/string_expr.rb +412 -96
  75. data/lib/polars/string_name_space.rb +4 -4
  76. data/lib/polars/struct_expr.rb +1 -1
  77. data/lib/polars/struct_name_space.rb +1 -1
  78. data/lib/polars/testing.rb +507 -0
  79. data/lib/polars/utils.rb +64 -20
  80. data/lib/polars/version.rb +1 -1
  81. data/lib/polars.rb +15 -2
  82. metadata +40 -9
  83. data/lib/polars/lazy_functions.rb +0 -1197
@@ -1,3 +1,5 @@
1
+ use std::ops::Neg;
2
+
1
3
  use magnus::{prelude::*, value::Opaque, IntoValue, RArray, Ruby, Value};
2
4
  use polars::lazy::dsl;
3
5
  use polars::prelude::*;
@@ -11,55 +13,67 @@ use crate::utils::reinterpret;
11
13
  use crate::{RbExpr, RbResult};
12
14
 
13
15
  impl RbExpr {
14
- pub fn add(&self, rhs: &RbExpr) -> RbResult<Self> {
16
+ pub fn add(&self, rhs: &Self) -> RbResult<Self> {
15
17
  Ok(dsl::binary_expr(self.inner.clone(), Operator::Plus, rhs.inner.clone()).into())
16
18
  }
17
19
 
18
- pub fn sub(&self, rhs: &RbExpr) -> RbResult<Self> {
20
+ pub fn sub(&self, rhs: &Self) -> RbResult<Self> {
19
21
  Ok(dsl::binary_expr(self.inner.clone(), Operator::Minus, rhs.inner.clone()).into())
20
22
  }
21
23
 
22
- pub fn mul(&self, rhs: &RbExpr) -> RbResult<Self> {
24
+ pub fn mul(&self, rhs: &Self) -> RbResult<Self> {
23
25
  Ok(dsl::binary_expr(self.inner.clone(), Operator::Multiply, rhs.inner.clone()).into())
24
26
  }
25
27
 
26
- pub fn truediv(&self, rhs: &RbExpr) -> RbResult<Self> {
28
+ pub fn truediv(&self, rhs: &Self) -> RbResult<Self> {
27
29
  Ok(dsl::binary_expr(self.inner.clone(), Operator::TrueDivide, rhs.inner.clone()).into())
28
30
  }
29
31
 
30
- pub fn _mod(&self, rhs: &RbExpr) -> RbResult<Self> {
32
+ pub fn _mod(&self, rhs: &Self) -> RbResult<Self> {
31
33
  Ok(dsl::binary_expr(self.inner.clone(), Operator::Modulus, rhs.inner.clone()).into())
32
34
  }
33
35
 
34
- pub fn floordiv(&self, rhs: &RbExpr) -> RbResult<Self> {
36
+ pub fn floordiv(&self, rhs: &Self) -> RbResult<Self> {
35
37
  Ok(dsl::binary_expr(self.inner.clone(), Operator::FloorDivide, rhs.inner.clone()).into())
36
38
  }
37
39
 
40
+ pub fn neg(&self) -> RbResult<Self> {
41
+ Ok(self.inner.clone().neg().into())
42
+ }
43
+
38
44
  pub fn to_str(&self) -> String {
39
45
  format!("{:?}", self.inner)
40
46
  }
41
47
 
42
- pub fn eq(&self, other: &RbExpr) -> Self {
48
+ pub fn eq(&self, other: &Self) -> Self {
43
49
  self.clone().inner.eq(other.inner.clone()).into()
44
50
  }
45
51
 
46
- pub fn neq(&self, other: &RbExpr) -> Self {
52
+ pub fn eq_missing(&self, other: &Self) -> Self {
53
+ self.inner.clone().eq_missing(other.inner.clone()).into()
54
+ }
55
+
56
+ pub fn neq(&self, other: &Self) -> Self {
47
57
  self.clone().inner.neq(other.inner.clone()).into()
48
58
  }
49
59
 
50
- pub fn gt(&self, other: &RbExpr) -> Self {
60
+ pub fn neq_missing(&self, other: &Self) -> Self {
61
+ self.inner.clone().neq_missing(other.inner.clone()).into()
62
+ }
63
+
64
+ pub fn gt(&self, other: &Self) -> Self {
51
65
  self.clone().inner.gt(other.inner.clone()).into()
52
66
  }
53
67
 
54
- pub fn gt_eq(&self, other: &RbExpr) -> Self {
68
+ pub fn gt_eq(&self, other: &Self) -> Self {
55
69
  self.clone().inner.gt_eq(other.inner.clone()).into()
56
70
  }
57
71
 
58
- pub fn lt_eq(&self, other: &RbExpr) -> Self {
72
+ pub fn lt_eq(&self, other: &Self) -> Self {
59
73
  self.clone().inner.lt_eq(other.inner.clone()).into()
60
74
  }
61
75
 
62
- pub fn lt(&self, other: &RbExpr) -> Self {
76
+ pub fn lt(&self, other: &Self) -> Self {
63
77
  self.clone().inner.lt(other.inner.clone()).into()
64
78
  }
65
79
 
@@ -67,7 +81,7 @@ impl RbExpr {
67
81
  self.clone().inner.alias(&name).into()
68
82
  }
69
83
 
70
- pub fn is_not(&self) -> Self {
84
+ pub fn not_(&self) -> Self {
71
85
  self.clone().inner.not().into()
72
86
  }
73
87
 
@@ -151,23 +165,78 @@ impl RbExpr {
151
165
  self.clone().inner.implode().into()
152
166
  }
153
167
 
154
- pub fn quantile(
155
- &self,
156
- quantile: &RbExpr,
157
- interpolation: Wrap<QuantileInterpolOptions>,
158
- ) -> Self {
168
+ pub fn quantile(&self, quantile: &Self, interpolation: Wrap<QuantileInterpolOptions>) -> Self {
159
169
  self.clone()
160
170
  .inner
161
171
  .quantile(quantile.inner.clone(), interpolation.0)
162
172
  .into()
163
173
  }
164
174
 
175
+ pub fn cut(
176
+ &self,
177
+ breaks: Vec<f64>,
178
+ labels: Option<Vec<String>>,
179
+ left_closed: bool,
180
+ include_breaks: bool,
181
+ ) -> Self {
182
+ self.inner
183
+ .clone()
184
+ .cut(breaks, labels, left_closed, include_breaks)
185
+ .into()
186
+ }
187
+
188
+ pub fn qcut(
189
+ &self,
190
+ probs: Vec<f64>,
191
+ labels: Option<Vec<String>>,
192
+ left_closed: bool,
193
+ allow_duplicates: bool,
194
+ include_breaks: bool,
195
+ ) -> Self {
196
+ self.inner
197
+ .clone()
198
+ .qcut(probs, labels, left_closed, allow_duplicates, include_breaks)
199
+ .into()
200
+ }
201
+
202
+ pub fn qcut_uniform(
203
+ &self,
204
+ n_bins: usize,
205
+ labels: Option<Vec<String>>,
206
+ left_closed: bool,
207
+ allow_duplicates: bool,
208
+ include_breaks: bool,
209
+ ) -> Self {
210
+ self.inner
211
+ .clone()
212
+ .qcut_uniform(
213
+ n_bins,
214
+ labels,
215
+ left_closed,
216
+ allow_duplicates,
217
+ include_breaks,
218
+ )
219
+ .into()
220
+ }
221
+
222
+ pub fn rle(&self) -> Self {
223
+ self.inner.clone().rle().into()
224
+ }
225
+
226
+ pub fn rle_id(&self) -> Self {
227
+ self.inner.clone().rle_id().into()
228
+ }
229
+
165
230
  pub fn agg_groups(&self) -> Self {
166
- self.clone().inner.agg_groups().into()
231
+ self.inner.clone().agg_groups().into()
167
232
  }
168
233
 
169
234
  pub fn count(&self) -> Self {
170
- self.clone().inner.count().into()
235
+ self.inner.clone().count().into()
236
+ }
237
+
238
+ pub fn len(&self) -> Self {
239
+ self.inner.clone().len().into()
171
240
  }
172
241
 
173
242
  pub fn value_counts(&self, multithreaded: bool, sorted: bool) -> Self {
@@ -243,14 +312,14 @@ impl RbExpr {
243
312
  self.clone().inner.arg_min().into()
244
313
  }
245
314
 
246
- pub fn search_sorted(&self, element: &RbExpr, side: Wrap<SearchSortedSide>) -> Self {
315
+ pub fn search_sorted(&self, element: &Self, side: Wrap<SearchSortedSide>) -> Self {
247
316
  self.inner
248
317
  .clone()
249
318
  .search_sorted(element.inner.clone(), side.0)
250
319
  .into()
251
320
  }
252
321
 
253
- pub fn gather(&self, idx: &RbExpr) -> Self {
322
+ pub fn gather(&self, idx: &Self) -> Self {
254
323
  self.clone().inner.gather(idx.inner.clone()).into()
255
324
  }
256
325
 
@@ -276,7 +345,7 @@ impl RbExpr {
276
345
  out.into()
277
346
  }
278
347
 
279
- pub fn fill_null(&self, expr: &RbExpr) -> Self {
348
+ pub fn fill_null(&self, expr: &Self) -> Self {
280
349
  self.clone().inner.fill_null(expr.inner.clone()).into()
281
350
  }
282
351
 
@@ -297,7 +366,7 @@ impl RbExpr {
297
366
  .into())
298
367
  }
299
368
 
300
- pub fn fill_nan(&self, expr: &RbExpr) -> Self {
369
+ pub fn fill_nan(&self, expr: &Self) -> Self {
301
370
  self.inner.clone().fill_nan(expr.inner.clone()).into()
302
371
  }
303
372
 
@@ -309,7 +378,7 @@ impl RbExpr {
309
378
  self.inner.clone().drop_nans().into()
310
379
  }
311
380
 
312
- pub fn filter(&self, predicate: &RbExpr) -> Self {
381
+ pub fn filter(&self, predicate: &Self) -> Self {
313
382
  self.clone().inner.filter(predicate.inner.clone()).into()
314
383
  }
315
384
 
@@ -345,11 +414,11 @@ impl RbExpr {
345
414
  self.clone().inner.explode().into()
346
415
  }
347
416
 
348
- pub fn gather_every(&self, n: usize) -> Self {
417
+ pub fn gather_every(&self, n: usize, offset: usize) -> Self {
349
418
  self.clone()
350
419
  .inner
351
420
  .map(
352
- move |s: Series| Ok(Some(s.gather_every(n))),
421
+ move |s: Series| Ok(Some(s.gather_every(n, offset))),
353
422
  GetOutput::same_type(),
354
423
  )
355
424
  .with_fmt("gather_every")
@@ -364,14 +433,14 @@ impl RbExpr {
364
433
  self.clone().inner.head(n).into()
365
434
  }
366
435
 
367
- pub fn slice(&self, offset: &RbExpr, length: &RbExpr) -> Self {
436
+ pub fn slice(&self, offset: &Self, length: &Self) -> Self {
368
437
  self.inner
369
438
  .clone()
370
439
  .slice(offset.inner.clone(), length.inner.clone())
371
440
  .into()
372
441
  }
373
442
 
374
- pub fn append(&self, other: &RbExpr, upcast: bool) -> Self {
443
+ pub fn append(&self, other: &Self, upcast: bool) -> Self {
375
444
  self.inner
376
445
  .clone()
377
446
  .append(other.inner.clone(), upcast)
@@ -473,27 +542,27 @@ impl RbExpr {
473
542
  Ok(self.clone().inner.over(partition_by).into())
474
543
  }
475
544
 
476
- pub fn _and(&self, expr: &RbExpr) -> Self {
545
+ pub fn _and(&self, expr: &Self) -> Self {
477
546
  self.clone().inner.and(expr.inner.clone()).into()
478
547
  }
479
548
 
480
- pub fn _xor(&self, expr: &RbExpr) -> Self {
549
+ pub fn _xor(&self, expr: &Self) -> Self {
481
550
  self.clone().inner.xor(expr.inner.clone()).into()
482
551
  }
483
552
 
484
- pub fn _or(&self, expr: &RbExpr) -> Self {
553
+ pub fn _or(&self, expr: &Self) -> Self {
485
554
  self.clone().inner.or(expr.inner.clone()).into()
486
555
  }
487
556
 
488
- pub fn is_in(&self, expr: &RbExpr) -> Self {
557
+ pub fn is_in(&self, expr: &Self) -> Self {
489
558
  self.clone().inner.is_in(expr.inner.clone()).into()
490
559
  }
491
560
 
492
- pub fn repeat_by(&self, by: &RbExpr) -> Self {
561
+ pub fn repeat_by(&self, by: &Self) -> Self {
493
562
  self.clone().inner.repeat_by(by.inner.clone()).into()
494
563
  }
495
564
 
496
- pub fn pow(&self, exponent: &RbExpr) -> Self {
565
+ pub fn pow(&self, exponent: &Self) -> Self {
497
566
  self.clone().inner.pow(exponent.inner.clone()).into()
498
567
  }
499
568
 
@@ -525,7 +594,7 @@ impl RbExpr {
525
594
  map_single(self, lambda, output_type, agg_list)
526
595
  }
527
596
 
528
- pub fn dot(&self, other: &RbExpr) -> Self {
597
+ pub fn dot(&self, other: &Self) -> Self {
529
598
  self.inner.clone().dot(other.inner.clone()).into()
530
599
  }
531
600
 
@@ -562,7 +631,7 @@ impl RbExpr {
562
631
  self.inner.clone().upper_bound().into()
563
632
  }
564
633
 
565
- pub fn cumulative_eval(&self, expr: &RbExpr, min_periods: usize, parallel: bool) -> Self {
634
+ pub fn cumulative_eval(&self, expr: &Self, min_periods: usize, parallel: bool) -> Self {
566
635
  self.inner
567
636
  .clone()
568
637
  .cumulative_eval(expr.inner.clone(), min_periods, parallel)
@@ -744,4 +813,22 @@ impl RbExpr {
744
813
  };
745
814
  self.inner.clone().set_sorted_flag(is_sorted).into()
746
815
  }
816
+
817
+ pub fn replace(
818
+ &self,
819
+ old: &Self,
820
+ new: &Self,
821
+ default: Option<&Self>,
822
+ return_dtype: Option<Wrap<DataType>>,
823
+ ) -> Self {
824
+ self.inner
825
+ .clone()
826
+ .replace(
827
+ old.inner.clone(),
828
+ new.inner.clone(),
829
+ default.map(|e| e.inner.clone()),
830
+ return_dtype.map(|dt| dt.0),
831
+ )
832
+ .into()
833
+ }
747
834
  }
@@ -7,6 +7,14 @@ use crate::conversion::Wrap;
7
7
  use crate::{RbExpr, RbResult};
8
8
 
9
9
  impl RbExpr {
10
+ pub fn list_all(&self) -> Self {
11
+ self.inner.clone().list().all().into()
12
+ }
13
+
14
+ pub fn list_any(&self) -> Self {
15
+ self.inner.clone().list().any().into()
16
+ }
17
+
10
18
  pub fn list_arg_max(&self) -> Self {
11
19
  self.inner.clone().list().arg_max().into()
12
20
  }
@@ -47,11 +55,11 @@ impl RbExpr {
47
55
  self.inner.clone().list().get(index.inner.clone()).into()
48
56
  }
49
57
 
50
- pub fn list_join(&self, separator: &RbExpr) -> Self {
58
+ pub fn list_join(&self, separator: &RbExpr, ignore_nulls: bool) -> Self {
51
59
  self.inner
52
60
  .clone()
53
61
  .list()
54
- .join(separator.inner.clone())
62
+ .join(separator.inner.clone(), ignore_nulls)
55
63
  .into()
56
64
  }
57
65
 
@@ -100,6 +108,10 @@ impl RbExpr {
100
108
  .into()
101
109
  }
102
110
 
111
+ pub fn list_tail(&self, n: &RbExpr) -> Self {
112
+ self.inner.clone().list().tail(n.inner.clone()).into()
113
+ }
114
+
103
115
  pub fn list_sort(&self, reverse: bool) -> Self {
104
116
  self.inner
105
117
  .clone()
@@ -116,14 +128,50 @@ impl RbExpr {
116
128
  self.inner.clone().list().sum().with_fmt("list.sum").into()
117
129
  }
118
130
 
119
- pub fn list_take(&self, index: &RbExpr, null_on_oob: bool) -> Self {
131
+ pub fn list_drop_nulls(&self) -> Self {
132
+ self.inner.clone().list().drop_nulls().into()
133
+ }
134
+
135
+ pub fn list_sample_n(
136
+ &self,
137
+ n: &RbExpr,
138
+ with_replacement: bool,
139
+ shuffle: bool,
140
+ seed: Option<u64>,
141
+ ) -> Self {
142
+ self.inner
143
+ .clone()
144
+ .list()
145
+ .sample_n(n.inner.clone(), with_replacement, shuffle, seed)
146
+ .into()
147
+ }
148
+
149
+ pub fn list_sample_fraction(
150
+ &self,
151
+ fraction: &RbExpr,
152
+ with_replacement: bool,
153
+ shuffle: bool,
154
+ seed: Option<u64>,
155
+ ) -> Self {
156
+ self.inner
157
+ .clone()
158
+ .list()
159
+ .sample_fraction(fraction.inner.clone(), with_replacement, shuffle, seed)
160
+ .into()
161
+ }
162
+
163
+ pub fn list_gather(&self, index: &RbExpr, null_on_oob: bool) -> Self {
120
164
  self.inner
121
165
  .clone()
122
166
  .list()
123
- .take(index.inner.clone(), null_on_oob)
167
+ .gather(index.inner.clone(), null_on_oob)
124
168
  .into()
125
169
  }
126
170
 
171
+ pub fn list_to_array(&self, width: usize) -> Self {
172
+ self.inner.clone().list().to_array(width).into()
173
+ }
174
+
127
175
  pub fn list_to_struct(
128
176
  &self,
129
177
  width_strat: Wrap<ListToStructWidthStrategy>,
@@ -46,7 +46,55 @@ impl RbExpr {
46
46
  self.inner.clone().meta().has_multiple_outputs()
47
47
  }
48
48
 
49
+ pub fn meta_is_column(&self) -> bool {
50
+ self.inner.clone().meta().is_column()
51
+ }
52
+
49
53
  pub fn meta_is_regex_projection(&self) -> bool {
50
54
  self.inner.clone().meta().is_regex_projection()
51
55
  }
56
+
57
+ pub fn _meta_selector_add(&self, other: &RbExpr) -> RbResult<RbExpr> {
58
+ let out = self
59
+ .inner
60
+ .clone()
61
+ .meta()
62
+ ._selector_add(other.inner.clone())
63
+ .map_err(RbPolarsErr::from)?;
64
+ Ok(out.into())
65
+ }
66
+
67
+ pub fn _meta_selector_sub(&self, other: &RbExpr) -> RbResult<RbExpr> {
68
+ let out = self
69
+ .inner
70
+ .clone()
71
+ .meta()
72
+ ._selector_sub(other.inner.clone())
73
+ .map_err(RbPolarsErr::from)?;
74
+ Ok(out.into())
75
+ }
76
+
77
+ pub fn _meta_selector_and(&self, other: &RbExpr) -> RbResult<RbExpr> {
78
+ let out = self
79
+ .inner
80
+ .clone()
81
+ .meta()
82
+ ._selector_and(other.inner.clone())
83
+ .map_err(RbPolarsErr::from)?;
84
+ Ok(out.into())
85
+ }
86
+
87
+ pub fn _meta_as_selector(&self) -> RbExpr {
88
+ self.inner.clone().meta()._into_selector().into()
89
+ }
90
+
91
+ pub fn meta_tree_format(&self) -> RbResult<String> {
92
+ let e = self
93
+ .inner
94
+ .clone()
95
+ .meta()
96
+ .into_tree_formatter()
97
+ .map_err(RbPolarsErr::from)?;
98
+ Ok(format!("{e}"))
99
+ }
52
100
  }
@@ -100,6 +100,7 @@ impl RbExpr {
100
100
  by: Option<String>,
101
101
  closed: Option<Wrap<ClosedWindow>>,
102
102
  ddof: u8,
103
+ warn_if_unsorted: bool,
103
104
  ) -> Self {
104
105
  let options = RollingOptions {
105
106
  window_size: Duration::parse(&window_size),
@@ -109,6 +110,7 @@ impl RbExpr {
109
110
  by,
110
111
  closed_window: closed.map(|c| c.0),
111
112
  fn_params: Some(Arc::new(RollingVarParams { ddof }) as Arc<dyn Any + Send + Sync>),
113
+ warn_if_unsorted,
112
114
  };
113
115
 
114
116
  self.inner.clone().rolling_std(options).into()
@@ -124,6 +126,7 @@ impl RbExpr {
124
126
  by: Option<String>,
125
127
  closed: Option<Wrap<ClosedWindow>>,
126
128
  ddof: u8,
129
+ warn_if_unsorted: bool,
127
130
  ) -> Self {
128
131
  let options = RollingOptions {
129
132
  window_size: Duration::parse(&window_size),
@@ -133,11 +136,13 @@ impl RbExpr {
133
136
  by,
134
137
  closed_window: closed.map(|c| c.0),
135
138
  fn_params: Some(Arc::new(RollingVarParams { ddof }) as Arc<dyn Any + Send + Sync>),
139
+ warn_if_unsorted,
136
140
  };
137
141
 
138
142
  self.inner.clone().rolling_var(options).into()
139
143
  }
140
144
 
145
+ #[allow(clippy::too_many_arguments)]
141
146
  pub fn rolling_median(
142
147
  &self,
143
148
  window_size: String,
@@ -146,6 +151,7 @@ impl RbExpr {
146
151
  center: bool,
147
152
  by: Option<String>,
148
153
  closed: Option<Wrap<ClosedWindow>>,
154
+ warn_if_unsorted: bool,
149
155
  ) -> Self {
150
156
  let options = RollingOptions {
151
157
  window_size: Duration::parse(&window_size),
@@ -154,12 +160,10 @@ impl RbExpr {
154
160
  center,
155
161
  by,
156
162
  closed_window: closed.map(|c| c.0),
157
- fn_params: Some(Arc::new(RollingQuantileParams {
158
- prob: 0.5,
159
- interpol: QuantileInterpolOptions::Linear,
160
- }) as Arc<dyn Any + Send + Sync>),
163
+ fn_params: None,
164
+ warn_if_unsorted,
161
165
  };
162
- self.inner.clone().rolling_quantile(options).into()
166
+ self.inner.clone().rolling_median(options).into()
163
167
  }
164
168
 
165
169
  #[allow(clippy::too_many_arguments)]
@@ -173,6 +177,7 @@ impl RbExpr {
173
177
  center: bool,
174
178
  by: Option<String>,
175
179
  closed: Option<Wrap<ClosedWindow>>,
180
+ warn_if_unsorted: bool,
176
181
  ) -> Self {
177
182
  let options = RollingOptions {
178
183
  window_size: Duration::parse(&window_size),
@@ -181,13 +186,14 @@ impl RbExpr {
181
186
  center,
182
187
  by,
183
188
  closed_window: closed.map(|c| c.0),
184
- fn_params: Some(Arc::new(RollingQuantileParams {
185
- prob: quantile,
186
- interpol: interpolation.0,
187
- }) as Arc<dyn Any + Send + Sync>),
189
+ fn_params: None,
190
+ warn_if_unsorted,
188
191
  };
189
192
 
190
- self.inner.clone().rolling_quantile(options).into()
193
+ self.inner
194
+ .clone()
195
+ .rolling_quantile(interpolation.0, quantile, options)
196
+ .into()
191
197
  }
192
198
 
193
199
  pub fn rolling_skew(&self, window_size: usize, bias: bool) -> Self {