polars-df 0.8.0 → 0.10.0

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