polars-df 0.2.5 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +14 -0
- data/Cargo.lock +290 -137
- data/Cargo.toml +1 -1
- data/README.md +40 -2
- data/ext/polars/Cargo.toml +5 -4
- data/ext/polars/src/apply/dataframe.rs +6 -6
- data/ext/polars/src/apply/series.rs +10 -10
- data/ext/polars/src/batched_csv.rs +6 -4
- data/ext/polars/src/conversion.rs +56 -17
- data/ext/polars/src/dataframe.rs +65 -43
- data/ext/polars/src/error.rs +16 -8
- data/ext/polars/src/file.rs +5 -4
- data/ext/polars/src/lazy/apply.rs +1 -1
- data/ext/polars/src/lazy/dataframe.rs +12 -6
- data/ext/polars/src/lazy/dsl.rs +99 -45
- data/ext/polars/src/lazy/meta.rs +10 -9
- data/ext/polars/src/lib.rs +33 -29
- data/ext/polars/src/numo.rs +57 -0
- data/ext/polars/src/object.rs +2 -1
- data/ext/polars/src/series.rs +67 -53
- data/lib/polars/cat_expr.rb +0 -4
- data/lib/polars/cat_name_space.rb +0 -4
- data/lib/polars/convert.rb +0 -7
- data/lib/polars/data_frame.rb +165 -209
- data/lib/polars/data_types.rb +4 -0
- data/lib/polars/date_time_expr.rb +19 -151
- data/lib/polars/date_time_name_space.rb +17 -17
- data/lib/polars/expr.rb +68 -315
- data/lib/polars/group_by.rb +79 -51
- data/lib/polars/io.rb +1 -1
- data/lib/polars/lazy_frame.rb +1 -103
- data/lib/polars/lazy_functions.rb +0 -26
- data/lib/polars/lazy_group_by.rb +0 -8
- data/lib/polars/list_expr.rb +5 -27
- data/lib/polars/list_name_space.rb +5 -8
- data/lib/polars/plot.rb +109 -0
- data/lib/polars/series.rb +61 -19
- data/lib/polars/string_expr.rb +20 -76
- data/lib/polars/string_name_space.rb +5 -15
- data/lib/polars/struct_expr.rb +0 -2
- data/lib/polars/version.rb +1 -1
- data/lib/polars.rb +1 -0
- metadata +5 -3
data/ext/polars/src/lib.rs
CHANGED
@@ -6,6 +6,7 @@ mod error;
|
|
6
6
|
mod file;
|
7
7
|
mod lazy;
|
8
8
|
mod list_construction;
|
9
|
+
mod numo;
|
9
10
|
mod object;
|
10
11
|
mod prelude;
|
11
12
|
pub(crate) mod rb_modules;
|
@@ -21,7 +22,7 @@ use file::get_file_like;
|
|
21
22
|
use lazy::dataframe::{RbLazyFrame, RbLazyGroupBy};
|
22
23
|
use lazy::dsl::{RbExpr, RbWhen, RbWhenThen};
|
23
24
|
use lazy::utils::rb_exprs_to_exprs;
|
24
|
-
use magnus::{define_module, function, method, prelude::*, Error, RArray, RHash, Value};
|
25
|
+
use magnus::{define_module, function, method, prelude::*, Error, IntoValue, RArray, RHash, Value};
|
25
26
|
use polars::datatypes::{DataType, TimeUnit, IDX_DTYPE};
|
26
27
|
use polars::error::PolarsResult;
|
27
28
|
use polars::frame::DataFrame;
|
@@ -87,6 +88,7 @@ fn init() -> RbResult<()> {
|
|
87
88
|
class.define_method("write_ipc", method!(RbDataFrame::write_ipc, 2))?;
|
88
89
|
class.define_method("row_tuple", method!(RbDataFrame::row_tuple, 1))?;
|
89
90
|
class.define_method("row_tuples", method!(RbDataFrame::row_tuples, 0))?;
|
91
|
+
class.define_method("to_numo", method!(RbDataFrame::to_numo, 0))?;
|
90
92
|
class.define_method("write_parquet", method!(RbDataFrame::write_parquet, 5))?;
|
91
93
|
class.define_method("add", method!(RbDataFrame::add, 1))?;
|
92
94
|
class.define_method("sub", method!(RbDataFrame::sub, 1))?;
|
@@ -146,7 +148,7 @@ fn init() -> RbResult<()> {
|
|
146
148
|
class.define_method("with_row_count", method!(RbDataFrame::with_row_count, 2))?;
|
147
149
|
class.define_method("_clone", method!(RbDataFrame::clone, 0))?;
|
148
150
|
class.define_method("melt", method!(RbDataFrame::melt, 4))?;
|
149
|
-
class.define_method("pivot_expr", method!(RbDataFrame::pivot_expr,
|
151
|
+
class.define_method("pivot_expr", method!(RbDataFrame::pivot_expr, 7))?;
|
150
152
|
class.define_method("partition_by", method!(RbDataFrame::partition_by, 2))?;
|
151
153
|
class.define_method("shift", method!(RbDataFrame::shift, 1))?;
|
152
154
|
class.define_method("unique", method!(RbDataFrame::unique, 3))?;
|
@@ -163,7 +165,7 @@ fn init() -> RbResult<()> {
|
|
163
165
|
class.define_method("hmin", method!(RbDataFrame::hmin, 0))?;
|
164
166
|
class.define_method("hsum", method!(RbDataFrame::hsum, 1))?;
|
165
167
|
class.define_method("quantile", method!(RbDataFrame::quantile, 2))?;
|
166
|
-
class.define_method("to_dummies", method!(RbDataFrame::to_dummies,
|
168
|
+
class.define_method("to_dummies", method!(RbDataFrame::to_dummies, 2))?;
|
167
169
|
class.define_method("null_count", method!(RbDataFrame::null_count, 0))?;
|
168
170
|
class.define_method("apply", method!(RbDataFrame::apply, 3))?;
|
169
171
|
class.define_method("shrink_to_fit", method!(RbDataFrame::shrink_to_fit, 0))?;
|
@@ -221,7 +223,7 @@ fn init() -> RbResult<()> {
|
|
221
223
|
class.define_method("top_k", method!(RbExpr::top_k, 2))?;
|
222
224
|
class.define_method("arg_max", method!(RbExpr::arg_max, 0))?;
|
223
225
|
class.define_method("arg_min", method!(RbExpr::arg_min, 0))?;
|
224
|
-
class.define_method("search_sorted", method!(RbExpr::search_sorted,
|
226
|
+
class.define_method("search_sorted", method!(RbExpr::search_sorted, 2))?;
|
225
227
|
class.define_method("take", method!(RbExpr::take, 1))?;
|
226
228
|
class.define_method("sort_by", method!(RbExpr::sort_by, 2))?;
|
227
229
|
class.define_method("backward_fill", method!(RbExpr::backward_fill, 1))?;
|
@@ -284,7 +286,7 @@ fn init() -> RbResult<()> {
|
|
284
286
|
class.define_method("product", method!(RbExpr::product, 0))?;
|
285
287
|
class.define_method("shrink_dtype", method!(RbExpr::shrink_dtype, 0))?;
|
286
288
|
class.define_method("str_parse_date", method!(RbExpr::str_parse_date, 4))?;
|
287
|
-
class.define_method("str_parse_datetime", method!(RbExpr::str_parse_datetime,
|
289
|
+
class.define_method("str_parse_datetime", method!(RbExpr::str_parse_datetime, 6))?;
|
288
290
|
class.define_method("str_parse_time", method!(RbExpr::str_parse_time, 4))?;
|
289
291
|
class.define_method("str_strip", method!(RbExpr::str_strip, 1))?;
|
290
292
|
class.define_method("str_rstrip", method!(RbExpr::str_rstrip, 1))?;
|
@@ -299,7 +301,7 @@ fn init() -> RbResult<()> {
|
|
299
301
|
class.define_method("str_zfill", method!(RbExpr::str_zfill, 1))?;
|
300
302
|
class.define_method("str_ljust", method!(RbExpr::str_ljust, 2))?;
|
301
303
|
class.define_method("str_rjust", method!(RbExpr::str_rjust, 2))?;
|
302
|
-
class.define_method("str_contains", method!(RbExpr::str_contains,
|
304
|
+
class.define_method("str_contains", method!(RbExpr::str_contains, 3))?;
|
303
305
|
class.define_method("str_ends_with", method!(RbExpr::str_ends_with, 1))?;
|
304
306
|
class.define_method("str_starts_with", method!(RbExpr::str_starts_with, 1))?;
|
305
307
|
class.define_method("str_hex_encode", method!(RbExpr::str_hex_encode, 0))?;
|
@@ -361,9 +363,15 @@ fn init() -> RbResult<()> {
|
|
361
363
|
class.define_method("dt_offset_by", method!(RbExpr::dt_offset_by, 1))?;
|
362
364
|
class.define_method("dt_epoch_seconds", method!(RbExpr::dt_epoch_seconds, 0))?;
|
363
365
|
class.define_method("dt_with_time_unit", method!(RbExpr::dt_with_time_unit, 1))?;
|
364
|
-
class.define_method(
|
366
|
+
class.define_method(
|
367
|
+
"dt_convert_time_zone",
|
368
|
+
method!(RbExpr::dt_convert_time_zone, 1),
|
369
|
+
)?;
|
365
370
|
class.define_method("dt_cast_time_unit", method!(RbExpr::dt_cast_time_unit, 1))?;
|
366
|
-
class.define_method(
|
371
|
+
class.define_method(
|
372
|
+
"dt_replace_time_zone",
|
373
|
+
method!(RbExpr::dt_replace_time_zone, 1),
|
374
|
+
)?;
|
367
375
|
class.define_method("dt_tz_localize", method!(RbExpr::dt_tz_localize, 1))?;
|
368
376
|
class.define_method("dt_truncate", method!(RbExpr::dt_truncate, 2))?;
|
369
377
|
class.define_method("dt_round", method!(RbExpr::dt_round, 2))?;
|
@@ -418,9 +426,9 @@ fn init() -> RbResult<()> {
|
|
418
426
|
class.define_method("shuffle", method!(RbExpr::shuffle, 1))?;
|
419
427
|
class.define_method("sample_n", method!(RbExpr::sample_n, 4))?;
|
420
428
|
class.define_method("sample_frac", method!(RbExpr::sample_frac, 4))?;
|
421
|
-
class.define_method("ewm_mean", method!(RbExpr::ewm_mean,
|
422
|
-
class.define_method("ewm_std", method!(RbExpr::ewm_std,
|
423
|
-
class.define_method("ewm_var", method!(RbExpr::ewm_var,
|
429
|
+
class.define_method("ewm_mean", method!(RbExpr::ewm_mean, 4))?;
|
430
|
+
class.define_method("ewm_std", method!(RbExpr::ewm_std, 5))?;
|
431
|
+
class.define_method("ewm_var", method!(RbExpr::ewm_var, 5))?;
|
424
432
|
class.define_method("extend_constant", method!(RbExpr::extend_constant, 2))?;
|
425
433
|
class.define_method("any", method!(RbExpr::any, 0))?;
|
426
434
|
class.define_method("all", method!(RbExpr::all, 0))?;
|
@@ -613,7 +621,7 @@ fn init() -> RbResult<()> {
|
|
613
621
|
class.define_method("_clone", method!(RbSeries::clone, 0))?;
|
614
622
|
class.define_method("apply_lambda", method!(RbSeries::apply_lambda, 3))?;
|
615
623
|
class.define_method("zip_with", method!(RbSeries::zip_with, 2))?;
|
616
|
-
class.define_method("to_dummies", method!(RbSeries::to_dummies,
|
624
|
+
class.define_method("to_dummies", method!(RbSeries::to_dummies, 1))?;
|
617
625
|
class.define_method("peak_max", method!(RbSeries::peak_max, 0))?;
|
618
626
|
class.define_method("peak_min", method!(RbSeries::peak_min, 0))?;
|
619
627
|
class.define_method("n_unique", method!(RbSeries::n_unique, 0))?;
|
@@ -777,6 +785,9 @@ fn init() -> RbResult<()> {
|
|
777
785
|
class.define_method("lt_eq_f64", method!(RbSeries::lt_eq_f64, 1))?;
|
778
786
|
// class.define_method("lt_eq_str", method!(RbSeries::lt_eq_str, 1))?;
|
779
787
|
|
788
|
+
// npy
|
789
|
+
class.define_method("to_numo", method!(RbSeries::to_numo, 0))?;
|
790
|
+
|
780
791
|
let class = module.define_class("RbWhen", Default::default())?;
|
781
792
|
class.define_method("_then", method!(RbWhen::then, 1))?;
|
782
793
|
|
@@ -922,23 +933,16 @@ fn parquet_schema(rb_f: Value) -> RbResult<Value> {
|
|
922
933
|
Ok(dict.into())
|
923
934
|
}
|
924
935
|
|
925
|
-
fn collect_all(lfs: RArray) -> RbResult<
|
926
|
-
use polars_core::utils::rayon::prelude::*;
|
927
|
-
|
936
|
+
fn collect_all(lfs: RArray) -> RbResult<RArray> {
|
928
937
|
let lfs = lfs
|
929
938
|
.each()
|
930
939
|
.map(|v| v?.try_convert::<&RbLazyFrame>())
|
931
940
|
.collect::<RbResult<Vec<&RbLazyFrame>>>()?;
|
932
941
|
|
933
|
-
|
934
|
-
|
935
|
-
|
936
|
-
|
937
|
-
Ok(RbDataFrame::new(df))
|
938
|
-
})
|
939
|
-
.collect::<polars_core::error::PolarsResult<Vec<_>>>()
|
940
|
-
.map_err(RbPolarsErr::from)
|
941
|
-
})
|
942
|
+
Ok(RArray::from_iter(lfs.iter().map(|lf| {
|
943
|
+
let df = lf.ldf.clone().collect().unwrap();
|
944
|
+
RbDataFrame::new(df)
|
945
|
+
})))
|
942
946
|
}
|
943
947
|
|
944
948
|
fn rb_date_range(
|
@@ -949,8 +953,8 @@ fn rb_date_range(
|
|
949
953
|
name: String,
|
950
954
|
tu: Wrap<TimeUnit>,
|
951
955
|
tz: Option<TimeZone>,
|
952
|
-
) -> RbSeries {
|
953
|
-
polars::time::date_range_impl(
|
956
|
+
) -> RbResult<RbSeries> {
|
957
|
+
let date_range = polars::time::date_range_impl(
|
954
958
|
&name,
|
955
959
|
start,
|
956
960
|
stop,
|
@@ -959,8 +963,8 @@ fn rb_date_range(
|
|
959
963
|
tu.0,
|
960
964
|
tz.as_ref(),
|
961
965
|
)
|
962
|
-
.
|
963
|
-
.into()
|
966
|
+
.map_err(RbPolarsErr::from)?;
|
967
|
+
Ok(date_range.into_series().into())
|
964
968
|
}
|
965
969
|
|
966
970
|
fn coalesce_exprs(exprs: RArray) -> RbResult<RbExpr> {
|
@@ -983,5 +987,5 @@ fn arg_where(condition: &RbExpr) -> RbExpr {
|
|
983
987
|
}
|
984
988
|
|
985
989
|
fn get_idx_type() -> Value {
|
986
|
-
Wrap(IDX_DTYPE).
|
990
|
+
Wrap(IDX_DTYPE).into_value()
|
987
991
|
}
|
@@ -0,0 +1,57 @@
|
|
1
|
+
use magnus::{class, Module, RArray, RClass, RModule, Value};
|
2
|
+
use polars_core::prelude::*;
|
3
|
+
|
4
|
+
use crate::{raise_err, RbPolarsErr, RbResult, RbSeries};
|
5
|
+
|
6
|
+
impl RbSeries {
|
7
|
+
/// For numeric types, this should only be called for Series with null types.
|
8
|
+
/// This will cast to floats so that `nil = NAN`
|
9
|
+
pub fn to_numo(&self) -> RbResult<Value> {
|
10
|
+
let s = &self.series.borrow();
|
11
|
+
match s.dtype() {
|
12
|
+
DataType::Utf8 => {
|
13
|
+
let ca = s.utf8().unwrap();
|
14
|
+
|
15
|
+
// TODO make more efficient
|
16
|
+
let np_arr = RArray::from_iter(ca.into_iter());
|
17
|
+
class::object()
|
18
|
+
.const_get::<_, RModule>("Numo")?
|
19
|
+
.const_get::<_, RClass>("RObject")?
|
20
|
+
.funcall("cast", (np_arr,))
|
21
|
+
}
|
22
|
+
dt if dt.is_numeric() => {
|
23
|
+
if s.bit_repr_is_large() {
|
24
|
+
let s = s.cast(&DataType::Float64).unwrap();
|
25
|
+
let ca = s.f64().unwrap();
|
26
|
+
// TODO make more efficient
|
27
|
+
let np_arr = RArray::from_iter(ca.into_iter().map(|opt_v| match opt_v {
|
28
|
+
Some(v) => v,
|
29
|
+
None => f64::NAN,
|
30
|
+
}));
|
31
|
+
class::object()
|
32
|
+
.const_get::<_, RModule>("Numo")?
|
33
|
+
.const_get::<_, RClass>("DFloat")?
|
34
|
+
.funcall("cast", (np_arr,))
|
35
|
+
} else {
|
36
|
+
let s = s.cast(&DataType::Float32).unwrap();
|
37
|
+
let ca = s.f32().unwrap();
|
38
|
+
// TODO make more efficient
|
39
|
+
let np_arr = RArray::from_iter(ca.into_iter().map(|opt_v| match opt_v {
|
40
|
+
Some(v) => v,
|
41
|
+
None => f32::NAN,
|
42
|
+
}));
|
43
|
+
class::object()
|
44
|
+
.const_get::<_, RModule>("Numo")?
|
45
|
+
.const_get::<_, RClass>("SFloat")?
|
46
|
+
.funcall("cast", (np_arr,))
|
47
|
+
}
|
48
|
+
}
|
49
|
+
dt => {
|
50
|
+
raise_err!(
|
51
|
+
format!("'to_numo' not supported for dtype: {dt:?}"),
|
52
|
+
ComputeError
|
53
|
+
);
|
54
|
+
}
|
55
|
+
}
|
56
|
+
}
|
57
|
+
}
|
data/ext/polars/src/object.rs
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
use std::any::Any;
|
2
2
|
use std::sync::Arc;
|
3
3
|
|
4
|
+
use magnus::IntoValue;
|
4
5
|
use polars_core::chunked_array::object::builder::ObjectChunkedBuilder;
|
5
6
|
use polars_core::chunked_array::object::registry;
|
6
7
|
use polars_core::chunked_array::object::registry::AnonymousObjectBuilder;
|
@@ -20,7 +21,7 @@ pub(crate) fn register_object_builder() {
|
|
20
21
|
|
21
22
|
let object_converter = Arc::new(|av: AnyValue| {
|
22
23
|
let object = ObjectValue {
|
23
|
-
inner: Wrap(av).
|
24
|
+
inner: Wrap(av).into_value(),
|
24
25
|
};
|
25
26
|
Box::new(object) as Box<dyn Any>
|
26
27
|
});
|
data/ext/polars/src/series.rs
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
use magnus::exception
|
2
|
-
use magnus::{Error, RArray, Value};
|
1
|
+
use magnus::{exception, Error, IntoValue, RArray, Value};
|
3
2
|
use polars::prelude::*;
|
4
3
|
use polars::series::IsSorted;
|
5
4
|
use std::cell::RefCell;
|
@@ -30,11 +29,11 @@ impl RbSeries {
|
|
30
29
|
}
|
31
30
|
|
32
31
|
pub fn is_sorted_flag(&self) -> bool {
|
33
|
-
matches!(self.series.borrow().
|
32
|
+
matches!(self.series.borrow().is_sorted_flag(), IsSorted::Ascending)
|
34
33
|
}
|
35
34
|
|
36
35
|
pub fn is_sorted_reverse_flag(&self) -> bool {
|
37
|
-
matches!(self.series.borrow().
|
36
|
+
matches!(self.series.borrow().is_sorted_flag(), IsSorted::Descending)
|
38
37
|
}
|
39
38
|
|
40
39
|
pub fn new_opt_bool(name: String, obj: RArray, strict: bool) -> RbResult<RbSeries> {
|
@@ -173,7 +172,7 @@ impl RbSeries {
|
|
173
172
|
}
|
174
173
|
|
175
174
|
pub fn get_idx(&self, idx: usize) -> RbResult<Value> {
|
176
|
-
Ok(Wrap(self.series.borrow().get(idx).map_err(RbPolarsErr::from)?).
|
175
|
+
Ok(Wrap(self.series.borrow().get(idx).map_err(RbPolarsErr::from)?).into_value())
|
177
176
|
}
|
178
177
|
|
179
178
|
pub fn bitand(&self, other: &RbSeries) -> RbResult<Self> {
|
@@ -216,7 +215,7 @@ impl RbSeries {
|
|
216
215
|
}
|
217
216
|
|
218
217
|
pub fn dtype(&self) -> Value {
|
219
|
-
Wrap(self.series.borrow().dtype().clone()).
|
218
|
+
Wrap(self.series.borrow().dtype().clone()).into_value()
|
220
219
|
}
|
221
220
|
|
222
221
|
pub fn inner_dtype(&self) -> Option<Value> {
|
@@ -224,15 +223,15 @@ impl RbSeries {
|
|
224
223
|
.borrow()
|
225
224
|
.dtype()
|
226
225
|
.inner_dtype()
|
227
|
-
.map(|dt| Wrap(dt.clone()).
|
226
|
+
.map(|dt| Wrap(dt.clone()).into_value())
|
228
227
|
}
|
229
228
|
|
230
229
|
pub fn set_sorted(&self, reverse: bool) -> Self {
|
231
230
|
let mut out = self.series.borrow().clone();
|
232
231
|
if reverse {
|
233
|
-
out.
|
232
|
+
out.set_sorted_flag(IsSorted::Descending);
|
234
233
|
} else {
|
235
|
-
out.
|
234
|
+
out.set_sorted_flag(IsSorted::Ascending)
|
236
235
|
}
|
237
236
|
out.into()
|
238
237
|
}
|
@@ -255,7 +254,7 @@ impl RbSeries {
|
|
255
254
|
.get(0)
|
256
255
|
.map_err(RbPolarsErr::from)?,
|
257
256
|
)
|
258
|
-
.
|
257
|
+
.into_value())
|
259
258
|
}
|
260
259
|
|
261
260
|
pub fn min(&self) -> RbResult<Value> {
|
@@ -266,7 +265,7 @@ impl RbSeries {
|
|
266
265
|
.get(0)
|
267
266
|
.map_err(RbPolarsErr::from)?,
|
268
267
|
)
|
269
|
-
.
|
268
|
+
.into_value())
|
270
269
|
}
|
271
270
|
|
272
271
|
pub fn sum(&self) -> RbResult<Value> {
|
@@ -277,7 +276,7 @@ impl RbSeries {
|
|
277
276
|
.get(0)
|
278
277
|
.map_err(RbPolarsErr::from)?,
|
279
278
|
)
|
280
|
-
.
|
279
|
+
.into_value())
|
281
280
|
}
|
282
281
|
|
283
282
|
pub fn n_chunks(&self) -> usize {
|
@@ -288,7 +287,7 @@ impl RbSeries {
|
|
288
287
|
let mut binding = self.series.borrow_mut();
|
289
288
|
let res = binding.append(&other.series.borrow());
|
290
289
|
if let Err(e) = res {
|
291
|
-
Err(Error::runtime_error(e.to_string()))
|
290
|
+
Err(Error::new(exception::runtime_error(), e.to_string()))
|
292
291
|
} else {
|
293
292
|
Ok(())
|
294
293
|
}
|
@@ -304,7 +303,7 @@ impl RbSeries {
|
|
304
303
|
|
305
304
|
pub fn new_from_index(&self, index: usize, length: usize) -> RbResult<Self> {
|
306
305
|
if index >= self.series.borrow().len() {
|
307
|
-
Err(Error::new(arg_error(), "index is out of bounds"))
|
306
|
+
Err(Error::new(exception::arg_error(), "index is out of bounds"))
|
308
307
|
} else {
|
309
308
|
Ok(self.series.borrow().new_from_index(index, length).into())
|
310
309
|
}
|
@@ -316,7 +315,10 @@ impl RbSeries {
|
|
316
315
|
let series = self.series.borrow().filter(ca).unwrap();
|
317
316
|
Ok(series.into())
|
318
317
|
} else {
|
319
|
-
Err(Error::
|
318
|
+
Err(Error::new(
|
319
|
+
exception::runtime_error(),
|
320
|
+
"Expected a boolean mask".to_string(),
|
321
|
+
))
|
320
322
|
}
|
321
323
|
}
|
322
324
|
|
@@ -487,40 +489,52 @@ impl RbSeries {
|
|
487
489
|
}
|
488
490
|
|
489
491
|
pub fn to_a(&self) -> RArray {
|
490
|
-
let series = self.series.borrow();
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
492
|
+
let series = &self.series.borrow();
|
493
|
+
|
494
|
+
fn to_list_recursive(series: &Series) -> RArray {
|
495
|
+
let rblist = match series.dtype() {
|
496
|
+
DataType::Boolean => RArray::from_iter(series.bool().unwrap()),
|
497
|
+
DataType::UInt8 => RArray::from_iter(series.u8().unwrap()),
|
498
|
+
DataType::UInt16 => RArray::from_iter(series.u16().unwrap()),
|
499
|
+
DataType::UInt32 => RArray::from_iter(series.u32().unwrap()),
|
500
|
+
DataType::UInt64 => RArray::from_iter(series.u64().unwrap()),
|
501
|
+
DataType::Int8 => RArray::from_iter(series.i8().unwrap()),
|
502
|
+
DataType::Int16 => RArray::from_iter(series.i16().unwrap()),
|
503
|
+
DataType::Int32 => RArray::from_iter(series.i32().unwrap()),
|
504
|
+
DataType::Int64 => RArray::from_iter(series.i64().unwrap()),
|
505
|
+
DataType::Float32 => RArray::from_iter(series.f32().unwrap()),
|
506
|
+
DataType::Float64 => RArray::from_iter(series.f64().unwrap()),
|
507
|
+
DataType::Decimal128(_) => todo!(),
|
508
|
+
DataType::Categorical(_) => {
|
509
|
+
RArray::from_iter(series.categorical().unwrap().iter_str())
|
510
|
+
}
|
511
|
+
DataType::Date => {
|
512
|
+
let a = RArray::with_capacity(series.len());
|
513
|
+
for v in series.iter() {
|
514
|
+
a.push::<Value>(Wrap(v).into_value()).unwrap();
|
515
|
+
}
|
516
|
+
return a;
|
517
|
+
}
|
518
|
+
DataType::Datetime(_, _) => {
|
519
|
+
let a = RArray::with_capacity(series.len());
|
520
|
+
for v in series.iter() {
|
521
|
+
a.push::<Value>(Wrap(v).into_value()).unwrap();
|
522
|
+
}
|
523
|
+
return a;
|
524
|
+
}
|
525
|
+
DataType::Utf8 => {
|
526
|
+
let ca = series.utf8().unwrap();
|
527
|
+
return RArray::from_iter(ca);
|
528
|
+
}
|
529
|
+
DataType::Null | DataType::Unknown => {
|
530
|
+
panic!("to_a not implemented for null/unknown")
|
531
|
+
}
|
532
|
+
_ => todo!(),
|
533
|
+
};
|
534
|
+
rblist
|
523
535
|
}
|
536
|
+
|
537
|
+
to_list_recursive(series)
|
524
538
|
}
|
525
539
|
|
526
540
|
pub fn median(&self) -> Option<f64> {
|
@@ -546,7 +560,7 @@ impl RbSeries {
|
|
546
560
|
.get(0)
|
547
561
|
.unwrap_or(AnyValue::Null),
|
548
562
|
)
|
549
|
-
.
|
563
|
+
.into_value())
|
550
564
|
}
|
551
565
|
|
552
566
|
pub fn clone(&self) -> Self {
|
@@ -756,11 +770,11 @@ impl RbSeries {
|
|
756
770
|
Ok(RbSeries::new(s))
|
757
771
|
}
|
758
772
|
|
759
|
-
pub fn to_dummies(&self) -> RbResult<RbDataFrame> {
|
773
|
+
pub fn to_dummies(&self, sep: Option<String>) -> RbResult<RbDataFrame> {
|
760
774
|
let df = self
|
761
775
|
.series
|
762
776
|
.borrow()
|
763
|
-
.to_dummies()
|
777
|
+
.to_dummies(sep.as_deref())
|
764
778
|
.map_err(RbPolarsErr::from)?;
|
765
779
|
Ok(df.into())
|
766
780
|
}
|
@@ -1095,8 +1109,8 @@ pub fn to_series_collection(rs: RArray) -> RbResult<Vec<Series>> {
|
|
1095
1109
|
Ok(series)
|
1096
1110
|
}
|
1097
1111
|
|
1098
|
-
pub fn to_rbseries_collection(s: Vec<Series>) ->
|
1099
|
-
s.into_iter().map(RbSeries::new)
|
1112
|
+
pub fn to_rbseries_collection(s: Vec<Series>) -> RArray {
|
1113
|
+
RArray::from_iter(s.into_iter().map(RbSeries::new))
|
1100
1114
|
}
|
1101
1115
|
|
1102
1116
|
impl RbSeries {
|
data/lib/polars/cat_expr.rb
CHANGED
@@ -36,13 +36,9 @@ module Polars
|
|
36
36
|
# # │ cat ┆ i64 │
|
37
37
|
# # ╞══════╪══════╡
|
38
38
|
# # │ a ┆ 2 │
|
39
|
-
# # ├╌╌╌╌╌╌┼╌╌╌╌╌╌┤
|
40
39
|
# # │ b ┆ 3 │
|
41
|
-
# # ├╌╌╌╌╌╌┼╌╌╌╌╌╌┤
|
42
40
|
# # │ k ┆ 2 │
|
43
|
-
# # ├╌╌╌╌╌╌┼╌╌╌╌╌╌┤
|
44
41
|
# # │ z ┆ 1 │
|
45
|
-
# # ├╌╌╌╌╌╌┼╌╌╌╌╌╌┤
|
46
42
|
# # │ z ┆ 3 │
|
47
43
|
# # └──────┴──────┘
|
48
44
|
def set_ordering(ordering)
|
@@ -38,13 +38,9 @@ module Polars
|
|
38
38
|
# # │ cat ┆ i64 │
|
39
39
|
# # ╞══════╪══════╡
|
40
40
|
# # │ a ┆ 2 │
|
41
|
-
# # ├╌╌╌╌╌╌┼╌╌╌╌╌╌┤
|
42
41
|
# # │ b ┆ 3 │
|
43
|
-
# # ├╌╌╌╌╌╌┼╌╌╌╌╌╌┤
|
44
42
|
# # │ k ┆ 2 │
|
45
|
-
# # ├╌╌╌╌╌╌┼╌╌╌╌╌╌┤
|
46
43
|
# # │ z ┆ 1 │
|
47
|
-
# # ├╌╌╌╌╌╌┼╌╌╌╌╌╌┤
|
48
44
|
# # │ z ┆ 3 │
|
49
45
|
# # └──────┴──────┘
|
50
46
|
def set_ordering(ordering)
|
data/lib/polars/convert.rb
CHANGED
@@ -24,7 +24,6 @@ module Polars
|
|
24
24
|
# # │ i64 ┆ i64 │
|
25
25
|
# # ╞═════╪═════╡
|
26
26
|
# # │ 1 ┆ 3 │
|
27
|
-
# # ├╌╌╌╌╌┼╌╌╌╌╌┤
|
28
27
|
# # │ 2 ┆ 4 │
|
29
28
|
# # └─────┴─────┘
|
30
29
|
def from_hash(data, columns: nil)
|
@@ -54,9 +53,7 @@ module Polars
|
|
54
53
|
# # │ i64 ┆ i64 │
|
55
54
|
# # ╞═════╪═════╡
|
56
55
|
# # │ 1 ┆ 4 │
|
57
|
-
# # ├╌╌╌╌╌┼╌╌╌╌╌┤
|
58
56
|
# # │ 2 ┆ 5 │
|
59
|
-
# # ├╌╌╌╌╌┼╌╌╌╌╌┤
|
60
57
|
# # │ 3 ┆ 6 │
|
61
58
|
# # └─────┴─────┘
|
62
59
|
#
|
@@ -70,9 +67,7 @@ module Polars
|
|
70
67
|
# # │ i32 ┆ i64 │
|
71
68
|
# # ╞═════╪═════╡
|
72
69
|
# # │ 1 ┆ 4 │
|
73
|
-
# # ├╌╌╌╌╌┼╌╌╌╌╌┤
|
74
70
|
# # │ 2 ┆ 5 │
|
75
|
-
# # ├╌╌╌╌╌┼╌╌╌╌╌┤
|
76
71
|
# # │ 3 ┆ 6 │
|
77
72
|
# # └─────┴─────┘
|
78
73
|
#
|
@@ -85,9 +80,7 @@ module Polars
|
|
85
80
|
# # │ i64 ┆ i64 ┆ i32 │
|
86
81
|
# # ╞═════╪═════╪══════╡
|
87
82
|
# # │ 1 ┆ 4 ┆ null │
|
88
|
-
# # ├╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌┤
|
89
83
|
# # │ 2 ┆ 5 ┆ null │
|
90
|
-
# # ├╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌┤
|
91
84
|
# # │ 3 ┆ 6 ┆ null │
|
92
85
|
# # └─────┴─────┴──────┘
|
93
86
|
# def from_hashes(hashes, infer_schema_length: 50, schema: nil)
|