polars-df 0.7.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
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 {