polars-df 0.7.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +41 -0
  3. data/Cargo.lock +353 -237
  4. data/Cargo.toml +0 -3
  5. data/LICENSE.txt +1 -1
  6. data/README.md +2 -2
  7. data/ext/polars/Cargo.toml +17 -6
  8. data/ext/polars/src/batched_csv.rs +6 -7
  9. data/ext/polars/src/conversion/anyvalue.rs +185 -0
  10. data/ext/polars/src/conversion/chunked_array.rs +140 -0
  11. data/ext/polars/src/{conversion.rs → conversion/mod.rs} +268 -347
  12. data/ext/polars/src/dataframe.rs +96 -116
  13. data/ext/polars/src/expr/array.rs +74 -0
  14. data/ext/polars/src/expr/categorical.rs +8 -1
  15. data/ext/polars/src/expr/datetime.rs +22 -56
  16. data/ext/polars/src/expr/general.rs +124 -37
  17. data/ext/polars/src/expr/list.rs +52 -4
  18. data/ext/polars/src/expr/meta.rs +48 -0
  19. data/ext/polars/src/expr/rolling.rs +16 -10
  20. data/ext/polars/src/expr/string.rs +68 -17
  21. data/ext/polars/src/expr/struct.rs +8 -4
  22. data/ext/polars/src/functions/aggregation.rs +6 -0
  23. data/ext/polars/src/functions/lazy.rs +103 -48
  24. data/ext/polars/src/functions/meta.rs +45 -1
  25. data/ext/polars/src/functions/range.rs +5 -10
  26. data/ext/polars/src/functions/string_cache.rs +14 -0
  27. data/ext/polars/src/{lazyframe.rs → lazyframe/mod.rs} +166 -41
  28. data/ext/polars/src/lib.rs +245 -187
  29. data/ext/polars/src/map/dataframe.rs +1 -1
  30. data/ext/polars/src/map/mod.rs +2 -2
  31. data/ext/polars/src/map/series.rs +6 -6
  32. data/ext/polars/src/object.rs +0 -30
  33. data/ext/polars/src/on_startup.rs +32 -0
  34. data/ext/polars/src/series/aggregation.rs +23 -0
  35. data/ext/polars/src/series/construction.rs +1 -1
  36. data/ext/polars/src/series/export.rs +2 -2
  37. data/ext/polars/src/{series.rs → series/mod.rs} +45 -21
  38. data/ext/polars/src/series/{set_at_idx.rs → scatter.rs} +18 -18
  39. data/ext/polars/src/utils.rs +1 -1
  40. data/lib/polars/array_expr.rb +449 -0
  41. data/lib/polars/array_name_space.rb +346 -0
  42. data/lib/polars/cat_expr.rb +24 -0
  43. data/lib/polars/cat_name_space.rb +75 -0
  44. data/lib/polars/config.rb +2 -2
  45. data/lib/polars/data_frame.rb +248 -108
  46. data/lib/polars/data_types.rb +195 -29
  47. data/lib/polars/date_time_expr.rb +41 -24
  48. data/lib/polars/date_time_name_space.rb +12 -12
  49. data/lib/polars/exceptions.rb +12 -1
  50. data/lib/polars/expr.rb +1080 -195
  51. data/lib/polars/functions/aggregation/horizontal.rb +246 -0
  52. data/lib/polars/functions/aggregation/vertical.rb +282 -0
  53. data/lib/polars/functions/as_datatype.rb +248 -0
  54. data/lib/polars/functions/col.rb +47 -0
  55. data/lib/polars/functions/eager.rb +182 -0
  56. data/lib/polars/functions/lazy.rb +1280 -0
  57. data/lib/polars/functions/len.rb +49 -0
  58. data/lib/polars/functions/lit.rb +35 -0
  59. data/lib/polars/functions/random.rb +16 -0
  60. data/lib/polars/functions/range/date_range.rb +103 -0
  61. data/lib/polars/functions/range/int_range.rb +51 -0
  62. data/lib/polars/functions/repeat.rb +144 -0
  63. data/lib/polars/functions/whenthen.rb +27 -0
  64. data/lib/polars/functions.rb +29 -416
  65. data/lib/polars/group_by.rb +3 -3
  66. data/lib/polars/io.rb +21 -28
  67. data/lib/polars/lazy_frame.rb +390 -76
  68. data/lib/polars/list_expr.rb +152 -6
  69. data/lib/polars/list_name_space.rb +102 -0
  70. data/lib/polars/meta_expr.rb +175 -7
  71. data/lib/polars/series.rb +557 -59
  72. data/lib/polars/sql_context.rb +1 -1
  73. data/lib/polars/string_cache.rb +75 -0
  74. data/lib/polars/string_expr.rb +412 -96
  75. data/lib/polars/string_name_space.rb +4 -4
  76. data/lib/polars/struct_expr.rb +1 -1
  77. data/lib/polars/struct_name_space.rb +1 -1
  78. data/lib/polars/testing.rb +507 -0
  79. data/lib/polars/utils.rb +64 -20
  80. data/lib/polars/version.rb +1 -1
  81. data/lib/polars.rb +15 -2
  82. metadata +40 -9
  83. data/lib/polars/lazy_functions.rb +0 -1197
