polars-df 0.8.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 (68) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +30 -1
  3. data/Cargo.lock +107 -59
  4. data/Cargo.toml +0 -3
  5. data/LICENSE.txt +1 -1
  6. data/README.md +2 -2
  7. data/ext/polars/Cargo.toml +15 -7
  8. data/ext/polars/src/batched_csv.rs +4 -4
  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} +260 -340
  12. data/ext/polars/src/dataframe.rs +69 -53
  13. data/ext/polars/src/expr/array.rs +74 -0
  14. data/ext/polars/src/expr/datetime.rs +22 -56
  15. data/ext/polars/src/expr/general.rs +61 -33
  16. data/ext/polars/src/expr/list.rs +52 -4
  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 +59 -8
  20. data/ext/polars/src/expr/struct.rs +8 -4
  21. data/ext/polars/src/functions/aggregation.rs +6 -0
  22. data/ext/polars/src/functions/lazy.rs +103 -48
  23. data/ext/polars/src/functions/meta.rs +45 -1
  24. data/ext/polars/src/functions/string_cache.rs +14 -0
  25. data/ext/polars/src/{lazyframe.rs → lazyframe/mod.rs} +138 -22
  26. data/ext/polars/src/lib.rs +226 -168
  27. data/ext/polars/src/series/aggregation.rs +20 -0
  28. data/ext/polars/src/series/mod.rs +25 -4
  29. data/lib/polars/array_expr.rb +449 -0
  30. data/lib/polars/array_name_space.rb +346 -0
  31. data/lib/polars/cat_expr.rb +24 -0
  32. data/lib/polars/cat_name_space.rb +75 -0
  33. data/lib/polars/config.rb +2 -2
  34. data/lib/polars/data_frame.rb +179 -43
  35. data/lib/polars/data_types.rb +191 -28
  36. data/lib/polars/date_time_expr.rb +31 -14
  37. data/lib/polars/exceptions.rb +12 -1
  38. data/lib/polars/expr.rb +866 -186
  39. data/lib/polars/functions/aggregation/horizontal.rb +246 -0
  40. data/lib/polars/functions/aggregation/vertical.rb +282 -0
  41. data/lib/polars/functions/as_datatype.rb +248 -0
  42. data/lib/polars/functions/col.rb +47 -0
  43. data/lib/polars/functions/eager.rb +182 -0
  44. data/lib/polars/functions/lazy.rb +1280 -0
  45. data/lib/polars/functions/len.rb +49 -0
  46. data/lib/polars/functions/lit.rb +35 -0
  47. data/lib/polars/functions/random.rb +16 -0
  48. data/lib/polars/functions/range/date_range.rb +103 -0
  49. data/lib/polars/functions/range/int_range.rb +51 -0
  50. data/lib/polars/functions/repeat.rb +144 -0
  51. data/lib/polars/functions/whenthen.rb +27 -0
  52. data/lib/polars/functions.rb +29 -416
  53. data/lib/polars/group_by.rb +2 -2
  54. data/lib/polars/io.rb +18 -25
  55. data/lib/polars/lazy_frame.rb +367 -53
  56. data/lib/polars/list_expr.rb +152 -6
  57. data/lib/polars/list_name_space.rb +102 -0
  58. data/lib/polars/meta_expr.rb +175 -7
  59. data/lib/polars/series.rb +273 -34
  60. data/lib/polars/string_cache.rb +75 -0
  61. data/lib/polars/string_expr.rb +412 -96
  62. data/lib/polars/string_name_space.rb +4 -4
  63. data/lib/polars/testing.rb +507 -0
  64. data/lib/polars/utils.rb +52 -8
  65. data/lib/polars/version.rb +1 -1
  66. data/lib/polars.rb +15 -2
  67. metadata +35 -5
  68. data/lib/polars/lazy_functions.rb +0 -1181
@@ -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)
@@ -302,14 +312,14 @@ 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
 
@@ -335,7 +345,7 @@ impl RbExpr {
335
345
  out.into()
336
346
  }
337
347
 
338
- pub fn fill_null(&self, expr: &RbExpr) -> Self {
348
+ pub fn fill_null(&self, expr: &Self) -> Self {
339
349
  self.clone().inner.fill_null(expr.inner.clone()).into()
340
350
  }
341
351
 
@@ -356,7 +366,7 @@ impl RbExpr {
356
366
  .into())
357
367
  }
358
368
 
