polars-df 0.8.0 → 0.10.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 (76) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +42 -1
  3. data/Cargo.lock +159 -66
  4. data/Cargo.toml +0 -3
  5. data/LICENSE.txt +1 -1
  6. data/README.md +3 -2
  7. data/ext/polars/Cargo.toml +18 -8
  8. data/ext/polars/src/batched_csv.rs +7 -5
  9. data/ext/polars/src/conversion/anyvalue.rs +186 -0
  10. data/ext/polars/src/conversion/chunked_array.rs +140 -0
  11. data/ext/polars/src/{conversion.rs → conversion/mod.rs} +273 -342
  12. data/ext/polars/src/dataframe.rs +108 -66
  13. data/ext/polars/src/expr/array.rs +78 -0
  14. data/ext/polars/src/expr/datetime.rs +29 -58
  15. data/ext/polars/src/expr/general.rs +83 -36
  16. data/ext/polars/src/expr/list.rs +58 -6
  17. data/ext/polars/src/expr/meta.rs +48 -0
  18. data/ext/polars/src/expr/rolling.rs +1 -0
  19. data/ext/polars/src/expr/string.rs +62 -11
  20. data/ext/polars/src/expr/struct.rs +8 -4
  21. data/ext/polars/src/file.rs +158 -11
  22. data/ext/polars/src/functions/aggregation.rs +6 -0
  23. data/ext/polars/src/functions/lazy.rs +120 -50
  24. data/ext/polars/src/functions/meta.rs +45 -1
  25. data/ext/polars/src/functions/string_cache.rs +14 -0
  26. data/ext/polars/src/functions/whenthen.rs +47 -17
  27. data/ext/polars/src/{lazyframe.rs → lazyframe/mod.rs} +195 -40
  28. data/ext/polars/src/lib.rs +246 -179
  29. data/ext/polars/src/map/dataframe.rs +17 -9
  30. data/ext/polars/src/series/aggregation.rs +20 -0
  31. data/ext/polars/src/series/mod.rs +35 -4
  32. data/lib/polars/array_expr.rb +453 -0
  33. data/lib/polars/array_name_space.rb +346 -0
  34. data/lib/polars/batched_csv_reader.rb +4 -2
  35. data/lib/polars/cat_expr.rb +24 -0
  36. data/lib/polars/cat_name_space.rb +75 -0
  37. data/lib/polars/config.rb +2 -2
  38. data/lib/polars/data_frame.rb +306 -96
  39. data/lib/polars/data_types.rb +191 -28
  40. data/lib/polars/date_time_expr.rb +41 -18
  41. data/lib/polars/date_time_name_space.rb +9 -3
  42. data/lib/polars/exceptions.rb +12 -1
  43. data/lib/polars/expr.rb +898 -215
  44. data/lib/polars/functions/aggregation/horizontal.rb +246 -0
  45. data/lib/polars/functions/aggregation/vertical.rb +282 -0
  46. data/lib/polars/functions/as_datatype.rb +248 -0
  47. data/lib/polars/functions/col.rb +47 -0
  48. data/lib/polars/functions/eager.rb +182 -0
  49. data/lib/polars/functions/lazy.rb +1280 -0
  50. data/lib/polars/functions/len.rb +49 -0
  51. data/lib/polars/functions/lit.rb +35 -0
  52. data/lib/polars/functions/random.rb +16 -0
  53. data/lib/polars/functions/range/date_range.rb +103 -0
  54. data/lib/polars/functions/range/int_range.rb +51 -0
  55. data/lib/polars/functions/repeat.rb +144 -0
  56. data/lib/polars/functions/whenthen.rb +96 -0
  57. data/lib/polars/functions.rb +29 -416
  58. data/lib/polars/group_by.rb +2 -2
  59. data/lib/polars/io.rb +36 -31
  60. data/lib/polars/lazy_frame.rb +405 -88
  61. data/lib/polars/list_expr.rb +158 -8
  62. data/lib/polars/list_name_space.rb +102 -0
  63. data/lib/polars/meta_expr.rb +175 -7
  64. data/lib/polars/series.rb +282 -41
  65. data/lib/polars/string_cache.rb +75 -0
  66. data/lib/polars/string_expr.rb +413 -96
  67. data/lib/polars/string_name_space.rb +4 -4
  68. data/lib/polars/testing.rb +507 -0
  69. data/lib/polars/utils.rb +106 -8
  70. data/lib/polars/version.rb +1 -1
  71. data/lib/polars/whenthen.rb +83 -0
  72. data/lib/polars.rb +16 -4
  73. metadata +37 -8
  74. data/lib/polars/lazy_functions.rb +0 -1181
  75. data/lib/polars/when.rb +0 -16
  76. data/lib/polars/when_then.rb +0 -19
