polars-df 0.7.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.
- 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),*),
|