359
- pub fn fill_nan(&self, expr: &RbExpr) -> Self {
369
+ pub fn fill_nan(&self, expr: &Self) -> Self {
360
370
  self.inner.clone().fill_nan(expr.inner.clone()).into()
361
371
  }
362
372
 
@@ -368,7 +378,7 @@ impl RbExpr {
368
378
  self.inner.clone().drop_nans().into()
369
379
  }
370
380
 
371
- pub fn filter(&self, predicate: &RbExpr) -> Self {
381
+ pub fn filter(&self, predicate: &Self) -> Self {
372
382
  self.clone().inner.filter(predicate.inner.clone()).into()
373
383
  }
374
384
 
@@ -423,14 +433,14 @@ impl RbExpr {
423
433
  self.clone().inner.head(n).into()
424
434
  }
425
435
 
426
- pub fn slice(&self, offset: &RbExpr, length: &RbExpr) -> Self {
436
+ pub fn slice(&self, offset: &Self, length: &Self) -> Self {
427
437
  self.inner
428
438
  .clone()
429
439
  .slice(offset.inner.clone(), length.inner.clone())
430
440
  .into()
431
441
  }
432
442
 
433
- pub fn append(&self, other: &RbExpr, upcast: bool) -> Self {
443
+ pub fn append(&self, other: &Self, upcast: bool) -> Self {
434
444
  self.inner
435
445
  .clone()
436
446
  .append(other.inner.clone(), upcast)
@@ -532,27 +542,27 @@ impl RbExpr {
532
542
  Ok(self.clone().inner.over(partition_by).into())
533
543
  }
534
544
 
535
- pub fn _and(&self, expr: &RbExpr) -> Self {
545
+ pub fn _and(&self, expr: &Self) -> Self {
536
546
  self.clone().inner.and(expr.inner.clone()).into()
537
547
  }
538
548
 
539
- pub fn _xor(&self, expr: &RbExpr) -> Self {
549
+ pub fn _xor(&self, expr: &Self) -> Self {
540
550
  self.clone().inner.xor(expr.inner.clone()).into()
541
551
  }
542
552
 
543
- pub fn _or(&self, expr: &RbExpr) -> Self {
553
+ pub fn _or(&self, expr: &Self) -> Self {
544
554
  self.clone().inner.or(expr.inner.clone()).into()
545
555
  }
546
556
 
547
- pub fn is_in(&self, expr: &RbExpr) -> Self {
557
+ pub fn is_in(&self, expr: &Self) -> Self {
548
558
  self.clone().inner.is_in(expr.inner.clone()).into()
549
559
  }
550
560
 
551
- pub fn repeat_by(&self, by: &RbExpr) -> Self {
561
+ pub fn repeat_by(&self, by: &Self) -> Self {
552
562
  self.clone().inner.repeat_by(by.inner.clone()).into()
553
563
  }
554
564
 
555
- pub fn pow(&self, exponent: &RbExpr) -> Self {
565
+ pub fn pow(&self, exponent: &Self) -> Self {
556
566
  self.clone().inner.pow(exponent.inner.clone()).into()
557
567
  }
558
568
 
@@ -584,7 +594,7 @@ impl RbExpr {
584
594
  map_single(self, lambda, output_type, agg_list)
585
595
  }
586
596
 
587
- pub fn dot(&self, other: &RbExpr) -> Self {
597
+ pub fn dot(&self, other: &Self) -> Self {
588
598
  self.inner.clone().dot(other.inner.clone()).into()
589
599
  }
590
600
 
@@ -621,7 +631,7 @@ impl RbExpr {
621
631
  self.inner.clone().upper_bound().into()
622
632
  }
623
633
 
624
- 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 {
625
635
  self.inner
626
636
  .clone()
627
637
  .cumulative_eval(expr.inner.clone(), min_periods, parallel)
@@ -803,4 +813,22 @@ impl RbExpr {
803
813
  };
804
814
  self.inner.clone().set_sorted_flag(is_sorted).into()
805
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
+ }
806
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
  }
@@ -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 {
@@ -245,7 +253,7 @@ impl RbExpr {
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
  }
@@ -33,3 +33,9 @@ pub fn sum_horizontal(exprs: RArray) -> RbResult<RbExpr> {
33
33
  let e = dsl::sum_horizontal(exprs).map_err(RbPolarsErr::from)?;
34
34
  Ok(e.into())
35
35
  }
36
+
37
+ pub fn mean_horizontal(exprs: RArray) -> RbResult<RbExpr> {
38
+ let exprs = rb_exprs_to_exprs(exprs)?;
39
+ let e = dsl::mean_horizontal(exprs).map_err(RbPolarsErr::from)?;
40
+ Ok(e.into())
41
+ }