@@ -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,11 +165,7 @@ 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)
@@ -257,7 +267,7 @@ impl RbExpr {
257
267
  pub fn sort_with(&self, descending: bool, nulls_last: bool) -> Self {
258
268
  self.clone()
259
269
  .inner
260
- .sort_with(SortOptions {
270
+ .sort(SortOptions {
261
271
  descending,
262
272
  nulls_last,
263
273
  multithreaded: true,
@@ -302,20 +312,39 @@ impl RbExpr {
302
312
  self.clone().inner.arg_min().into()
303
313
  }
304
314
 
305
- pub fn search_sorted(&self, element: &RbExpr, side: Wrap<SearchSortedSide>) -> Self {
315
+ pub fn search_sorted(&self, element: &Self, side: Wrap<SearchSortedSide>) -> Self {
306
316
  self.inner
307
317
  .clone()
308
318
  .search_sorted(element.inner.clone(), side.0)
309
319
  .into()
310
320
  }
311
321
 
312
- pub fn gather(&self, idx: &RbExpr) -> Self {
322
+ pub fn gather(&self, idx: &Self) -> Self {
313
323
  self.clone().inner.gather(idx.inner.clone()).into()
314
324
  }
315
325
 
316
- pub fn sort_by(&self, by: RArray, reverse: Vec<bool>) -> RbResult<Self> {
326
+ pub fn sort_by(
327
+ &self,
328
+ by: RArray,
329
+ descending: Vec<bool>,
330
+ nulls_last: bool,
331
+ multithreaded: bool,
332
+ maintain_order: bool,
333
+ ) -> RbResult<Self> {
317
334
  let by = rb_exprs_to_exprs(by)?;
318
- Ok(self.clone().inner.sort_by(by, reverse).into())
335
+ Ok(self
336
+ .clone()
337
+ .inner
338
+ .sort_by(
339
+ by,
340
+ SortMultipleOptions {
341
+ descending,
342
+ nulls_last,
343
+ multithreaded,
344
+ maintain_order,
345
+ },
346
+ )
347
+ .into())
319
348
  }
320
349
 
321
350
  pub fn backward_fill(&self, limit: FillNullLimit) -> Self {
@@ -335,7 +364,7 @@ impl RbExpr {
335
364
  out.into()
336
365
  }
337
366
 
338
- pub fn fill_null(&self, expr: &RbExpr) -> Self {
367
+ pub fn fill_null(&self, expr: &Self) -> Self {
339
368
  self.clone().inner.fill_null(expr.inner.clone()).into()
340
369
  }
341
370
 
@@ -356,7 +385,7 @@ impl RbExpr {
356
385
  .into())
357
386
  }
358
387
 
359
- pub fn fill_nan(&self, expr: &RbExpr) -> Self {
388
+ pub fn fill_nan(&self, expr: &Self) -> Self {
360
389
  self.inner.clone().fill_nan(expr.inner.clone()).into()
361
390
  }
362
391
 
@@ -368,7 +397,7 @@ impl RbExpr {
368
397
  self.inner.clone().drop_nans().into()
369
398
  }
370
399
 
371
- pub fn filter(&self, predicate: &RbExpr) -> Self {
400
+ pub fn filter(&self, predicate: &Self) -> Self {
372
401
  self.clone().inner.filter(predicate.inner.clone()).into()
373
402
  }
374
403
 
@@ -423,14 +452,14 @@ impl RbExpr {
423
452
  self.clone().inner.head(n).into()
424
453
  }
425
454
 
426
- pub fn slice(&self, offset: &RbExpr, length: &RbExpr) -> Self {
455
+ pub fn slice(&self, offset: &Self, length: &Self) -> Self {
427
456
  self.inner
428
457
  .clone()
429
458
  .slice(offset.inner.clone(), length.inner.clone())
430
459
  .into()
431
460
  }
432
461
 
433
- pub fn append(&self, other: &RbExpr, upcast: bool) -> Self {
462
+ pub fn append(&self, other: &Self, upcast: bool) -> Self {
434
463
  self.inner
435
464
  .clone()
436
465
  .append(other.inner.clone(), upcast)
@@ -532,27 +561,27 @@ impl RbExpr {
532
561
  Ok(self.clone().inner.over(partition_by).into())
533
562
  }
534
563
 
535
- pub fn _and(&self, expr: &RbExpr) -> Self {
564
+ pub fn _and(&self, expr: &Self) -> Self {
536
565
  self.clone().inner.and(expr.inner.clone()).into()
537
566
  }
538
567
 
539
- pub fn _xor(&self, expr: &RbExpr) -> Self {
568
+ pub fn _xor(&self, expr: &Self) -> Self {
540
569
  self.clone().inner.xor(expr.inner.clone()).into()
541
570
  }
542
571
 
543
- pub fn _or(&self, expr: &RbExpr) -> Self {
572
+ pub fn _or(&self, expr: &Self) -> Self {
544
573
  self.clone().inner.or(expr.inner.clone()).into()
545
574
  }
546
575
 
547
- pub fn is_in(&self, expr: &RbExpr) -> Self {
576
+ pub fn is_in(&self, expr: &Self) -> Self {
548
577
  self.clone().inner.is_in(expr.inner.clone()).into()
549
578
  }
550
579
 
551
- pub fn repeat_by(&self, by: &RbExpr) -> Self {
580
+ pub fn repeat_by(&self, by: &Self) -> Self {
552
581
  self.clone().inner.repeat_by(by.inner.clone()).into()
553
582
  }
554
583
 
555
- pub fn pow(&self, exponent: &RbExpr) -> Self {
584
+ pub fn pow(&self, exponent: &Self) -> Self {
556
585
  self.clone().inner.pow(exponent.inner.clone()).into()
557
586
  }
558
587
 
@@ -584,7 +613,7 @@ impl RbExpr {
584
613
  map_single(self, lambda, output_type, agg_list)
585
614
  }
586
615
 
587
- pub fn dot(&self, other: &RbExpr) -> Self {
616
+ pub fn dot(&self, other: &Self) -> Self {
588
617
  self.inner.clone().dot(other.inner.clone()).into()
589
618
  }
590
619
 
@@ -621,7 +650,7 @@ impl RbExpr {
621
650
  self.inner.clone().upper_bound().into()
622
651
  }
623
652
 
624
- pub fn cumulative_eval(&self, expr: &RbExpr, min_periods: usize, parallel: bool) -> Self {
653
+ pub fn cumulative_eval(&self, expr: &Self, min_periods: usize, parallel: bool) -> Self {
625
654
  self.inner
626
655
  .clone()
627
656
  .cumulative_eval(expr.inner.clone(), min_periods, parallel)
@@ -803,4 +832,22 @@ impl RbExpr {
803
832
  };
804
833
  self.inner.clone().set_sorted_flag(is_sorted).into()
805
834
  }
835
+
836
+ pub fn replace(
837
+ &self,
838
+ old: &Self,
839
+ new: &Self,
840
+ default: Option<&Self>,
841
+ return_dtype: Option<Wrap<DataType>>,
842
+ ) -> Self {
843
+ self.inner
844
+ .clone()
845
+ .replace(
846
+ old.inner.clone(),
847
+ new.inner.clone(),
848
+ default.map(|e| e.inner.clone()),
849
+ return_dtype.map(|dt| dt.0),
850
+ )
851
+ .into()
852
+ }
806
853
  }
@@ -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
  }
@@ -43,15 +51,19 @@ impl RbExpr {
43
51
  .into()
44
52
  }
45
53
 
46
- pub fn list_get(&self, index: &RbExpr) -> Self {
47
- self.inner.clone().list().get(index.inner.clone()).into()
54
+ pub fn list_get(&self, index: &RbExpr, null_on_oob: bool) -> Self {
55
+ self.inner
56
+ .clone()
57
+ .list()
58
+ .get(index.inner.clone(), null_on_oob)
59
+ .into()
48
60
  }
49
61
 
50
- pub fn list_join(&self, separator: &RbExpr) -> Self {
62
+ pub fn list_join(&self, separator: &RbExpr, ignore_nulls: bool) -> Self {
51
63
  self.inner
52
64
  .clone()
53
65
  .list()
54
- .join(separator.inner.clone())
66
+ .join(separator.inner.clone(), ignore_nulls)
55
67
  .into()
56
68
  }
57
69
 
@@ -100,6 +112,10 @@ impl RbExpr {
100
112
  .into()
101
113
  }
102
114
 
115
+ pub fn list_tail(&self, n: &RbExpr) -> Self {
116
+ self.inner.clone().list().tail(n.inner.clone()).into()
117
+ }
118
+
103
119
  pub fn list_sort(&self, reverse: bool) -> Self {
104
120
  self.inner
105
121
  .clone()
@@ -116,14 +132,50 @@ impl RbExpr {
116
132
  self.inner.clone().list().sum().with_fmt("list.sum").into()
117
133
  }
118
134
 
119
- pub fn list_take(&self, index: &RbExpr, null_on_oob: bool) -> Self {
135
+ pub fn list_drop_nulls(&self) -> Self {
136
+ self.inner.clone().list().drop_nulls().into()
137
+ }
138
+
139
+ pub fn list_sample_n(
140
+ &self,
141
+ n: &RbExpr,
142
+ with_replacement: bool,
143
+ shuffle: bool,
144
+ seed: Option<u64>,
145
+ ) -> Self {
146
+ self.inner
147
+ .clone()
148
+ .list()
149
+ .sample_n(n.inner.clone(), with_replacement, shuffle, seed)
150
+ .into()
151
+ }
152
+
153
+ pub fn list_sample_fraction(
154
+ &self,
155
+ fraction: &RbExpr,
156
+ with_replacement: bool,
157
+ shuffle: bool,
158
+ seed: Option<u64>,
159
+ ) -> Self {
160
+ self.inner
161
+ .clone()
162
+ .list()
163
+ .sample_fraction(fraction.inner.clone(), with_replacement, shuffle, seed)
164
+ .into()
165
+ }
166
+
167
+ pub fn list_gather(&self, index: &RbExpr, null_on_oob: bool) -> Self {
120
168
  self.inner
121
169
  .clone()
122
170
  .list()
123
- .take(index.inner.clone(), null_on_oob)
171
+ .gather(index.inner.clone(), null_on_oob)
124
172
  .into()
125
173
  }
126
174
 
175
+ pub fn list_to_array(&self, width: usize) -> Self {
176
+ self.inner.clone().list().to_array(width).into()
177
+ }
178
+
127
179
  pub fn list_to_struct(
128
180
  &self,
129
181
  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
  }
@@ -142,6 +142,7 @@ impl RbExpr {
142
142
  self.inner.clone().rolling_var(options).into()
143
143
  }
144
144
 
145
+ #[allow(clippy::too_many_arguments)]
145
146
  pub fn rolling_median(
146
147
  &self,
147
148
  window_size: String,
@@ -1,7 +1,7 @@
1
1
  use polars::prelude::*;
2
2
 
3
3
  use crate::conversion::Wrap;
4
- use crate::RbExpr;
4
+ use crate::{RbExpr, RbPolarsErr, RbResult};
5
5
 
6
6
  impl RbExpr {
7
7
  pub fn str_concat(&self, delimiter: String, ignore_nulls: bool) -> Self {
@@ -107,8 +107,12 @@ impl RbExpr {
107
107
  .into()
108
108
  }
109
109
 
110
- pub fn str_slice(&self, start: i64, length: Option<u64>) -> Self {
111
- self.inner.clone().str().slice(start, length).into()
110
+ pub fn str_slice(&self, start: &Self, length: &Self) -> Self {
111
+ self.inner
112
+ .clone()
113
+ .str()
114
+ .slice(start.inner.clone(), length.inner.clone())
115
+ .into()
112
116
  }
113
117
 
114
118
  pub fn str_explode(&self) -> Self {
@@ -147,6 +151,10 @@ impl RbExpr {
147
151
  .into()
148
152
  }
149
153
 
154
+ pub fn str_reverse(&self) -> Self {
155
+ self.inner.clone().str().reverse().into()
156
+ }
157
+
150
158
  pub fn str_pad_start(&self, length: usize, fillchar: char) -> Self {
151
159
  self.clone().inner.str().pad_start(length, fillchar).into()
152
160
  }
@@ -155,8 +163,8 @@ impl RbExpr {
155
163
  self.clone().inner.str().pad_end(length, fillchar).into()
156
164
  }
157
165
 
158
- pub fn str_zfill(&self, alignment: usize) -> Self {
159
- self.clone().inner.str().zfill(alignment).into()
166
+ pub fn str_zfill(&self, length: &Self) -> Self {
167
+ self.clone().inner.str().zfill(length.inner.clone()).into()
160
168
  }
161
169
 
162
170
  pub fn str_contains(&self, pat: &RbExpr, literal: Option<bool>, strict: bool) -> Self {
@@ -236,16 +244,16 @@ impl RbExpr {
236
244
  .into()
237
245
  }
238
246
 
239
- pub fn str_to_integer(&self, base: u32, strict: bool) -> Self {
247
+ pub fn str_to_integer(&self, base: &Self, strict: bool) -> Self {
240
248
  self.inner
241
249
  .clone()
242
250
  .str()
243
- .to_integer(base, strict)
244
- .with_fmt("str.parse_int")
251
+ .to_integer(base.inner.clone(), strict)
252
+ .with_fmt("str.to_integer")
245
253
  .into()
246
254
  }
247
255
 
248
- pub fn str_json_extract(
256
+ pub fn str_json_decode(
249
257
  &self,
250
258
  dtype: Option<Wrap<DataType>>,
251
259
  infer_schema_len: Option<usize>,
@@ -287,8 +295,12 @@ impl RbExpr {
287
295
  .into()
288
296
  }
289
297
 
290
- pub fn str_extract(&self, pat: String, group_index: usize) -> Self {
291
- self.inner.clone().str().extract(&pat, group_index).into()
298
+ pub fn str_extract(&self, pat: &Self, group_index: usize) -> Self {
299
+ self.inner
300
+ .clone()
301
+ .str()
302
+ .extract(pat.inner.clone(), group_index)
303
+ .into()
292
304
  }
293
305
 
294
306
  pub fn str_extract_all(&self, pat: &RbExpr) -> Self {
@@ -299,6 +311,16 @@ impl RbExpr {
299
311
  .into()
300
312
  }
301
313
 
314
+ pub fn str_extract_groups(&self, pat: String) -> RbResult<Self> {
315
+ Ok(self
316
+ .inner
317
+ .clone()
318
+ .str()
319
+ .extract_groups(&pat)
320
+ .map_err(RbPolarsErr::from)?
321
+ .into())
322
+ }
323
+
302
324
  pub fn str_count_matches(&self, pat: &Self, literal: bool) -> Self {
303
325
  self.inner
304
326
  .clone()
@@ -338,4 +360,33 @@ impl RbExpr {
338
360
  pub fn str_splitn(&self, by: &Self, n: usize) -> Self {
339
361
  self.inner.clone().str().splitn(by.inner.clone(), n).into()
340
362
  }
363
+
364
+ pub fn str_to_decimal(&self, infer_len: usize) -> Self {
365
+ self.inner.clone().str().to_decimal(infer_len).into()
366
+ }
367
+
368
+ pub fn str_contains_any(&self, patterns: &RbExpr, ascii_case_insensitive: bool) -> Self {
369
+ self.inner
370
+ .clone()
371
+ .str()
372
+ .contains_any(patterns.inner.clone(), ascii_case_insensitive)
373
+ .into()
374
+ }
375
+
376
+ pub fn str_replace_many(
377
+ &self,
378
+ patterns: &RbExpr,
379
+ replace_with: &RbExpr,
380
+ ascii_case_insensitive: bool,
381
+ ) -> Self {
382
+ self.inner
383
+ .clone()
384
+ .str()
385
+ .replace_many(
386
+ patterns.inner.clone(),
387
+ replace_with.inner.clone(),
388
+ ascii_case_insensitive,
389
+ )
390
+ .into()
391
+ }
341
392
  }
@@ -1,15 +1,19 @@
1
1
  use crate::RbExpr;
2
2
 
3
3
  impl RbExpr {
4
- pub fn struct_field_by_name(&self, name: String) -> Self {
5
- self.inner.clone().struct_().field_by_name(&name).into()
6
- }
7
-
8
4
  pub fn struct_field_by_index(&self, index: i64) -> Self {
9
5
  self.inner.clone().struct_().field_by_index(index).into()
10
6
  }
11
7
 
8
+ pub fn struct_field_by_name(&self, name: String) -> Self {
9
+ self.inner.clone().struct_().field_by_name(&name).into()
10
+ }
11
+
12
12
  pub fn struct_rename_fields(&self, names: Vec<String>) -> Self {
13
13
  self.inner.clone().struct_().rename_fields(names).into()
14
14
  }
15
+
16
+ pub fn struct_json_encode(&self) -> Self {
17
+ self.inner.clone().struct_().json_encode().into()
18
+ }
15
19
  }