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.
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
+ }