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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +41 -0
- data/Cargo.lock +353 -237
- data/Cargo.toml +0 -3
- data/LICENSE.txt +1 -1
- data/README.md +2 -2
- data/ext/polars/Cargo.toml +17 -6
- data/ext/polars/src/batched_csv.rs +6 -7
- data/ext/polars/src/conversion/anyvalue.rs +185 -0
- data/ext/polars/src/conversion/chunked_array.rs +140 -0
- data/ext/polars/src/{conversion.rs → conversion/mod.rs} +268 -347
- data/ext/polars/src/dataframe.rs +96 -116
- data/ext/polars/src/expr/array.rs +74 -0
- data/ext/polars/src/expr/categorical.rs +8 -1
- data/ext/polars/src/expr/datetime.rs +22 -56
- data/ext/polars/src/expr/general.rs +124 -37
- data/ext/polars/src/expr/list.rs +52 -4
- data/ext/polars/src/expr/meta.rs +48 -0
- data/ext/polars/src/expr/rolling.rs +16 -10
- data/ext/polars/src/expr/string.rs +68 -17
- data/ext/polars/src/expr/struct.rs +8 -4
- data/ext/polars/src/functions/aggregation.rs +6 -0
- data/ext/polars/src/functions/lazy.rs +103 -48
- data/ext/polars/src/functions/meta.rs +45 -1
- data/ext/polars/src/functions/range.rs +5 -10
- data/ext/polars/src/functions/string_cache.rs +14 -0
- data/ext/polars/src/{lazyframe.rs → lazyframe/mod.rs} +166 -41
- data/ext/polars/src/lib.rs +245 -187
- data/ext/polars/src/map/dataframe.rs +1 -1
- data/ext/polars/src/map/mod.rs +2 -2
- data/ext/polars/src/map/series.rs +6 -6
- data/ext/polars/src/object.rs +0 -30
- data/ext/polars/src/on_startup.rs +32 -0
- data/ext/polars/src/series/aggregation.rs +23 -0
- data/ext/polars/src/series/construction.rs +1 -1
- data/ext/polars/src/series/export.rs +2 -2
- data/ext/polars/src/{series.rs → series/mod.rs} +45 -21
- data/ext/polars/src/series/{set_at_idx.rs → scatter.rs} +18 -18
- data/ext/polars/src/utils.rs +1 -1
- data/lib/polars/array_expr.rb +449 -0
- data/lib/polars/array_name_space.rb +346 -0
- 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 +248 -108
- data/lib/polars/data_types.rb +195 -29
- data/lib/polars/date_time_expr.rb +41 -24
- data/lib/polars/date_time_name_space.rb +12 -12
- data/lib/polars/exceptions.rb +12 -1
- data/lib/polars/expr.rb +1080 -195
- 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 +27 -0
- data/lib/polars/functions.rb +29 -416
- data/lib/polars/group_by.rb +3 -3
- data/lib/polars/io.rb +21 -28
- data/lib/polars/lazy_frame.rb +390 -76
- data/lib/polars/list_expr.rb +152 -6
- data/lib/polars/list_name_space.rb +102 -0
- data/lib/polars/meta_expr.rb +175 -7
- data/lib/polars/series.rb +557 -59
- data/lib/polars/sql_context.rb +1 -1
- data/lib/polars/string_cache.rb +75 -0
- data/lib/polars/string_expr.rb +412 -96
- data/lib/polars/string_name_space.rb +4 -4
- data/lib/polars/struct_expr.rb +1 -1
- data/lib/polars/struct_name_space.rb +1 -1
- data/lib/polars/testing.rb +507 -0
- data/lib/polars/utils.rb +64 -20
- data/lib/polars/version.rb +1 -1
- data/lib/polars.rb +15 -2
- metadata +40 -9
- data/lib/polars/lazy_functions.rb +0 -1197
@@ -187,7 +187,7 @@ pub fn apply_lambda_with_utf8_out_type(
|
|
187
187
|
lambda: Value,
|
188
188
|
init_null_count: usize,
|
189
189
|
first_value: Option<&str>,
|
190
|
-
) ->
|
190
|
+
) -> StringChunked {
|
191
191
|
let skip = usize::from(first_value.is_some());
|
192
192
|
if init_null_count == df.height() {
|
193
193
|
ChunkedArray::full_null("apply", df.height())
|
data/ext/polars/src/map/mod.rs
CHANGED
@@ -198,11 +198,11 @@ fn iterator_to_utf8(
|
|
198
198
|
first_value: Option<&str>,
|
199
199
|
name: &str,
|
200
200
|
capacity: usize,
|
201
|
-
) ->
|
201
|
+
) -> StringChunked {
|
202
202
|
let first_value = first_value.map(|v| v.to_string());
|
203
203
|
|
204
204
|
// safety: we know the iterators len
|
205
|
-
let mut ca:
|
205
|
+
let mut ca: StringChunked = unsafe {
|
206
206
|
if init_null_count > 0 {
|
207
207
|
(0..init_null_count)
|
208
208
|
.map(|_| None)
|
@@ -101,7 +101,7 @@ pub trait ApplyLambda<'a> {
|
|
101
101
|
lambda: Value,
|
102
102
|
init_null_count: usize,
|
103
103
|
first_value: Option<&str>,
|
104
|
-
) -> RbResult<
|
104
|
+
) -> RbResult<StringChunked>;
|
105
105
|
|
106
106
|
/// Apply a lambda with list output type
|
107
107
|
fn apply_lambda_with_list_out_type(
|
@@ -285,7 +285,7 @@ impl<'a> ApplyLambda<'a> for BooleanChunked {
|
|
285
285
|
lambda: Value,
|
286
286
|
init_null_count: usize,
|
287
287
|
first_value: Option<&str>,
|
288
|
-
) -> RbResult<
|
288
|
+
) -> RbResult<StringChunked> {
|
289
289
|
let skip = usize::from(first_value.is_some());
|
290
290
|
if init_null_count == self.len() {
|
291
291
|
Ok(ChunkedArray::full_null(self.name(), self.len()))
|
@@ -562,7 +562,7 @@ where
|
|
562
562
|
lambda: Value,
|
563
563
|
init_null_count: usize,
|
564
564
|
first_value: Option<&str>,
|
565
|
-
) -> RbResult<
|
565
|
+
) -> RbResult<StringChunked> {
|
566
566
|
let skip = usize::from(first_value.is_some());
|
567
567
|
if init_null_count == self.len() {
|
568
568
|
Ok(ChunkedArray::full_null(self.name(), self.len()))
|
@@ -705,7 +705,7 @@ where
|
|
705
705
|
}
|
706
706
|
}
|
707
707
|
|
708
|
-
impl<'a> ApplyLambda<'a> for
|
708
|
+
impl<'a> ApplyLambda<'a> for StringChunked {
|
709
709
|
fn apply_lambda_unknown(&'a self, lambda: Value) -> RbResult<RbSeries> {
|
710
710
|
let mut null_count = 0;
|
711
711
|
for opt_v in self.into_iter() {
|
@@ -834,7 +834,7 @@ impl<'a> ApplyLambda<'a> for Utf8Chunked {
|
|
834
834
|
lambda: Value,
|
835
835
|
init_null_count: usize,
|
836
836
|
first_value: Option<&str>,
|
837
|
-
) -> RbResult<
|
837
|
+
) -> RbResult<StringChunked> {
|
838
838
|
let skip = usize::from(first_value.is_some());
|
839
839
|
if init_null_count == self.len() {
|
840
840
|
Ok(ChunkedArray::full_null(self.name(), self.len()))
|
@@ -1079,7 +1079,7 @@ impl<'a> ApplyLambda<'a> for StructChunked {
|
|
1079
1079
|
lambda: Value,
|
1080
1080
|
init_null_count: usize,
|
1081
1081
|
first_value: Option<&str>,
|
1082
|
-
) -> RbResult<
|
1082
|
+
) -> RbResult<StringChunked> {
|
1083
1083
|
let names = self.fields().iter().map(|s| s.name()).collect::<Vec<_>>();
|
1084
1084
|
|
1085
1085
|
let skip = usize::from(first_value.is_some());
|
data/ext/polars/src/object.rs
CHANGED
@@ -1,31 +1 @@
|
|
1
|
-
use std::any::Any;
|
2
|
-
use std::sync::Arc;
|
3
|
-
|
4
|
-
use magnus::IntoValue;
|
5
|
-
use polars_core::chunked_array::object::builder::ObjectChunkedBuilder;
|
6
|
-
use polars_core::chunked_array::object::registry;
|
7
|
-
use polars_core::chunked_array::object::registry::AnonymousObjectBuilder;
|
8
|
-
use polars_core::prelude::AnyValue;
|
9
|
-
|
10
|
-
use crate::prelude::ObjectValue;
|
11
|
-
use crate::Wrap;
|
12
|
-
|
13
1
|
pub(crate) const OBJECT_NAME: &str = "object";
|
14
|
-
|
15
|
-
pub(crate) fn register_object_builder() {
|
16
|
-
if !registry::is_object_builder_registered() {
|
17
|
-
let object_builder = Box::new(|name: &str, capacity: usize| {
|
18
|
-
Box::new(ObjectChunkedBuilder::<ObjectValue>::new(name, capacity))
|
19
|
-
as Box<dyn AnonymousObjectBuilder>
|
20
|
-
});
|
21
|
-
|
22
|
-
let object_converter = Arc::new(|av: AnyValue| {
|
23
|
-
let object = ObjectValue {
|
24
|
-
inner: Wrap(av).into_value().into(),
|
25
|
-
};
|
26
|
-
Box::new(object) as Box<dyn Any>
|
27
|
-
});
|
28
|
-
|
29
|
-
registry::register_object_builder(object_builder, object_converter)
|
30
|
-
}
|
31
|
-
}
|
@@ -0,0 +1,32 @@
|
|
1
|
+
use std::any::Any;
|
2
|
+
use std::sync::Arc;
|
3
|
+
|
4
|
+
use magnus::IntoValue;
|
5
|
+
use polars::prelude::*;
|
6
|
+
use polars_core::chunked_array::object::builder::ObjectChunkedBuilder;
|
7
|
+
use polars_core::chunked_array::object::registry;
|
8
|
+
use polars_core::chunked_array::object::registry::AnonymousObjectBuilder;
|
9
|
+
use polars_core::prelude::AnyValue;
|
10
|
+
|
11
|
+
use crate::prelude::ObjectValue;
|
12
|
+
use crate::Wrap;
|
13
|
+
|
14
|
+
pub(crate) fn register_object_builder() {
|
15
|
+
if !registry::is_object_builder_registered() {
|
16
|
+
let object_builder = Box::new(|name: &str, capacity: usize| {
|
17
|
+
Box::new(ObjectChunkedBuilder::<ObjectValue>::new(name, capacity))
|
18
|
+
as Box<dyn AnonymousObjectBuilder>
|
19
|
+
});
|
20
|
+
|
21
|
+
let object_converter = Arc::new(|av: AnyValue| {
|
22
|
+
let object = ObjectValue {
|
23
|
+
inner: Wrap(av).into_value().into(),
|
24
|
+
};
|
25
|
+
Box::new(object) as Box<dyn Any>
|
26
|
+
});
|
27
|
+
|
28
|
+
let object_size = std::mem::size_of::<ObjectValue>();
|
29
|
+
let physical_dtype = ArrowDataType::FixedSizeBinary(object_size);
|
30
|
+
registry::register_object_builder(object_builder, object_converter, physical_dtype)
|
31
|
+
}
|
32
|
+
}
|
@@ -4,6 +4,26 @@ use crate::{RbResult, RbSeries, RbValueError};
|
|
4
4
|
use magnus::{IntoValue, Value};
|
5
5
|
|
6
6
|
impl RbSeries {
|
7
|
+
pub fn any(&self, ignore_nulls: bool) -> RbResult<Option<bool>> {
|
8
|
+
let binding = self.series.borrow();
|
9
|
+
let s = binding.bool().map_err(RbPolarsErr::from)?;
|
10
|
+
Ok(if ignore_nulls {
|
11
|
+
Some(s.any())
|
12
|
+
} else {
|
13
|
+
s.any_kleene()
|
14
|
+
})
|
15
|
+
}
|
16
|
+
|
17
|
+
pub fn all(&self, ignore_nulls: bool) -> RbResult<Option<bool>> {
|
18
|
+
let binding = self.series.borrow();
|
19
|
+
let s = binding.bool().map_err(RbPolarsErr::from)?;
|
20
|
+
Ok(if ignore_nulls {
|
21
|
+
Some(s.all())
|
22
|
+
} else {
|
23
|
+
s.all_kleene()
|
24
|
+
})
|
25
|
+
}
|
26
|
+
|
7
27
|
pub fn arg_max(&self) -> Option<usize> {
|
8
28
|
self.series.borrow().arg_max()
|
9
29
|
}
|
@@ -17,6 +37,7 @@ impl RbSeries {
|
|
17
37
|
self.series
|
18
38
|
.borrow()
|
19
39
|
.max_as_series()
|
40
|
+
.map_err(RbPolarsErr::from)?
|
20
41
|
.get(0)
|
21
42
|
.map_err(RbPolarsErr::from)?,
|
22
43
|
)
|
@@ -48,6 +69,7 @@ impl RbSeries {
|
|
48
69
|
self.series
|
49
70
|
.borrow()
|
50
71
|
.min_as_series()
|
72
|
+
.map_err(RbPolarsErr::from)?
|
51
73
|
.get(0)
|
52
74
|
.map_err(RbPolarsErr::from)?,
|
53
75
|
)
|
@@ -75,6 +97,7 @@ impl RbSeries {
|
|
75
97
|
self.series
|
76
98
|
.borrow()
|
77
99
|
.sum_as_series()
|
100
|
+
.map_err(RbPolarsErr::from)?
|
78
101
|
.get(0)
|
79
102
|
.map_err(RbPolarsErr::from)?,
|
80
103
|
)
|
@@ -106,7 +106,7 @@ impl RbSeries {
|
|
106
106
|
Ok(s.into())
|
107
107
|
}
|
108
108
|
|
109
|
-
pub fn new_str(name: String, val: Wrap<
|
109
|
+
pub fn new_str(name: String, val: Wrap<StringChunked>, _strict: bool) -> Self {
|
110
110
|
let mut s = val.0.into_series();
|
111
111
|
s.rename(&name);
|
112
112
|
RbSeries::new(s)
|
@@ -9,8 +9,8 @@ impl RbSeries {
|
|
9
9
|
pub fn to_numo(&self) -> RbResult<Value> {
|
10
10
|
let s = &self.series.borrow();
|
11
11
|
match s.dtype() {
|
12
|
-
DataType::
|
13
|
-
let ca = s.
|
12
|
+
DataType::String => {
|
13
|
+
let ca = s.str().unwrap();
|
14
14
|
|
15
15
|
// TODO make more efficient
|
16
16
|
let np_arr = RArray::from_iter(ca);
|
@@ -3,7 +3,7 @@ mod arithmetic;
|
|
3
3
|
mod comparison;
|
4
4
|
mod construction;
|
5
5
|
mod export;
|
6
|
-
mod
|
6
|
+
mod scatter;
|
7
7
|
|
8
8
|
use magnus::{exception, prelude::*, value::qnil, Error, IntoValue, RArray, Value};
|
9
9
|
use polars::prelude::*;
|
@@ -74,13 +74,31 @@ impl RbSeries {
|
|
74
74
|
}
|
75
75
|
}
|
76
76
|
|
77
|
+
pub fn cat_uses_lexical_ordering(&self) -> RbResult<bool> {
|
78
|
+
let binding = self.series.borrow();
|
79
|
+
let ca = binding.categorical().map_err(RbPolarsErr::from)?;
|
80
|
+
Ok(ca.uses_lexical_ordering())
|
81
|
+
}
|
82
|
+
|
83
|
+
pub fn cat_is_local(&self) -> RbResult<bool> {
|
84
|
+
let binding = self.series.borrow();
|
85
|
+
let ca = binding.categorical().map_err(RbPolarsErr::from)?;
|
86
|
+
Ok(ca.get_rev_map().is_local())
|
87
|
+
}
|
88
|
+
|
89
|
+
pub fn cat_to_local(&self) -> RbResult<Self> {
|
90
|
+
let binding = self.series.borrow();
|
91
|
+
let ca = binding.categorical().map_err(RbPolarsErr::from)?;
|
92
|
+
Ok(ca.to_local().into_series().into())
|
93
|
+
}
|
94
|
+
|
77
95
|
pub fn estimated_size(&self) -> usize {
|
78
96
|
self.series.borrow().estimated_size()
|
79
97
|
}
|
80
98
|
|
81
99
|
pub fn get_fmt(&self, index: usize, str_lengths: usize) -> String {
|
82
100
|
let val = format!("{}", self.series.borrow().get(index).unwrap());
|
83
|
-
if let DataType::
|
101
|
+
if let DataType::String | DataType::Categorical(_, _) = self.series.borrow().dtype() {
|
84
102
|
let v_trunc = &val[..val
|
85
103
|
.char_indices()
|
86
104
|
.take(str_lengths)
|
@@ -90,7 +108,7 @@ impl RbSeries {
|
|
90
108
|
if val == v_trunc {
|
91
109
|
val
|
92
110
|
} else {
|
93
|
-
format!("{}
|
111
|
+
format!("{}…", v_trunc)
|
94
112
|
}
|
95
113
|
} else {
|
96
114
|
val
|
@@ -215,8 +233,8 @@ impl RbSeries {
|
|
215
233
|
}
|
216
234
|
}
|
217
235
|
|
218
|
-
pub fn sort(&self,
|
219
|
-
(self.series.borrow_mut().sort(
|
236
|
+
pub fn sort(&self, descending: bool, nulls_last: bool) -> Self {
|
237
|
+
(self.series.borrow_mut().sort(descending, nulls_last)).into()
|
220
238
|
}
|
221
239
|
|
222
240
|
pub fn value_counts(&self, sorted: bool) -> RbResult<RbDataFrame> {
|
@@ -273,15 +291,13 @@ impl RbSeries {
|
|
273
291
|
Ok(s.into())
|
274
292
|
}
|
275
293
|
|
276
|
-
pub fn
|
294
|
+
pub fn equals(&self, other: &RbSeries, null_equal: bool, strict: bool) -> bool {
|
277
295
|
if strict {
|
278
296
|
self.series.borrow().eq(&other.series.borrow())
|
279
297
|
} else if null_equal {
|
280
|
-
self.series
|
281
|
-
.borrow()
|
282
|
-
.series_equal_missing(&other.series.borrow())
|
298
|
+
self.series.borrow().equals_missing(&other.series.borrow())
|
283
299
|
} else {
|
284
|
-
self.series.borrow().
|
300
|
+
self.series.borrow().equals(&other.series.borrow())
|
285
301
|
}
|
286
302
|
}
|
287
303
|
|
@@ -315,10 +331,10 @@ impl RbSeries {
|
|
315
331
|
DataType::Int64 => RArray::from_iter(series.i64().unwrap()).into_value(),
|
316
332
|
DataType::Float32 => RArray::from_iter(series.f32().unwrap()).into_value(),
|
317
333
|
DataType::Float64 => RArray::from_iter(series.f64().unwrap()).into_value(),
|
318
|
-
DataType::Categorical(_) => {
|
334
|
+
DataType::Categorical(_, _) | DataType::Enum(_, _) => {
|
319
335
|
RArray::from_iter(series.categorical().unwrap().iter_str()).into_value()
|
320
336
|
}
|
321
|
-
DataType::Object(_) => {
|
337
|
+
DataType::Object(_, _) => {
|
322
338
|
let v = RArray::with_capacity(series.len());
|
323
339
|
for i in 0..series.len() {
|
324
340
|
let obj: Option<&ObjectValue> = series.get_object(i).map(|any| any.into());
|
@@ -377,8 +393,8 @@ impl RbSeries {
|
|
377
393
|
let ca = series.decimal().unwrap();
|
378
394
|
return Wrap(ca).into_value();
|
379
395
|
}
|
380
|
-
DataType::
|
381
|
-
let ca = series.
|
396
|
+
DataType::String => {
|
397
|
+
let ca = series.str().unwrap();
|
382
398
|
return Wrap(ca).into_value();
|
383
399
|
}
|
384
400
|
DataType::Struct(_) => {
|
@@ -417,7 +433,10 @@ impl RbSeries {
|
|
417
433
|
RArray::from_iter(NullIter { iter, n }).into_value()
|
418
434
|
}
|
419
435
|
DataType::Unknown => {
|
420
|
-
panic!("to_a not implemented for
|
436
|
+
panic!("to_a not implemented for unknown")
|
437
|
+
}
|
438
|
+
DataType::BinaryOffset => {
|
439
|
+
unreachable!()
|
421
440
|
}
|
422
441
|
};
|
423
442
|
rblist
|
@@ -442,7 +461,7 @@ impl RbSeries {
|
|
442
461
|
|
443
462
|
macro_rules! dispatch_apply {
|
444
463
|
($self:expr, $method:ident, $($args:expr),*) => {
|
445
|
-
if matches!($self.dtype(), DataType::Object(_)) {
|
464
|
+
if matches!($self.dtype(), DataType::Object(_, _)) {
|
446
465
|
// let ca = $self.0.unpack::<ObjectType<ObjectValue>>().unwrap();
|
447
466
|
// ca.$method($($args),*)
|
448
467
|
todo!()
|
@@ -463,7 +482,7 @@ impl RbSeries {
|
|
463
482
|
DataType::Datetime(_, _)
|
464
483
|
| DataType::Date
|
465
484
|
| DataType::Duration(_)
|
466
|
-
| DataType::Categorical(_)
|
485
|
+
| DataType::Categorical(_, _)
|
467
486
|
| DataType::Time
|
468
487
|
) || !skip_nulls
|
469
488
|
{
|
@@ -604,12 +623,12 @@ impl RbSeries {
|
|
604
623
|
)?;
|
605
624
|
ca.into_datetime(tu, tz).into_series()
|
606
625
|
}
|
607
|
-
Some(DataType::
|
626
|
+
Some(DataType::String) => {
|
608
627
|
let ca = dispatch_apply!(series, apply_lambda_with_utf8_out_type, lambda, 0, None)?;
|
609
628
|
|
610
629
|
ca.into_series()
|
611
630
|
}
|
612
|
-
Some(DataType::Object(_)) => {
|
631
|
+
Some(DataType::Object(_, _)) => {
|
613
632
|
let ca =
|
614
633
|
dispatch_apply!(series, apply_lambda_with_object_out_type, lambda, 0, None)?;
|
615
634
|
ca.into_series()
|
@@ -656,8 +675,13 @@ impl RbSeries {
|
|
656
675
|
self.series.borrow_mut().shrink_to_fit();
|
657
676
|
}
|
658
677
|
|
659
|
-
pub fn dot(&self, other: &RbSeries) ->
|
660
|
-
self
|
678
|
+
pub fn dot(&self, other: &RbSeries) -> RbResult<f64> {
|
679
|
+
let out = self
|
680
|
+
.series
|
681
|
+
.borrow()
|
682
|
+
.dot(&other.series.borrow())
|
683
|
+
.map_err(RbPolarsErr::from)?;
|
684
|
+
Ok(out)
|
661
685
|
}
|
662
686
|
|
663
687
|
pub fn skew(&self, bias: bool) -> RbResult<Option<f64>> {
|
@@ -5,9 +5,9 @@ use crate::error::RbPolarsErr;
|
|
5
5
|
use crate::{RbResult, RbSeries};
|
6
6
|
|
7
7
|
impl RbSeries {
|
8
|
-
pub fn
|
8
|
+
pub fn scatter(&self, idx: &RbSeries, values: &RbSeries) -> RbResult<()> {
|
9
9
|
let mut s = self.series.borrow_mut();
|
10
|
-
match
|
10
|
+
match scatter(s.clone(), &idx.series.borrow(), &values.series.borrow()) {
|
11
11
|
Ok(out) => {
|
12
12
|
*s = out;
|
13
13
|
Ok(())
|
@@ -17,7 +17,7 @@ impl RbSeries {
|
|
17
17
|
}
|
18
18
|
}
|
19
19
|
|
20
|
-
fn
|
20
|
+
fn scatter(mut s: Series, idx: &Series, values: &Series) -> PolarsResult<Series> {
|
21
21
|
let logical_dtype = s.dtype().clone();
|
22
22
|
let idx = idx.cast(&IDX_DTYPE)?;
|
23
23
|
let idx = idx.rechunk();
|
@@ -43,62 +43,62 @@ fn set_at_idx(mut s: Series, idx: &Series, values: &Series) -> PolarsResult<Seri
|
|
43
43
|
DataType::Int8 => {
|
44
44
|
let ca: &mut ChunkedArray<Int8Type> = mutable_s.as_mut();
|
45
45
|
let values = values.i8()?;
|
46
|
-
std::mem::take(ca).
|
46
|
+
std::mem::take(ca).scatter(idx, values)
|
47
47
|
}
|
48
48
|
DataType::Int16 => {
|
49
49
|
let ca: &mut ChunkedArray<Int16Type> = mutable_s.as_mut();
|
50
50
|
let values = values.i16()?;
|
51
|
-
std::mem::take(ca).
|
51
|
+
std::mem::take(ca).scatter(idx, values)
|
52
52
|
}
|
53
53
|
DataType::Int32 => {
|
54
54
|
let ca: &mut ChunkedArray<Int32Type> = mutable_s.as_mut();
|
55
55
|
let values = values.i32()?;
|
56
|
-
std::mem::take(ca).
|
56
|
+
std::mem::take(ca).scatter(idx, values)
|
57
57
|
}
|
58
58
|
DataType::Int64 => {
|
59
59
|
let ca: &mut ChunkedArray<Int64Type> = mutable_s.as_mut();
|
60
60
|
let values = values.i64()?;
|
61
|
-
std::mem::take(ca).
|
61
|
+
std::mem::take(ca).scatter(idx, values)
|
62
62
|
}
|
63
63
|
DataType::UInt8 => {
|
64
64
|
let ca: &mut ChunkedArray<UInt8Type> = mutable_s.as_mut();
|
65
65
|
let values = values.u8()?;
|
66
|
-
std::mem::take(ca).
|
66
|
+
std::mem::take(ca).scatter(idx, values)
|
67
67
|
}
|
68
68
|
DataType::UInt16 => {
|
69
69
|
let ca: &mut ChunkedArray<UInt16Type> = mutable_s.as_mut();
|
70
70
|
let values = values.u16()?;
|
71
|
-
std::mem::take(ca).
|
71
|
+
std::mem::take(ca).scatter(idx, values)
|
72
72
|
}
|
73
73
|
DataType::UInt32 => {
|
74
74
|
let ca: &mut ChunkedArray<UInt32Type> = mutable_s.as_mut();
|
75
75
|
let values = values.u32()?;
|
76
|
-
std::mem::take(ca).
|
76
|
+
std::mem::take(ca).scatter(idx, values)
|
77
77
|
}
|
78
78
|
DataType::UInt64 => {
|
79
79
|
let ca: &mut ChunkedArray<UInt64Type> = mutable_s.as_mut();
|
80
80
|
let values = values.u64()?;
|
81
|
-
std::mem::take(ca).
|
81
|
+
std::mem::take(ca).scatter(idx, values)
|
82
82
|
}
|
83
83
|
DataType::Float32 => {
|
84
84
|
let ca: &mut ChunkedArray<Float32Type> = mutable_s.as_mut();
|
85
85
|
let values = values.f32()?;
|
86
|
-
std::mem::take(ca).
|
86
|
+
std::mem::take(ca).scatter(idx, values)
|
87
87
|
}
|
88
88
|
DataType::Float64 => {
|
89
89
|
let ca: &mut ChunkedArray<Float64Type> = mutable_s.as_mut();
|
90
90
|
let values = values.f64()?;
|
91
|
-
std::mem::take(ca).
|
91
|
+
std::mem::take(ca).scatter(idx, values)
|
92
92
|
}
|
93
93
|
DataType::Boolean => {
|
94
94
|
let ca = s.bool()?;
|
95
95
|
let values = values.bool()?;
|
96
|
-
ca.
|
96
|
+
ca.scatter(idx, values)
|
97
97
|
}
|
98
|
-
DataType::
|
99
|
-
let ca = s.
|
100
|
-
let values = values.
|
101
|
-
ca.
|
98
|
+
DataType::String => {
|
99
|
+
let ca = s.str()?;
|
100
|
+
let values = values.str()?;
|
101
|
+
ca.scatter(idx, values)
|
102
102
|
}
|
103
103
|
_ => panic!("not yet implemented for dtype: {}", logical_dtype),
|
104
104
|
};
|
data/ext/polars/src/utils.rs
CHANGED
@@ -23,7 +23,7 @@ macro_rules! apply_method_all_arrow_series2 {
|
|
23
23
|
($self:expr, $method:ident, $($args:expr),*) => {
|
24
24
|
match $self.dtype() {
|
25
25
|
DataType::Boolean => $self.bool().unwrap().$method($($args),*),
|
26
|
-
DataType::
|
26
|
+
DataType::String => $self.str().unwrap().$method($($args),*),
|
27
27
|
DataType::UInt8 => $self.u8().unwrap().$method($($args),*),
|
28
28
|
DataType::UInt16 => $self.u16().unwrap().$method($($args),*),
|
29
29
|
DataType::UInt32 => $self.u32().unwrap().$method($($args),*),
|