polars-df 0.1.1 → 0.1.3

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.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +3 -0
  3. data/CHANGELOG.md +8 -0
  4. data/Cargo.lock +2 -1
  5. data/README.md +1 -1
  6. data/ext/polars/Cargo.toml +7 -1
  7. data/ext/polars/src/batched_csv.rs +120 -0
  8. data/ext/polars/src/conversion.rs +139 -6
  9. data/ext/polars/src/dataframe.rs +360 -15
  10. data/ext/polars/src/error.rs +9 -0
  11. data/ext/polars/src/file.rs +8 -7
  12. data/ext/polars/src/lazy/apply.rs +7 -0
  13. data/ext/polars/src/lazy/dataframe.rs +135 -3
  14. data/ext/polars/src/lazy/dsl.rs +97 -2
  15. data/ext/polars/src/lazy/meta.rs +1 -1
  16. data/ext/polars/src/lazy/mod.rs +1 -0
  17. data/ext/polars/src/lib.rs +227 -12
  18. data/ext/polars/src/series.rs +190 -38
  19. data/ext/polars/src/set.rs +91 -0
  20. data/ext/polars/src/utils.rs +19 -0
  21. data/lib/polars/batched_csv_reader.rb +96 -0
  22. data/lib/polars/cat_expr.rb +39 -0
  23. data/lib/polars/data_frame.rb +2813 -100
  24. data/lib/polars/date_time_expr.rb +1282 -7
  25. data/lib/polars/exceptions.rb +20 -0
  26. data/lib/polars/expr.rb +631 -11
  27. data/lib/polars/expr_dispatch.rb +14 -0
  28. data/lib/polars/functions.rb +219 -0
  29. data/lib/polars/group_by.rb +517 -0
  30. data/lib/polars/io.rb +763 -4
  31. data/lib/polars/lazy_frame.rb +1415 -67
  32. data/lib/polars/lazy_functions.rb +430 -9
  33. data/lib/polars/lazy_group_by.rb +79 -0
  34. data/lib/polars/list_expr.rb +5 -0
  35. data/lib/polars/meta_expr.rb +21 -0
  36. data/lib/polars/series.rb +2244 -192
  37. data/lib/polars/slice.rb +104 -0
  38. data/lib/polars/string_expr.rb +663 -2
  39. data/lib/polars/struct_expr.rb +73 -0
  40. data/lib/polars/utils.rb +76 -3
  41. data/lib/polars/version.rb +2 -1
  42. data/lib/polars/when.rb +1 -0
  43. data/lib/polars/when_then.rb +1 -0
  44. data/lib/polars.rb +8 -2
  45. metadata +12 -2
@@ -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::RbResult;
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
+ }
@@ -7,7 +7,7 @@ impl RbExpr {
7
7
  .meta()
8
8
  .pop()
9
9
  .into_iter()
10
- .map(|v| RbExpr::from(v))
10
+ .map(RbExpr::from)
11
11
  .collect()
12
12
  }
13
13
 
@@ -1,3 +1,4 @@
1
+ pub mod apply;
1
2
  pub mod dataframe;
2
3
  pub mod dsl;
3
4
  pub mod meta;
@@ -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 conversion::get_df;
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, 2))?;
41
- class.define_singleton_method("read_parquet", function!(RbDataFrame::read_parquet, 1))?;
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
- // rest
508
- class.define_method("cumsum", method!(RbSeries::cumsum, 1))?;
509
- class.define_method("cummax", method!(RbSeries::cummax, 1))?;
510
- class.define_method("cummin", method!(RbSeries::cummin, 1))?;
511
- class.define_method("cumprod", method!(RbSeries::cumprod, 1))?;
512
- class.define_method("slice", method!(RbSeries::slice, 2))?;
513
- class.define_method("ceil", method!(RbSeries::ceil, 0))?;
514
- class.define_method("round", method!(RbSeries::round, 1))?;
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
+ }