polars-df 0.1.1 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.yardopts +3 -0
- data/CHANGELOG.md +8 -0
- data/Cargo.lock +2 -1
- data/README.md +1 -1
- data/ext/polars/Cargo.toml +7 -1
- data/ext/polars/src/batched_csv.rs +120 -0
- data/ext/polars/src/conversion.rs +139 -6
- data/ext/polars/src/dataframe.rs +360 -15
- data/ext/polars/src/error.rs +9 -0
- data/ext/polars/src/file.rs +8 -7
- data/ext/polars/src/lazy/apply.rs +7 -0
- data/ext/polars/src/lazy/dataframe.rs +135 -3
- data/ext/polars/src/lazy/dsl.rs +97 -2
- data/ext/polars/src/lazy/meta.rs +1 -1
- data/ext/polars/src/lazy/mod.rs +1 -0
- data/ext/polars/src/lib.rs +227 -12
- data/ext/polars/src/series.rs +190 -38
- data/ext/polars/src/set.rs +91 -0
- data/ext/polars/src/utils.rs +19 -0
- data/lib/polars/batched_csv_reader.rb +96 -0
- data/lib/polars/cat_expr.rb +39 -0
- data/lib/polars/data_frame.rb +2813 -100
- data/lib/polars/date_time_expr.rb +1282 -7
- data/lib/polars/exceptions.rb +20 -0
- data/lib/polars/expr.rb +631 -11
- data/lib/polars/expr_dispatch.rb +14 -0
- data/lib/polars/functions.rb +219 -0
- data/lib/polars/group_by.rb +517 -0
- data/lib/polars/io.rb +763 -4
- data/lib/polars/lazy_frame.rb +1415 -67
- data/lib/polars/lazy_functions.rb +430 -9
- data/lib/polars/lazy_group_by.rb +79 -0
- data/lib/polars/list_expr.rb +5 -0
- data/lib/polars/meta_expr.rb +21 -0
- data/lib/polars/series.rb +2244 -192
- data/lib/polars/slice.rb +104 -0
- data/lib/polars/string_expr.rb +663 -2
- data/lib/polars/struct_expr.rb +73 -0
- data/lib/polars/utils.rb +76 -3
- data/lib/polars/version.rb +2 -1
- data/lib/polars/when.rb +1 -0
- data/lib/polars/when_then.rb +1 -0
- data/lib/polars.rb +8 -2
- metadata +12 -2
data/ext/polars/src/lazy/dsl.rs
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
use magnus::{RArray, RString, Value};
|
1
|
+
use magnus::{class, RArray, RString, Value};
|
2
2
|
use polars::chunked_array::ops::SortOptions;
|
3
3
|
use polars::lazy::dsl;
|
4
4
|
use polars::lazy::dsl::Operator;
|
@@ -6,8 +6,10 @@ use polars::prelude::*;
|
|
6
6
|
use polars::series::ops::NullBehavior;
|
7
7
|
|
8
8
|
use crate::conversion::*;
|
9
|
+
use crate::lazy::apply::*;
|
9
10
|
use crate::lazy::utils::rb_exprs_to_exprs;
|
10
|
-
use crate::
|
11
|
+
use crate::utils::reinterpret;
|
12
|
+
use crate::{RbResult, RbSeries};
|
11
13
|
|
12
14
|
#[magnus::wrap(class = "Polars::RbExpr")]
|
13
15
|
#[derive(Clone)]
|
@@ -885,6 +887,19 @@ impl RbExpr {
|
|
885
887
|
self.inner.clone().dt().round(&every, &offset).into()
|
886
888
|
}
|
887
889
|
|
890
|
+
pub fn reinterpret(&self, signed: bool) -> Self {
|
891
|
+
let function = move |s: Series| reinterpret(&s, signed);
|
892
|
+
let dt = if signed {
|
893
|
+
DataType::Int64
|
894
|
+
} else {
|
895
|
+
DataType::UInt64
|
896
|
+
};
|
897
|
+
self.clone()
|
898
|
+
.inner
|
899
|
+
.map(function, GetOutput::from_type(dt))
|
900
|
+
.into()
|
901
|
+
}
|
902
|
+
|
888
903
|
pub fn mode(&self) -> Self {
|
889
904
|
self.inner.clone().mode().into()
|
890
905
|
}
|
@@ -901,6 +916,10 @@ impl RbExpr {
|
|
901
916
|
self.inner.clone().suffix(&suffix).into()
|
902
917
|
}
|
903
918
|
|
919
|
+
pub fn exclude(&self, columns: Vec<String>) -> Self {
|
920
|
+
self.inner.clone().exclude(columns).into()
|
921
|
+
}
|
922
|
+
|
904
923
|
pub fn interpolate(&self) -> Self {
|
905
924
|
self.inner.clone().interpolate().into()
|
906
925
|
}
|
@@ -1300,6 +1319,21 @@ impl RbExpr {
|
|
1300
1319
|
self.inner.clone().ewm_var(options).into()
|
1301
1320
|
}
|
1302
1321
|
|
1322
|
+
pub fn extend_constant(&self, value: Wrap<AnyValue>, n: usize) -> Self {
|
1323
|
+
let value = Value::from(value);
|
1324
|
+
self.inner
|
1325
|
+
.clone()
|
1326
|
+
.apply(
|
1327
|
+
move |s| {
|
1328
|
+
let value = value.try_convert::<Wrap<AnyValue>>().unwrap().0;
|
1329
|
+
s.extend_constant(value, n)
|
1330
|
+
},
|
1331
|
+
GetOutput::same_type(),
|
1332
|
+
)
|
1333
|
+
.with_fmt("extend")
|
1334
|
+
.into()
|
1335
|
+
}
|
1336
|
+
|
1303
1337
|
pub fn any(&self) -> Self {
|
1304
1338
|
self.inner.clone().any().into()
|
1305
1339
|
}
|
@@ -1327,18 +1361,61 @@ impl RbExpr {
|
|
1327
1361
|
pub fn exp(&self) -> Self {
|
1328
1362
|
self.inner.clone().exp().into()
|
1329
1363
|
}
|
1364
|
+
|
1365
|
+
pub fn entropy(&self, base: f64, normalize: bool) -> Self {
|
1366
|
+
self.inner.clone().entropy(base, normalize).into()
|
1367
|
+
}
|
1330
1368
|
}
|
1331
1369
|
|
1332
1370
|
pub fn col(name: String) -> RbExpr {
|
1333
1371
|
dsl::col(&name).into()
|
1334
1372
|
}
|
1335
1373
|
|
1374
|
+
pub fn count() -> RbExpr {
|
1375
|
+
dsl::count().into()
|
1376
|
+
}
|
1377
|
+
|
1378
|
+
pub fn first() -> RbExpr {
|
1379
|
+
dsl::first().into()
|
1380
|
+
}
|
1381
|
+
|
1382
|
+
pub fn last() -> RbExpr {
|
1383
|
+
dsl::last().into()
|
1384
|
+
}
|
1385
|
+
|
1386
|
+
pub fn cols(names: Vec<String>) -> RbExpr {
|
1387
|
+
dsl::cols(names).into()
|
1388
|
+
}
|
1389
|
+
|
1390
|
+
pub fn fold(acc: &RbExpr, lambda: Value, exprs: RArray) -> RbResult<RbExpr> {
|
1391
|
+
let exprs = rb_exprs_to_exprs(exprs)?;
|
1392
|
+
|
1393
|
+
let func = move |a: Series, b: Series| binary_lambda(lambda, a, b);
|
1394
|
+
Ok(polars::lazy::dsl::fold_exprs(acc.inner.clone(), func, exprs).into())
|
1395
|
+
}
|
1396
|
+
|
1336
1397
|
// TODO improve
|
1337
1398
|
pub fn lit(value: Value) -> RbResult<RbExpr> {
|
1338
1399
|
if value.is_nil() {
|
1339
1400
|
Ok(dsl::lit(Null {}).into())
|
1401
|
+
} else if let Ok(series) = value.try_convert::<&RbSeries>() {
|
1402
|
+
Ok(dsl::lit(series.series.borrow().clone()).into())
|
1340
1403
|
} else if let Some(v) = RString::from_value(value) {
|
1341
1404
|
Ok(dsl::lit(v.try_convert::<String>()?).into())
|
1405
|
+
} else if value.is_kind_of(class::integer()) {
|
1406
|
+
match value.try_convert::<i64>() {
|
1407
|
+
Ok(val) => {
|
1408
|
+
if val > 0 && val < i32::MAX as i64 || val < 0 && val > i32::MIN as i64 {
|
1409
|
+
Ok(dsl::lit(val as i32).into())
|
1410
|
+
} else {
|
1411
|
+
Ok(dsl::lit(val).into())
|
1412
|
+
}
|
1413
|
+
}
|
1414
|
+
_ => {
|
1415
|
+
let val = value.try_convert::<u64>()?;
|
1416
|
+
Ok(dsl::lit(val).into())
|
1417
|
+
}
|
1418
|
+
}
|
1342
1419
|
} else {
|
1343
1420
|
Ok(dsl::lit(value.try_convert::<f64>()?).into())
|
1344
1421
|
}
|
@@ -1348,6 +1425,14 @@ pub fn arange(low: &RbExpr, high: &RbExpr, step: usize) -> RbExpr {
|
|
1348
1425
|
polars::lazy::dsl::arange(low.inner.clone(), high.inner.clone(), step).into()
|
1349
1426
|
}
|
1350
1427
|
|
1428
|
+
pub fn repeat(value: Value, n_times: &RbExpr) -> RbResult<RbExpr> {
|
1429
|
+
if value.is_nil() {
|
1430
|
+
Ok(polars::lazy::dsl::repeat(Null {}, n_times.inner.clone()).into())
|
1431
|
+
} else {
|
1432
|
+
todo!();
|
1433
|
+
}
|
1434
|
+
}
|
1435
|
+
|
1351
1436
|
#[magnus::wrap(class = "Polars::RbWhen")]
|
1352
1437
|
#[derive(Clone)]
|
1353
1438
|
pub struct RbWhen {
|
@@ -1387,3 +1472,13 @@ impl RbWhenThen {
|
|
1387
1472
|
pub fn when(predicate: &RbExpr) -> RbWhen {
|
1388
1473
|
dsl::when(predicate.inner.clone()).into()
|
1389
1474
|
}
|
1475
|
+
|
1476
|
+
pub fn concat_str(s: RArray, sep: String) -> RbResult<RbExpr> {
|
1477
|
+
let s = rb_exprs_to_exprs(s)?;
|
1478
|
+
Ok(dsl::concat_str(s, &sep).into())
|
1479
|
+
}
|
1480
|
+
|
1481
|
+
pub fn concat_lst(s: RArray) -> RbResult<RbExpr> {
|
1482
|
+
let s = rb_exprs_to_exprs(s)?;
|
1483
|
+
Ok(dsl::concat_lst(s).into())
|
1484
|
+
}
|
data/ext/polars/src/lazy/meta.rs
CHANGED
data/ext/polars/src/lazy/mod.rs
CHANGED
data/ext/polars/src/lib.rs
CHANGED
@@ -1,21 +1,30 @@
|
|
1
|
+
mod batched_csv;
|
1
2
|
mod conversion;
|
2
3
|
mod dataframe;
|
3
4
|
mod error;
|
4
5
|
mod file;
|
5
6
|
mod lazy;
|
6
7
|
mod series;
|
8
|
+
mod set;
|
9
|
+
mod utils;
|
7
10
|
|
8
|
-
use
|
11
|
+
use batched_csv::RbBatchedCsv;
|
12
|
+
use conversion::*;
|
9
13
|
use dataframe::RbDataFrame;
|
10
14
|
use error::{RbPolarsErr, RbValueError};
|
15
|
+
use file::get_file_like;
|
11
16
|
use lazy::dataframe::{RbLazyFrame, RbLazyGroupBy};
|
12
17
|
use lazy::dsl::{RbExpr, RbWhen, RbWhenThen};
|
18
|
+
use lazy::utils::rb_exprs_to_exprs;
|
13
19
|
use magnus::{
|
14
|
-
define_module, function, memoize, method, prelude::*, Error, RArray, RClass, RModule,
|
20
|
+
define_module, function, memoize, method, prelude::*, Error, RArray, RClass, RHash, RModule,
|
21
|
+
Value,
|
15
22
|
};
|
23
|
+
use polars::datatypes::{DataType, TimeUnit};
|
16
24
|
use polars::error::PolarsResult;
|
17
25
|
use polars::frame::DataFrame;
|
18
26
|
use polars::functions::{diag_concat_df, hor_concat_df};
|
27
|
+
use polars::prelude::{ClosedWindow, Duration, IntoSeries, TimeZone};
|
19
28
|
use series::RbSeries;
|
20
29
|
|
21
30
|
type RbResult<T> = Result<T, Error>;
|
@@ -34,11 +43,22 @@ fn init() -> RbResult<()> {
|
|
34
43
|
module.define_singleton_method("_concat_df", function!(concat_df, 1))?;
|
35
44
|
module.define_singleton_method("_diag_concat_df", function!(rb_diag_concat_df, 1))?;
|
36
45
|
module.define_singleton_method("_hor_concat_df", function!(rb_hor_concat_df, 1))?;
|
46
|
+
module.define_singleton_method("_concat_series", function!(concat_series, 1))?;
|
47
|
+
module.define_singleton_method("_ipc_schema", function!(ipc_schema, 1))?;
|
48
|
+
module.define_singleton_method("_parquet_schema", function!(parquet_schema, 1))?;
|
49
|
+
module.define_singleton_method("_rb_date_range", function!(rb_date_range, 7))?;
|
50
|
+
module.define_singleton_method("_as_struct", function!(as_struct, 1))?;
|
51
|
+
module.define_singleton_method("_arg_where", function!(arg_where, 1))?;
|
52
|
+
|
53
|
+
let class = module.define_class("RbBatchedCsv", Default::default())?;
|
54
|
+
class.define_singleton_method("new", function!(RbBatchedCsv::new, -1))?;
|
55
|
+
class.define_method("next_batches", method!(RbBatchedCsv::next_batches, 1))?;
|
37
56
|
|
38
57
|
let class = module.define_class("RbDataFrame", Default::default())?;
|
39
58
|
class.define_singleton_method("new", function!(RbDataFrame::init, 1))?;
|
40
|
-
class.define_singleton_method("read_csv", function!(RbDataFrame::read_csv,
|
41
|
-
class.define_singleton_method("read_parquet", function!(RbDataFrame::read_parquet,
|
59
|
+
class.define_singleton_method("read_csv", function!(RbDataFrame::read_csv, -1))?;
|
60
|
+
class.define_singleton_method("read_parquet", function!(RbDataFrame::read_parquet, 7))?;
|
61
|
+
class.define_singleton_method("read_ipc", function!(RbDataFrame::read_ipc, 6))?;
|
42
62
|
class.define_singleton_method("read_hash", function!(RbDataFrame::read_hash, 1))?;
|
43
63
|
class.define_singleton_method("read_json", function!(RbDataFrame::read_json, 1))?;
|
44
64
|
class.define_singleton_method("read_ndjson", function!(RbDataFrame::read_ndjson, 1))?;
|
@@ -46,7 +66,22 @@ fn init() -> RbResult<()> {
|
|
46
66
|
class.define_method("write_json", method!(RbDataFrame::write_json, 3))?;
|
47
67
|
class.define_method("write_ndjson", method!(RbDataFrame::write_ndjson, 1))?;
|
48
68
|
class.define_method("write_csv", method!(RbDataFrame::write_csv, 10))?;
|
69
|
+
class.define_method("write_ipc", method!(RbDataFrame::write_ipc, 2))?;
|
70
|
+
class.define_method("row_tuple", method!(RbDataFrame::row_tuple, 1))?;
|
71
|
+
class.define_method("row_tuples", method!(RbDataFrame::row_tuples, 0))?;
|
49
72
|
class.define_method("write_parquet", method!(RbDataFrame::write_parquet, 5))?;
|
73
|
+
class.define_method("add", method!(RbDataFrame::add, 1))?;
|
74
|
+
class.define_method("sub", method!(RbDataFrame::sub, 1))?;
|
75
|
+
class.define_method("div", method!(RbDataFrame::div, 1))?;
|
76
|
+
class.define_method("mul", method!(RbDataFrame::mul, 1))?;
|
77
|
+
class.define_method("rem", method!(RbDataFrame::rem, 1))?;
|
78
|
+
class.define_method("add_df", method!(RbDataFrame::add_df, 1))?;
|
79
|
+
class.define_method("sub_df", method!(RbDataFrame::sub_df, 1))?;
|
80
|
+
class.define_method("div_df", method!(RbDataFrame::div_df, 1))?;
|
81
|
+
class.define_method("mul_df", method!(RbDataFrame::mul_df, 1))?;
|
82
|
+
class.define_method("rem_df", method!(RbDataFrame::rem_df, 1))?;
|
83
|
+
class.define_method("sample_n", method!(RbDataFrame::sample_n, 4))?;
|
84
|
+
class.define_method("sample_frac", method!(RbDataFrame::sample_frac, 4))?;
|
50
85
|
class.define_method("rechunk", method!(RbDataFrame::rechunk, 0))?;
|
51
86
|
class.define_method("to_s", method!(RbDataFrame::to_s, 0))?;
|
52
87
|
class.define_method("get_columns", method!(RbDataFrame::get_columns, 0))?;
|
@@ -60,7 +95,19 @@ fn init() -> RbResult<()> {
|
|
60
95
|
class.define_method("shape", method!(RbDataFrame::shape, 0))?;
|
61
96
|
class.define_method("height", method!(RbDataFrame::height, 0))?;
|
62
97
|
class.define_method("width", method!(RbDataFrame::width, 0))?;
|
98
|
+
class.define_method("hstack_mut", method!(RbDataFrame::hstack_mut, 1))?;
|
99
|
+
class.define_method("hstack", method!(RbDataFrame::hstack, 1))?;
|
100
|
+
class.define_method("extend", method!(RbDataFrame::extend, 1))?;
|
101
|
+
class.define_method("vstack_mut", method!(RbDataFrame::vstack_mut, 1))?;
|
102
|
+
class.define_method("vstack", method!(RbDataFrame::vstack, 1))?;
|
103
|
+
class.define_method("drop_in_place", method!(RbDataFrame::drop_in_place, 1))?;
|
104
|
+
class.define_method("drop_nulls", method!(RbDataFrame::drop_nulls, 1))?;
|
105
|
+
class.define_method("drop", method!(RbDataFrame::drop, 1))?;
|
63
106
|
class.define_method("select_at_idx", method!(RbDataFrame::select_at_idx, 1))?;
|
107
|
+
class.define_method(
|
108
|
+
"find_idx_by_name",
|
109
|
+
method!(RbDataFrame::find_idx_by_name, 1),
|
110
|
+
)?;
|
64
111
|
class.define_method("column", method!(RbDataFrame::column, 1))?;
|
65
112
|
class.define_method("select", method!(RbDataFrame::select, 1))?;
|
66
113
|
class.define_method("take", method!(RbDataFrame::take, 1))?;
|
@@ -102,6 +149,7 @@ fn init() -> RbResult<()> {
|
|
102
149
|
class.define_method("shrink_to_fit", method!(RbDataFrame::shrink_to_fit, 0))?;
|
103
150
|
class.define_method("transpose", method!(RbDataFrame::transpose, 2))?;
|
104
151
|
class.define_method("upsample", method!(RbDataFrame::upsample, 5))?;
|
152
|
+
class.define_method("to_struct", method!(RbDataFrame::to_struct, 1))?;
|
105
153
|
class.define_method("unnest", method!(RbDataFrame::unnest, 1))?;
|
106
154
|
|
107
155
|
let class = module.define_class("RbExpr", Default::default())?;
|
@@ -290,10 +338,12 @@ fn init() -> RbResult<()> {
|
|
290
338
|
class.define_method("dt_tz_localize", method!(RbExpr::dt_tz_localize, 1))?;
|
291
339
|
class.define_method("dt_truncate", method!(RbExpr::dt_truncate, 2))?;
|
292
340
|
class.define_method("dt_round", method!(RbExpr::dt_round, 2))?;
|
341
|
+
class.define_method("reinterpret", method!(RbExpr::reinterpret, 1))?;
|
293
342
|
class.define_method("mode", method!(RbExpr::mode, 0))?;
|
294
343
|
class.define_method("keep_name", method!(RbExpr::keep_name, 0))?;
|
295
344
|
class.define_method("prefix", method!(RbExpr::prefix, 1))?;
|
296
345
|
class.define_method("suffix", method!(RbExpr::suffix, 1))?;
|
346
|
+
class.define_method("exclude", method!(RbExpr::exclude, 1))?;
|
297
347
|
class.define_method("interpolate", method!(RbExpr::interpolate, 0))?;
|
298
348
|
class.define_method("rolling_sum", method!(RbExpr::rolling_sum, 6))?;
|
299
349
|
class.define_method("rolling_min", method!(RbExpr::rolling_min, 6))?;
|
@@ -338,6 +388,7 @@ fn init() -> RbResult<()> {
|
|
338
388
|
class.define_method("ewm_mean", method!(RbExpr::ewm_mean, 3))?;
|
339
389
|
class.define_method("ewm_std", method!(RbExpr::ewm_std, 4))?;
|
340
390
|
class.define_method("ewm_var", method!(RbExpr::ewm_var, 4))?;
|
391
|
+
class.define_method("extend_constant", method!(RbExpr::extend_constant, 2))?;
|
341
392
|
class.define_method("any", method!(RbExpr::any, 0))?;
|
342
393
|
class.define_method("all", method!(RbExpr::all, 0))?;
|
343
394
|
class.define_method(
|
@@ -354,6 +405,7 @@ fn init() -> RbResult<()> {
|
|
354
405
|
)?;
|
355
406
|
class.define_method("log", method!(RbExpr::log, 1))?;
|
356
407
|
class.define_method("exp", method!(RbExpr::exp, 0))?;
|
408
|
+
class.define_method("entropy", method!(RbExpr::entropy, 2))?;
|
357
409
|
|
358
410
|
// meta
|
359
411
|
class.define_method("meta_pop", method!(RbExpr::meta_pop, 0))?;
|
@@ -364,11 +416,29 @@ fn init() -> RbResult<()> {
|
|
364
416
|
|
365
417
|
// maybe add to different class
|
366
418
|
class.define_singleton_method("col", function!(crate::lazy::dsl::col, 1))?;
|
419
|
+
class.define_singleton_method("count", function!(crate::lazy::dsl::count, 0))?;
|
420
|
+
class.define_singleton_method("first", function!(crate::lazy::dsl::first, 0))?;
|
421
|
+
class.define_singleton_method("last", function!(crate::lazy::dsl::last, 0))?;
|
422
|
+
class.define_singleton_method("cols", function!(crate::lazy::dsl::cols, 1))?;
|
423
|
+
class.define_singleton_method("fold", function!(crate::lazy::dsl::fold, 3))?;
|
367
424
|
class.define_singleton_method("lit", function!(crate::lazy::dsl::lit, 1))?;
|
368
425
|
class.define_singleton_method("arange", function!(crate::lazy::dsl::arange, 3))?;
|
426
|
+
class.define_singleton_method("repeat", function!(crate::lazy::dsl::repeat, 2))?;
|
369
427
|
class.define_singleton_method("when", function!(crate::lazy::dsl::when, 1))?;
|
428
|
+
class.define_singleton_method("concat_str", function!(crate::lazy::dsl::concat_str, 2))?;
|
429
|
+
class.define_singleton_method("concat_lst", function!(crate::lazy::dsl::concat_lst, 1))?;
|
370
430
|
|
371
431
|
let class = module.define_class("RbLazyFrame", Default::default())?;
|
432
|
+
class.define_singleton_method(
|
433
|
+
"new_from_ndjson",
|
434
|
+
function!(RbLazyFrame::new_from_ndjson, 7),
|
435
|
+
)?;
|
436
|
+
class.define_singleton_method("new_from_csv", function!(RbLazyFrame::new_from_csv, -1))?;
|
437
|
+
class.define_singleton_method(
|
438
|
+
"new_from_parquet",
|
439
|
+
function!(RbLazyFrame::new_from_parquet, 7),
|
440
|
+
)?;
|
441
|
+
class.define_singleton_method("new_from_ipc", function!(RbLazyFrame::new_from_ipc, 6))?;
|
372
442
|
class.define_method("write_json", method!(RbLazyFrame::write_json, 1))?;
|
373
443
|
class.define_method("describe_plan", method!(RbLazyFrame::describe_plan, 0))?;
|
374
444
|
class.define_method(
|
@@ -437,6 +507,7 @@ fn init() -> RbResult<()> {
|
|
437
507
|
class.define_singleton_method("new_opt_f32", function!(RbSeries::new_opt_f32, 3))?;
|
438
508
|
class.define_singleton_method("new_opt_f64", function!(RbSeries::new_opt_f64, 3))?;
|
439
509
|
class.define_singleton_method("new_str", function!(RbSeries::new_str, 3))?;
|
510
|
+
class.define_singleton_method("new_opt_date", function!(RbSeries::new_opt_date, 3))?;
|
440
511
|
class.define_method("is_sorted_flag", method!(RbSeries::is_sorted_flag, 0))?;
|
441
512
|
class.define_method(
|
442
513
|
"is_sorted_reverse_flag",
|
@@ -504,14 +575,85 @@ fn init() -> RbResult<()> {
|
|
504
575
|
class.define_method("kurtosis", method!(RbSeries::kurtosis, 2))?;
|
505
576
|
class.define_method("cast", method!(RbSeries::cast, 2))?;
|
506
577
|
class.define_method("time_unit", method!(RbSeries::time_unit, 0))?;
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
class.define_method("
|
511
|
-
class.define_method("
|
512
|
-
class.define_method("
|
513
|
-
class.define_method("
|
514
|
-
class.define_method("
|
578
|
+
class.define_method("set_at_idx", method!(RbSeries::set_at_idx, 2))?;
|
579
|
+
|
580
|
+
// eq
|
581
|
+
class.define_method("eq_u8", method!(RbSeries::eq_u8, 1))?;
|
582
|
+
class.define_method("eq_u16", method!(RbSeries::eq_u16, 1))?;
|
583
|
+
class.define_method("eq_u32", method!(RbSeries::eq_u32, 1))?;
|
584
|
+
class.define_method("eq_u64", method!(RbSeries::eq_u64, 1))?;
|
585
|
+
class.define_method("eq_i8", method!(RbSeries::eq_i8, 1))?;
|
586
|
+
class.define_method("eq_i16", method!(RbSeries::eq_i16, 1))?;
|
587
|
+
class.define_method("eq_i32", method!(RbSeries::eq_i32, 1))?;
|
588
|
+
class.define_method("eq_i64", method!(RbSeries::eq_i64, 1))?;
|
589
|
+
class.define_method("eq_f32", method!(RbSeries::eq_f32, 1))?;
|
590
|
+
class.define_method("eq_f64", method!(RbSeries::eq_f64, 1))?;
|
591
|
+
// class.define_method("eq_str", method!(RbSeries::eq_str, 1))?;
|
592
|
+
|
593
|
+
// neq
|
594
|
+
class.define_method("neq_u8", method!(RbSeries::neq_u8, 1))?;
|
595
|
+
class.define_method("neq_u16", method!(RbSeries::neq_u16, 1))?;
|
596
|
+
class.define_method("neq_u32", method!(RbSeries::neq_u32, 1))?;
|
597
|
+
class.define_method("neq_u64", method!(RbSeries::neq_u64, 1))?;
|
598
|
+
class.define_method("neq_i8", method!(RbSeries::neq_i8, 1))?;
|
599
|
+
class.define_method("neq_i16", method!(RbSeries::neq_i16, 1))?;
|
600
|
+
class.define_method("neq_i32", method!(RbSeries::neq_i32, 1))?;
|
601
|
+
class.define_method("neq_i64", method!(RbSeries::neq_i64, 1))?;
|
602
|
+
class.define_method("neq_f32", method!(RbSeries::neq_f32, 1))?;
|
603
|
+
class.define_method("neq_f64", method!(RbSeries::neq_f64, 1))?;
|
604
|
+
// class.define_method("neq_str", method!(RbSeries::neq_str, 1))?;
|
605
|
+
|
606
|
+
// gt
|
607
|
+
class.define_method("gt_u8", method!(RbSeries::gt_u8, 1))?;
|
608
|
+
class.define_method("gt_u16", method!(RbSeries::gt_u16, 1))?;
|
609
|
+
class.define_method("gt_u32", method!(RbSeries::gt_u32, 1))?;
|
610
|
+
class.define_method("gt_u64", method!(RbSeries::gt_u64, 1))?;
|
611
|
+
class.define_method("gt_i8", method!(RbSeries::gt_i8, 1))?;
|
612
|
+
class.define_method("gt_i16", method!(RbSeries::gt_i16, 1))?;
|
613
|
+
class.define_method("gt_i32", method!(RbSeries::gt_i32, 1))?;
|
614
|
+
class.define_method("gt_i64", method!(RbSeries::gt_i64, 1))?;
|
615
|
+
class.define_method("gt_f32", method!(RbSeries::gt_f32, 1))?;
|
616
|
+
class.define_method("gt_f64", method!(RbSeries::gt_f64, 1))?;
|
617
|
+
// class.define_method("gt_str", method!(RbSeries::gt_str, 1))?;
|
618
|
+
|
619
|
+
// gt_eq
|
620
|
+
class.define_method("gt_eq_u8", method!(RbSeries::gt_eq_u8, 1))?;
|
621
|
+
class.define_method("gt_eq_u16", method!(RbSeries::gt_eq_u16, 1))?;
|
622
|
+
class.define_method("gt_eq_u32", method!(RbSeries::gt_eq_u32, 1))?;
|
623
|
+
class.define_method("gt_eq_u64", method!(RbSeries::gt_eq_u64, 1))?;
|
624
|
+
class.define_method("gt_eq_i8", method!(RbSeries::gt_eq_i8, 1))?;
|
625
|
+
class.define_method("gt_eq_i16", method!(RbSeries::gt_eq_i16, 1))?;
|
626
|
+
class.define_method("gt_eq_i32", method!(RbSeries::gt_eq_i32, 1))?;
|
627
|
+
class.define_method("gt_eq_i64", method!(RbSeries::gt_eq_i64, 1))?;
|
628
|
+
class.define_method("gt_eq_f32", method!(RbSeries::gt_eq_f32, 1))?;
|
629
|
+
class.define_method("gt_eq_f64", method!(RbSeries::gt_eq_f64, 1))?;
|
630
|
+
// class.define_method("gt_eq_str", method!(RbSeries::gt_eq_str, 1))?;
|
631
|
+
|
632
|
+
// lt
|
633
|
+
class.define_method("lt_u8", method!(RbSeries::lt_u8, 1))?;
|
634
|
+
class.define_method("lt_u16", method!(RbSeries::lt_u16, 1))?;
|
635
|
+
class.define_method("lt_u32", method!(RbSeries::lt_u32, 1))?;
|
636
|
+
class.define_method("lt_u64", method!(RbSeries::lt_u64, 1))?;
|
637
|
+
class.define_method("lt_i8", method!(RbSeries::lt_i8, 1))?;
|
638
|
+
class.define_method("lt_i16", method!(RbSeries::lt_i16, 1))?;
|
639
|
+
class.define_method("lt_i32", method!(RbSeries::lt_i32, 1))?;
|
640
|
+
class.define_method("lt_i64", method!(RbSeries::lt_i64, 1))?;
|
641
|
+
class.define_method("lt_f32", method!(RbSeries::lt_f32, 1))?;
|
642
|
+
class.define_method("lt_f64", method!(RbSeries::lt_f64, 1))?;
|
643
|
+
// class.define_method("lt_str", method!(RbSeries::lt_str, 1))?;
|
644
|
+
|
645
|
+
// lt_eq
|
646
|
+
class.define_method("lt_eq_u8", method!(RbSeries::lt_eq_u8, 1))?;
|
647
|
+
class.define_method("lt_eq_u16", method!(RbSeries::lt_eq_u16, 1))?;
|
648
|
+
class.define_method("lt_eq_u32", method!(RbSeries::lt_eq_u32, 1))?;
|
649
|
+
class.define_method("lt_eq_u64", method!(RbSeries::lt_eq_u64, 1))?;
|
650
|
+
class.define_method("lt_eq_i8", method!(RbSeries::lt_eq_i8, 1))?;
|
651
|
+
class.define_method("lt_eq_i16", method!(RbSeries::lt_eq_i16, 1))?;
|
652
|
+
class.define_method("lt_eq_i32", method!(RbSeries::lt_eq_i32, 1))?;
|
653
|
+
class.define_method("lt_eq_i64", method!(RbSeries::lt_eq_i64, 1))?;
|
654
|
+
class.define_method("lt_eq_f32", method!(RbSeries::lt_eq_f32, 1))?;
|
655
|
+
class.define_method("lt_eq_f64", method!(RbSeries::lt_eq_f64, 1))?;
|
656
|
+
// class.define_method("lt_eq_str", method!(RbSeries::lt_eq_str, 1))?;
|
515
657
|
|
516
658
|
let class = module.define_class("RbWhen", Default::default())?;
|
517
659
|
class.define_method("_then", method!(RbWhen::then, 1))?;
|
@@ -567,3 +709,76 @@ fn rb_hor_concat_df(seq: RArray) -> RbResult<RbDataFrame> {
|
|
567
709
|
let df = hor_concat_df(&dfs).map_err(RbPolarsErr::from)?;
|
568
710
|
Ok(df.into())
|
569
711
|
}
|
712
|
+
|
713
|
+
fn concat_series(seq: RArray) -> RbResult<RbSeries> {
|
714
|
+
let mut iter = seq.each();
|
715
|
+
let first = iter.next().unwrap()?;
|
716
|
+
|
717
|
+
let mut s = get_series(first)?;
|
718
|
+
|
719
|
+
for res in iter {
|
720
|
+
let item = res?;
|
721
|
+
let item = get_series(item)?;
|
722
|
+
s.append(&item).map_err(RbPolarsErr::from)?;
|
723
|
+
}
|
724
|
+
Ok(s.into())
|
725
|
+
}
|
726
|
+
|
727
|
+
fn ipc_schema(rb_f: Value) -> RbResult<Value> {
|
728
|
+
use polars::export::arrow::io::ipc::read::read_file_metadata;
|
729
|
+
let mut r = get_file_like(rb_f, false)?;
|
730
|
+
let metadata = read_file_metadata(&mut r).map_err(RbPolarsErr::arrow)?;
|
731
|
+
|
732
|
+
let dict = RHash::new();
|
733
|
+
for field in metadata.schema.fields {
|
734
|
+
let dt: Wrap<DataType> = Wrap((&field.data_type).into());
|
735
|
+
dict.aset(field.name, dt)?;
|
736
|
+
}
|
737
|
+
Ok(dict.into())
|
738
|
+
}
|
739
|
+
|
740
|
+
fn parquet_schema(rb_f: Value) -> RbResult<Value> {
|
741
|
+
use polars::export::arrow::io::parquet::read::{infer_schema, read_metadata};
|
742
|
+
|
743
|
+
let mut r = get_file_like(rb_f, false)?;
|
744
|
+
let metadata = read_metadata(&mut r).map_err(RbPolarsErr::arrow)?;
|
745
|
+
let arrow_schema = infer_schema(&metadata).map_err(RbPolarsErr::arrow)?;
|
746
|
+
|
747
|
+
let dict = RHash::new();
|
748
|
+
for field in arrow_schema.fields {
|
749
|
+
let dt: Wrap<DataType> = Wrap((&field.data_type).into());
|
750
|
+
dict.aset(field.name, dt)?;
|
751
|
+
}
|
752
|
+
Ok(dict.into())
|
753
|
+
}
|
754
|
+
|
755
|
+
fn rb_date_range(
|
756
|
+
start: i64,
|
757
|
+
stop: i64,
|
758
|
+
every: String,
|
759
|
+
closed: Wrap<ClosedWindow>,
|
760
|
+
name: String,
|
761
|
+
tu: Wrap<TimeUnit>,
|
762
|
+
tz: Option<TimeZone>,
|
763
|
+
) -> RbSeries {
|
764
|
+
polars::time::date_range_impl(
|
765
|
+
&name,
|
766
|
+
start,
|
767
|
+
stop,
|
768
|
+
Duration::parse(&every),
|
769
|
+
closed.0,
|
770
|
+
tu.0,
|
771
|
+
tz,
|
772
|
+
)
|
773
|
+
.into_series()
|
774
|
+
.into()
|
775
|
+
}
|
776
|
+
|
777
|
+
fn as_struct(exprs: RArray) -> RbResult<RbExpr> {
|
778
|
+
let exprs = rb_exprs_to_exprs(exprs)?;
|
779
|
+
Ok(polars::lazy::dsl::as_struct(&exprs).into())
|
780
|
+
}
|
781
|
+
|
782
|
+
fn arg_where(condition: &RbExpr) -> RbExpr {
|
783
|
+
polars::lazy::dsl::arg_where(condition.inner.clone()).into()
|
784
|
+
}
|