@@ -1,7 +1,7 @@
1
1
  use polars::prelude::*;
2
2
 
3
3
  use crate::conversion::Wrap;
4
- use crate::RbExpr;
4
+ use crate::{RbExpr, RbPolarsErr, RbResult};
5
5
 
6
6
  impl RbExpr {
7
7
  pub fn str_concat(&self, delimiter: String, ignore_nulls: bool) -> Self {
@@ -107,8 +107,12 @@ impl RbExpr {
107
107
  .into()
108
108
  }
109
109
 
110
- pub fn str_slice(&self, start: i64, length: Option<u64>) -> Self {
111
- self.inner.clone().str().slice(start, length).into()
110
+ pub fn str_slice(&self, start: &Self, length: &Self) -> Self {
111
+ self.inner
112
+ .clone()
113
+ .str()
114
+ .slice(start.inner.clone(), length.inner.clone())
115
+ .into()
112
116
  }
113
117
 
114
118
  pub fn str_explode(&self) -> Self {
@@ -147,6 +151,10 @@ impl RbExpr {
147
151
  .into()
148
152
  }
149
153
 
154
+ pub fn str_reverse(&self) -> Self {
155
+ self.inner.clone().str().reverse().into()
156
+ }
157
+
150
158
  pub fn str_pad_start(&self, length: usize, fillchar: char) -> Self {
151
159
  self.clone().inner.str().pad_start(length, fillchar).into()
152
160
  }
@@ -155,8 +163,8 @@ impl RbExpr {
155
163
  self.clone().inner.str().pad_end(length, fillchar).into()
156
164
  }
157
165
 
158
- pub fn str_zfill(&self, alignment: usize) -> Self {
159
- self.clone().inner.str().zfill(alignment).into()
166
+ pub fn str_zfill(&self, length: &Self) -> Self {
167
+ self.clone().inner.str().zfill(length.inner.clone()).into()
160
168
  }
161
169
 
162
170
  pub fn str_contains(&self, pat: &RbExpr, literal: Option<bool>, strict: bool) -> Self {
@@ -192,7 +200,7 @@ impl RbExpr {
192
200
  self.clone()
193
201
  .inner
194
202
  .map(
195
- move |s| s.utf8().map(|s| Some(s.hex_encode().into_series())),
203
+ move |s| s.str().map(|s| Some(s.hex_encode().into_series())),
196
204
  GetOutput::same_type(),
197
205
  )
198
206
  .with_fmt("str.hex_encode")
@@ -203,7 +211,7 @@ impl RbExpr {
203
211
  self.clone()
204
212
  .inner
205
213
  .map(
206
- move |s| s.utf8()?.hex_decode(strict).map(|s| Some(s.into_series())),
214
+ move |s| s.str()?.hex_decode(strict).map(|s| Some(s.into_series())),
207
215
  GetOutput::same_type(),
208
216
  )
209
217
  .with_fmt("str.hex_decode")
@@ -214,7 +222,7 @@ impl RbExpr {
214
222
  self.clone()
215
223
  .inner
216
224
  .map(
217
- move |s| s.utf8().map(|s| Some(s.base64_encode().into_series())),
225
+ move |s| s.str().map(|s| Some(s.base64_encode().into_series())),
218
226
  GetOutput::same_type(),
219
227
  )
220
228
  .with_fmt("str.base64_encode")
@@ -226,7 +234,7 @@ impl RbExpr {
226
234
  .inner
227
235
  .map(
228
236
  move |s| {
229
- s.utf8()?
237
+ s.str()?
230
238
  .base64_decode(strict)
231
239
  .map(|s| Some(s.into_series()))
232
240
  },
@@ -245,7 +253,7 @@ impl RbExpr {
245
253
  .into()
246
254
  }
247
255
 
248
- pub fn str_json_extract(
256
+ pub fn str_json_decode(
249
257
  &self,
250
258
  dtype: Option<Wrap<DataType>>,
251
259
  infer_schema_len: Option<usize>,
@@ -258,8 +266,8 @@ impl RbExpr {
258
266
  };
259
267
 
260
268
  let function = move |s: Series| {
261
- let ca = s.utf8()?;
262
- match ca.json_extract(dtype.clone(), infer_schema_len) {
269
+ let ca = s.str()?;
270
+ match ca.json_decode(dtype.clone(), infer_schema_len) {
263
271
  Ok(ca) => Ok(Some(ca.into_series())),
264
272
  Err(e) => Err(PolarsError::ComputeError(format!("{e:?}").into())),
265
273
  }
@@ -268,13 +276,13 @@ impl RbExpr {
268
276
  self.clone()
269
277
  .inner
270
278
  .map(function, output_type)
271
- .with_fmt("str.json_extract")
279
+ .with_fmt("str.json_decode")
272
280
  .into()
273
281
  }
274
282
 
275
283
  pub fn str_json_path_match(&self, pat: String) -> Self {
276
284
  let function = move |s: Series| {
277
- let ca = s.utf8()?;
285
+ let ca = s.str()?;
278
286
  match ca.json_path_match(&pat) {
279
287
  Ok(ca) => Ok(Some(ca.into_series())),
280
288
  Err(e) => Err(PolarsError::ComputeError(format!("{:?}", e).into())),
@@ -282,13 +290,17 @@ impl RbExpr {
282
290
  };
283
291
  self.clone()
284
292
  .inner
285
- .map(function, GetOutput::from_type(DataType::Utf8))
293
+ .map(function, GetOutput::from_type(DataType::String))
286
294
  .with_fmt("str.json_path_match")
287
295
  .into()
288
296
  }
289
297
 
290
- pub fn str_extract(&self, pat: String, group_index: usize) -> Self {
291
- self.inner.clone().str().extract(&pat, group_index).into()
298
+ pub fn str_extract(&self, pat: &Self, group_index: usize) -> Self {
299
+ self.inner
300
+ .clone()
301
+ .str()
302
+ .extract(pat.inner.clone(), group_index)
303
+ .into()
292
304
  }
293
305
 
294
306
  pub fn str_extract_all(&self, pat: &RbExpr) -> Self {
@@ -299,6 +311,16 @@ impl RbExpr {
299
311
  .into()
300
312
  }
301
313
 
314
+ pub fn str_extract_groups(&self, pat: String) -> RbResult<Self> {
315
+ Ok(self
316
+ .inner
317
+ .clone()
318
+ .str()
319
+ .extract_groups(&pat)
320
+ .map_err(RbPolarsErr::from)?
321
+ .into())
322
+ }
323
+
302
324
  pub fn str_count_matches(&self, pat: &Self, literal: bool) -> Self {
303
325
  self.inner
304
326
  .clone()
@@ -338,4 +360,33 @@ impl RbExpr {
338
360
  pub fn str_splitn(&self, by: &Self, n: usize) -> Self {
339
361
  self.inner.clone().str().splitn(by.inner.clone(), n).into()
340
362
  }
363
+
364
+ pub fn str_to_decimal(&self, infer_len: usize) -> Self {
365
+ self.inner.clone().str().to_decimal(infer_len).into()
366
+ }
367
+
368
+ pub fn str_contains_any(&self, patterns: &RbExpr, ascii_case_insensitive: bool) -> Self {
369
+ self.inner
370
+ .clone()
371
+ .str()
372
+ .contains_any(patterns.inner.clone(), ascii_case_insensitive)
373
+ .into()
374
+ }
375
+
376
+ pub fn str_replace_many(
377
+ &self,
378
+ patterns: &RbExpr,
379
+ replace_with: &RbExpr,
380
+ ascii_case_insensitive: bool,
381
+ ) -> Self {
382
+ self.inner
383
+ .clone()
384
+ .str()
385
+ .replace_many(
386
+ patterns.inner.clone(),
387
+ replace_with.inner.clone(),
388
+ ascii_case_insensitive,
389
+ )
390
+ .into()
391
+ }
341
392
  }
@@ -1,15 +1,19 @@
1
1
  use crate::RbExpr;
2
2
 
3
3
  impl RbExpr {
4
- pub fn struct_field_by_name(&self, name: String) -> Self {
5
- self.inner.clone().struct_().field_by_name(&name).into()
6
- }
7
-
8
4
  pub fn struct_field_by_index(&self, index: i64) -> Self {
9
5
  self.inner.clone().struct_().field_by_index(index).into()
10
6
  }
11
7
 
8
+ pub fn struct_field_by_name(&self, name: String) -> Self {
9
+ self.inner.clone().struct_().field_by_name(&name).into()
10
+ }
11
+
12
12
  pub fn struct_rename_fields(&self, names: Vec<String>) -> Self {
13
13
  self.inner.clone().struct_().rename_fields(names).into()
14
14
  }
15
+
16
+ pub fn struct_json_encode(&self) -> Self {
17
+ self.inner.clone().struct_().json_encode().into()
18
+ }
15
19
  }
@@ -33,3 +33,9 @@ pub fn sum_horizontal(exprs: RArray) -> RbResult<RbExpr> {
33
33
  let e = dsl::sum_horizontal(exprs).map_err(RbPolarsErr::from)?;
34
34
  Ok(e.into())
35
35
  }
36
+
37
+ pub fn mean_horizontal(exprs: RArray) -> RbResult<RbExpr> {
38
+ let exprs = rb_exprs_to_exprs(exprs)?;
39
+ let e = dsl::mean_horizontal(exprs).map_err(RbPolarsErr::from)?;
40
+ Ok(e.into())
41
+ }
@@ -17,6 +17,44 @@ macro_rules! set_unwrapped_or_0 {
17
17
  };
18
18
  }
19
19
 
20
+ pub fn rolling_corr(
21
+ x: &RbExpr,
22
+ y: &RbExpr,
23
+ window_size: IdxSize,
24
+ min_periods: IdxSize,
25
+ ddof: u8,
26
+ ) -> RbExpr {
27
+ dsl::rolling_corr(
28
+ x.inner.clone(),
29
+ y.inner.clone(),
30
+ RollingCovOptions {
31
+ min_periods,
32
+ window_size,
33
+ ddof,
34
+ },
35
+ )
36
+ .into()
37
+ }
38
+
39
+ pub fn rolling_cov(
40
+ x: &RbExpr,
41
+ y: &RbExpr,
42
+ window_size: IdxSize,
43
+ min_periods: IdxSize,
44
+ ddof: u8,
45
+ ) -> RbExpr {
46
+ dsl::rolling_cov(
47
+ x.inner.clone(),
48
+ y.inner.clone(),
49
+ RollingCovOptions {
50
+ min_periods,
51
+ window_size,
52
+ ddof,
53
+ },
54
+ )
55
+ .into()
56
+ }
57
+
20
58
  pub fn arg_sort_by(by: RArray, descending: Vec<bool>) -> RbResult<RbExpr> {
21
59
  let by = rb_exprs_to_exprs(by)?;
22
60
  Ok(dsl::arg_sort_by(by, &descending).into())
@@ -83,6 +121,47 @@ pub fn concat_lf(
83
121
  Ok(lf.into())
84
122
  }
85
123
 
124
+ pub fn concat_list(s: RArray) -> RbResult<RbExpr> {
125
+ let s = rb_exprs_to_exprs(s)?;
126
+ let expr = dsl::concat_list(s).map_err(RbPolarsErr::from)?;
127
+ Ok(expr.into())
128
+ }
129
+
130
+ pub fn concat_str(s: RArray, separator: String, ignore_nulls: bool) -> RbResult<RbExpr> {
131
+ let s = rb_exprs_to_exprs(s)?;
132
+ Ok(dsl::concat_str(s, &separator, ignore_nulls).into())
133
+ }
134
+
135
+ pub fn len() -> RbExpr {
136
+ dsl::len().into()
137
+ }
138
+
139
+ pub fn cov(a: &RbExpr, b: &RbExpr, ddof: u8) -> RbExpr {
140
+ polars::lazy::dsl::cov(a.inner.clone(), b.inner.clone(), ddof).into()
141
+ }
142
+
143
+ pub fn arctan2(y: &RbExpr, x: &RbExpr) -> RbExpr {
144
+ y.inner.clone().arctan2(x.inner.clone()).into()
145
+ }
146
+
147
+ pub fn arctan2d(y: &RbExpr, x: &RbExpr) -> RbExpr {
148
+ y.inner.clone().arctan2(x.inner.clone()).degrees().into()
149
+ }
150
+
151
+ pub fn cum_fold(
152
+ acc: &RbExpr,
153
+ lambda: Value,
154
+ exprs: RArray,
155
+ include_init: bool,
156
+ ) -> RbResult<RbExpr> {
157
+ let exprs = rb_exprs_to_exprs(exprs)?;
158
+ let lambda = Opaque::from(lambda);
159
+
160
+ let func =
161
+ move |a: Series, b: Series| binary_lambda(Ruby::get().unwrap().get_inner(lambda), a, b);
162
+ Ok(dsl::cum_fold_exprs(acc.inner.clone(), func, exprs, include_init).into())
163
+ }
164
+
86
165
  pub fn concat_lf_diagonal(
87
166
  lfs: RArray,
88
167
  rechunk: bool,
@@ -110,6 +189,19 @@ pub fn concat_lf_diagonal(
110
189
  Ok(lf.into())
111
190
  }
112
191
 
192
+ pub fn dtype_cols(dtypes: Vec<DataType>) -> RbExpr {
193
+ dsl::dtype_cols(dtypes).into()
194
+ }
195
+
196
+ pub fn dtype_cols2(dtypes: RArray) -> RbResult<RbExpr> {
197
+ let dtypes = dtypes
198
+ .each()
199
+ .map(|v| Wrap::<DataType>::try_convert(v?))
200
+ .collect::<RbResult<Vec<Wrap<DataType>>>>()?;
201
+ let dtypes = vec_extract_wrapped(dtypes);
202
+ Ok(crate::functions::lazy::dtype_cols(dtypes))
203
+ }
204
+
113
205
  #[allow(clippy::too_many_arguments)]
114
206
  pub fn duration(
115
207
  weeks: Option<&RbExpr>,
@@ -146,38 +238,21 @@ pub fn duration(
146
238
  dsl::duration(args).into()
147
239
  }
148
240
 
149
- pub fn count() -> RbExpr {
150
- dsl::count().into()
151
- }
152
-
153
241
  pub fn first() -> RbExpr {
154
242
  dsl::first().into()
155
243
  }
156
244
 
157
- pub fn last() -> RbExpr {
158
- dsl::last().into()
159
- }
160
-
161
- pub fn dtype_cols(dtypes: Vec<DataType>) -> RbExpr {
162
- dsl::dtype_cols(dtypes).into()
163
- }
164
-
165
245
  pub fn fold(acc: &RbExpr, lambda: Value, exprs: RArray) -> RbResult<RbExpr> {
166
246
  let exprs = rb_exprs_to_exprs(exprs)?;
167
247
  let lambda = Opaque::from(lambda);
168
248
 
169
249
  let func =
170
250
  move |a: Series, b: Series| binary_lambda(Ruby::get().unwrap().get_inner(lambda), a, b);
171
- Ok(polars::lazy::dsl::fold_exprs(acc.inner.clone(), func, exprs).into())
251
+ Ok(dsl::fold_exprs(acc.inner.clone(), func, exprs).into())
172
252
  }
173
253
 
174
- pub fn cumfold(acc: &RbExpr, lambda: Value, exprs: RArray, include_init: bool) -> RbResult<RbExpr> {
175
- let exprs = rb_exprs_to_exprs(exprs)?;
176
- let lambda = Opaque::from(lambda);
177
-
178
- let func =
179
- move |a: Series, b: Series| binary_lambda(Ruby::get().unwrap().get_inner(lambda), a, b);
180
- Ok(polars::lazy::dsl::cum_fold_exprs(acc.inner.clone(), func, exprs, include_init).into())
254
+ pub fn last() -> RbExpr {
255
+ dsl::last().into()
181
256
  }
182
257
 
183
258
  pub fn lit(value: Value, allow_object: bool) -> RbResult<RbExpr> {
@@ -219,6 +294,10 @@ pub fn lit(value: Value, allow_object: bool) -> RbResult<RbExpr> {
219
294
  }
220
295
  }
221
296
 
297
+ pub fn pearson_corr(a: &RbExpr, b: &RbExpr, ddof: u8) -> RbExpr {
298
+ dsl::pearson_corr(a.inner.clone(), b.inner.clone(), ddof).into()
299
+ }
300
+
222
301
  pub fn repeat(value: &RbExpr, n: &RbExpr, dtype: Option<Wrap<DataType>>) -> RbResult<RbExpr> {
223
302
  let mut value = value.inner.clone();
224
303
  let n = n.inner.clone();
@@ -228,7 +307,7 @@ pub fn repeat(value: &RbExpr, n: &RbExpr, dtype: Option<Wrap<DataType>>) -> RbRe
228
307
  }
229
308
 
230
309
  if let Expr::Literal(lv) = &value {
231
- let av = lv.to_anyvalue().unwrap();
310
+ let av = lv.to_any_value().unwrap();
232
311
  // Integer inputs that fit in Int32 are parsed as such
233
312
  if let DataType::Int64 = av.dtype() {
234
313
  let int_value = av.try_extract::<i64>().unwrap();
@@ -240,35 +319,11 @@ pub fn repeat(value: &RbExpr, n: &RbExpr, dtype: Option<Wrap<DataType>>) -> RbRe
240
319
  Ok(dsl::repeat(value, n).into())
241
320
  }
242
321
 
243
- pub fn pearson_corr(a: &RbExpr, b: &RbExpr, ddof: u8) -> RbExpr {
244
- polars::lazy::dsl::pearson_corr(a.inner.clone(), b.inner.clone(), ddof).into()
245
- }
246
-
247
322
  pub fn spearman_rank_corr(a: &RbExpr, b: &RbExpr, ddof: u8, propagate_nans: bool) -> RbExpr {
248
- polars::lazy::dsl::spearman_rank_corr(a.inner.clone(), b.inner.clone(), ddof, propagate_nans)
249
- .into()
250
- }
251
-
252
- pub fn cov(a: &RbExpr, b: &RbExpr, ddof: u8) -> RbExpr {
253
- polars::lazy::dsl::cov(a.inner.clone(), b.inner.clone(), ddof).into()
254
- }
255
-
256
- pub fn concat_str(s: RArray, sep: String) -> RbResult<RbExpr> {
257
- let s = rb_exprs_to_exprs(s)?;
258
- Ok(dsl::concat_str(s, &sep).into())
323
+ dsl::spearman_rank_corr(a.inner.clone(), b.inner.clone(), ddof, propagate_nans).into()
259
324
  }
260
325
 
261
- pub fn concat_lst(s: RArray) -> RbResult<RbExpr> {
262
- let s = rb_exprs_to_exprs(s)?;
263
- let expr = dsl::concat_list(s).map_err(RbPolarsErr::from)?;
326
+ pub fn sql_expr(sql: String) -> RbResult<RbExpr> {
327
+ let expr = polars::sql::sql_expr(&sql).map_err(RbPolarsErr::from)?;
264
328
  Ok(expr.into())
265
329
  }
266
-
267
- pub fn dtype_cols2(dtypes: RArray) -> RbResult<RbExpr> {
268
- let dtypes = dtypes
269
- .each()
270
- .map(|v| Wrap::<DataType>::try_convert(v?))
271
- .collect::<RbResult<Vec<Wrap<DataType>>>>()?;
272
- let dtypes = vec_extract_wrapped(dtypes);
273
- Ok(crate::functions::lazy::dtype_cols(dtypes))
274
- }
@@ -7,7 +7,7 @@ use polars_core::POOL;
7
7
  use crate::conversion::Wrap;
8
8
  use crate::{RbResult, RbValueError};
9
9
 
10
- pub fn get_idx_type() -> Value {
10
+ pub fn get_index_type() -> Value {
11
11
  Wrap(IDX_DTYPE).into_value()
12
12
  }
13
13
 
@@ -36,3 +36,47 @@ pub fn get_float_fmt() -> RbResult<String> {
36
36
  };
37
37
  Ok(strfmt.to_string())
38
38
  }
39
+
40
+ pub fn set_float_precision(precision: Option<usize>) -> RbResult<()> {
41
+ use polars_core::fmt::set_float_precision;
42
+ set_float_precision(precision);
43
+ Ok(())
44
+ }
45
+
46
+ pub fn get_float_precision() -> RbResult<Option<usize>> {
47
+ use polars_core::fmt::get_float_precision;
48
+ Ok(get_float_precision())
49
+ }
50
+
51
+ pub fn set_thousands_separator(sep: Option<char>) -> RbResult<()> {
52
+ use polars_core::fmt::set_thousands_separator;
53
+ set_thousands_separator(sep);
54
+ Ok(())
55
+ }
56
+
57
+ pub fn get_thousands_separator() -> RbResult<Option<String>> {
58
+ use polars_core::fmt::get_thousands_separator;
59
+ Ok(Some(get_thousands_separator()))
60
+ }
61
+
62
+ pub fn set_decimal_separator(sep: Option<char>) -> RbResult<()> {
63
+ use polars_core::fmt::set_decimal_separator;
64
+ set_decimal_separator(sep);
65
+ Ok(())
66
+ }
67
+
68
+ pub fn get_decimal_separator() -> RbResult<Option<char>> {
69
+ use polars_core::fmt::get_decimal_separator;
70
+ Ok(Some(get_decimal_separator()))
71
+ }
72
+
73
+ pub fn set_trim_decimal_zeros(trim: Option<bool>) -> RbResult<()> {
74
+ use polars_core::fmt::set_trim_decimal_zeros;
75
+ set_trim_decimal_zeros(trim);
76
+ Ok(())
77
+ }
78
+
79
+ pub fn get_trim_decimal_zeros() -> RbResult<Option<bool>> {
80
+ use polars_core::fmt::get_trim_decimal_zeros;
81
+ Ok(Some(get_trim_decimal_zeros()))
82
+ }
@@ -6,21 +6,16 @@ use crate::prelude::*;
6
6
  use crate::RbExpr;
7
7
 
8
8
  pub fn int_range(start: &RbExpr, end: &RbExpr, step: i64, dtype: Wrap<DataType>) -> RbExpr {
9
+ let start = start.inner.clone();
10
+ let end = end.inner.clone();
9
11
  let dtype = dtype.0;
10
-
11
- let mut result = dsl::int_range(start.inner.clone(), end.inner.clone(), step);
12
-
13
- if dtype != DataType::Int64 {
14
- result = result.cast(dtype)
15
- }
16
-
17
- result.into()
12
+ dsl::int_range(start, end, step, dtype).into()
18
13
  }
19
14
 
20
- pub fn int_ranges(start: &RbExpr, end: &RbExpr, step: i64, dtype: Wrap<DataType>) -> RbExpr {
15
+ pub fn int_ranges(start: &RbExpr, end: &RbExpr, step: &RbExpr, dtype: Wrap<DataType>) -> RbExpr {
21
16
  let dtype = dtype.0;
22
17
 
23
- let mut result = dsl::int_ranges(start.inner.clone(), end.inner.clone(), step);
18
+ let mut result = dsl::int_ranges(start.inner.clone(), end.inner.clone(), step.inner.clone());
24
19
 
25
20
  if dtype != DataType::Int64 {
26
21
  result = result.cast(DataType::List(Box::new(dtype)))
@@ -1,3 +1,7 @@
1
+ use crate::RbResult;
2
+ use magnus::{RArray, Ruby, Value};
3
+ use polars_core::StringCacheHolder;
4
+
1
5
  pub fn enable_string_cache() {
2
6
  polars_core::enable_string_cache()
3
7
  }
@@ -9,3 +13,13 @@ pub fn disable_string_cache() {
9
13
  pub fn using_string_cache() -> bool {
10
14
  polars_core::using_string_cache()
11
15
  }
16
+
17
+ #[magnus::wrap(class = "Polars::RbStringCacheHolder")]
18
+ pub struct RbStringCacheHolder {}
19
+
20
+ impl RbStringCacheHolder {
21
+ pub fn hold() -> RbResult<Value> {
22
+ let _hold = StringCacheHolder::hold();
23
+ Ruby::get().unwrap().yield_splat(RArray::new())
24
+ }
25
+ }