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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +42 -1
- data/Cargo.lock +159 -66
- data/Cargo.toml +0 -3
- data/LICENSE.txt +1 -1
- data/README.md +3 -2
- data/ext/polars/Cargo.toml +18 -8
- data/ext/polars/src/batched_csv.rs +7 -5
- data/ext/polars/src/conversion/anyvalue.rs +186 -0
- data/ext/polars/src/conversion/chunked_array.rs +140 -0
- data/ext/polars/src/{conversion.rs → conversion/mod.rs} +273 -342
- data/ext/polars/src/dataframe.rs +108 -66
- data/ext/polars/src/expr/array.rs +78 -0
- data/ext/polars/src/expr/datetime.rs +29 -58
- data/ext/polars/src/expr/general.rs +83 -36
- data/ext/polars/src/expr/list.rs +58 -6
- data/ext/polars/src/expr/meta.rs +48 -0
- data/ext/polars/src/expr/rolling.rs +1 -0
- data/ext/polars/src/expr/string.rs +62 -11
- data/ext/polars/src/expr/struct.rs +8 -4
- data/ext/polars/src/file.rs +158 -11
- data/ext/polars/src/functions/aggregation.rs +6 -0
- data/ext/polars/src/functions/lazy.rs +120 -50
- data/ext/polars/src/functions/meta.rs +45 -1
- data/ext/polars/src/functions/string_cache.rs +14 -0
- data/ext/polars/src/functions/whenthen.rs +47 -17
- data/ext/polars/src/{lazyframe.rs → lazyframe/mod.rs} +195 -40
- data/ext/polars/src/lib.rs +246 -179
- data/ext/polars/src/map/dataframe.rs +17 -9
- data/ext/polars/src/series/aggregation.rs +20 -0
- data/ext/polars/src/series/mod.rs +35 -4
- data/lib/polars/array_expr.rb +453 -0
- data/lib/polars/array_name_space.rb +346 -0
- data/lib/polars/batched_csv_reader.rb +4 -2
- data/lib/polars/cat_expr.rb +24 -0
- data/lib/polars/cat_name_space.rb +75 -0
- data/lib/polars/config.rb +2 -2
- data/lib/polars/data_frame.rb +306 -96
- data/lib/polars/data_types.rb +191 -28
- data/lib/polars/date_time_expr.rb +41 -18
- data/lib/polars/date_time_name_space.rb +9 -3
- data/lib/polars/exceptions.rb +12 -1
- data/lib/polars/expr.rb +898 -215
- data/lib/polars/functions/aggregation/horizontal.rb +246 -0
- data/lib/polars/functions/aggregation/vertical.rb +282 -0
- data/lib/polars/functions/as_datatype.rb +248 -0
- data/lib/polars/functions/col.rb +47 -0
- data/lib/polars/functions/eager.rb +182 -0
- data/lib/polars/functions/lazy.rb +1280 -0
- data/lib/polars/functions/len.rb +49 -0
- data/lib/polars/functions/lit.rb +35 -0
- data/lib/polars/functions/random.rb +16 -0
- data/lib/polars/functions/range/date_range.rb +103 -0
- data/lib/polars/functions/range/int_range.rb +51 -0
- data/lib/polars/functions/repeat.rb +144 -0
- data/lib/polars/functions/whenthen.rb +96 -0
- data/lib/polars/functions.rb +29 -416
- data/lib/polars/group_by.rb +2 -2
- data/lib/polars/io.rb +36 -31
- data/lib/polars/lazy_frame.rb +405 -88
- data/lib/polars/list_expr.rb +158 -8
- data/lib/polars/list_name_space.rb +102 -0
- data/lib/polars/meta_expr.rb +175 -7
- data/lib/polars/series.rb +282 -41
- data/lib/polars/string_cache.rb +75 -0
- data/lib/polars/string_expr.rb +413 -96
- data/lib/polars/string_name_space.rb +4 -4
- data/lib/polars/testing.rb +507 -0
- data/lib/polars/utils.rb +106 -8
- data/lib/polars/version.rb +1 -1
- data/lib/polars/whenthen.rb +83 -0
- data/lib/polars.rb +16 -4
- metadata +37 -8
- data/lib/polars/lazy_functions.rb +0 -1181
- data/lib/polars/when.rb +0 -16
- 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: &
|
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: &
|
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: &
|
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: &
|
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: &
|
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: &
|
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: &
|
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
|
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
|
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: &
|
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: &
|
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: &
|
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
|
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
|
-
.
|
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: &
|
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: &
|
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(
|
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
|
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: &
|
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: &
|
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: &
|
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: &
|
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: &
|
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: &
|
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: &
|
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: &
|
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: &
|
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: &
|
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: &
|
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: &
|
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: &
|
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
|
}
|
data/ext/polars/src/expr/list.rs
CHANGED
@@ -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
|
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
|
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
|
-
.
|
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>,
|
data/ext/polars/src/expr/meta.rs
CHANGED
@@ -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
|
}
|
@@ -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:
|
111
|
-
self.inner
|
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,
|
159
|
-
self.clone().inner.str().zfill(
|
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:
|
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.
|
251
|
+
.to_integer(base.inner.clone(), strict)
|
252
|
+
.with_fmt("str.to_integer")
|
245
253
|
.into()
|
246
254
|
}
|
247
255
|
|
248
|
-
pub fn
|
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:
|
291
|
-
self.inner
|
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
|
}
|