polars-df 0.9.0-x86_64-linux → 0.11.0-x86_64-linux
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +23 -0
- data/Cargo.lock +144 -57
- data/LICENSE-THIRD-PARTY.txt +629 -29
- data/README.md +7 -6
- data/lib/polars/3.1/polars.so +0 -0
- data/lib/polars/3.2/polars.so +0 -0
- data/lib/polars/3.3/polars.so +0 -0
- data/lib/polars/array_expr.rb +6 -2
- data/lib/polars/batched_csv_reader.rb +11 -3
- data/lib/polars/convert.rb +6 -1
- data/lib/polars/data_frame.rb +225 -370
- data/lib/polars/date_time_expr.rb +11 -4
- data/lib/polars/date_time_name_space.rb +14 -4
- data/lib/polars/dynamic_group_by.rb +2 -2
- data/lib/polars/exceptions.rb +4 -0
- data/lib/polars/expr.rb +1171 -54
- data/lib/polars/functions/lazy.rb +3 -3
- data/lib/polars/functions/range/date_range.rb +92 -0
- data/lib/polars/functions/range/datetime_range.rb +149 -0
- data/lib/polars/functions/range/time_range.rb +141 -0
- data/lib/polars/functions/whenthen.rb +74 -5
- data/lib/polars/group_by.rb +88 -23
- data/lib/polars/io/avro.rb +24 -0
- data/lib/polars/{io.rb → io/csv.rb} +307 -489
- data/lib/polars/io/database.rb +73 -0
- data/lib/polars/io/ipc.rb +247 -0
- data/lib/polars/io/json.rb +18 -0
- data/lib/polars/io/ndjson.rb +69 -0
- data/lib/polars/io/parquet.rb +226 -0
- data/lib/polars/lazy_frame.rb +55 -195
- data/lib/polars/lazy_group_by.rb +100 -3
- data/lib/polars/list_expr.rb +6 -2
- data/lib/polars/rolling_group_by.rb +2 -2
- data/lib/polars/series.rb +14 -12
- data/lib/polars/string_expr.rb +38 -36
- data/lib/polars/utils.rb +89 -1
- data/lib/polars/version.rb +1 -1
- data/lib/polars/whenthen.rb +83 -0
- data/lib/polars.rb +10 -3
- metadata +13 -6
- data/lib/polars/when.rb +0 -16
- data/lib/polars/when_then.rb +0 -19
data/lib/polars/string_expr.rb
CHANGED
@@ -840,6 +840,7 @@ module Polars
|
|
840
840
|
# # │ true │
|
841
841
|
# # └──────────┘
|
842
842
|
def json_path_match(json_path)
|
843
|
+
json_path = Utils.parse_as_expression(json_path, str_as_lit: true)
|
843
844
|
Utils.wrap_expr(_rbexpr.str_json_path_match(json_path))
|
844
845
|
end
|
845
846
|
|
@@ -1018,15 +1019,15 @@ module Polars
|
|
1018
1019
|
# )
|
1019
1020
|
# # =>
|
1020
1021
|
# # shape: (3, 3)
|
1021
|
-
# #
|
1022
|
-
# # │ url
|
1023
|
-
# # │ ---
|
1024
|
-
# # │ str
|
1025
|
-
# #
|
1026
|
-
# # │ http://vote.com/ballon_dor?
|
1027
|
-
# # │ http://vote.com/ballon_dor?
|
1028
|
-
# # │ http://vote.com/ballon_dor?
|
1029
|
-
# #
|
1022
|
+
# # ┌─────────────────────────────────┬───────────────────────┬──────────┐
|
1023
|
+
# # │ url ┆ captures ┆ name │
|
1024
|
+
# # │ --- ┆ --- ┆ --- │
|
1025
|
+
# # │ str ┆ struct[2] ┆ str │
|
1026
|
+
# # ╞═════════════════════════════════╪═══════════════════════╪══════════╡
|
1027
|
+
# # │ http://vote.com/ballon_dor?can… ┆ {"messi","python"} ┆ MESSI │
|
1028
|
+
# # │ http://vote.com/ballon_dor?can… ┆ {"weghorst","polars"} ┆ WEGHORST │
|
1029
|
+
# # │ http://vote.com/ballon_dor?err… ┆ {null,null} ┆ null │
|
1030
|
+
# # └─────────────────────────────────┴───────────────────────┴──────────┘
|
1030
1031
|
def extract_groups(pattern)
|
1031
1032
|
Utils.wrap_expr(_rbexpr.str_extract_groups(pattern))
|
1032
1033
|
end
|
@@ -1354,6 +1355,7 @@ module Polars
|
|
1354
1355
|
# # │ null ┆ null │
|
1355
1356
|
# # └──────┴────────┘
|
1356
1357
|
def to_integer(base: 10, strict: true)
|
1358
|
+
base = Utils.parse_as_expression(base, str_as_lit: false)
|
1357
1359
|
Utils.wrap_expr(_rbexpr.str_to_integer(base, strict))
|
1358
1360
|
end
|
1359
1361
|
|
@@ -1417,15 +1419,15 @@ module Polars
|
|
1417
1419
|
# )
|
1418
1420
|
# # =>
|
1419
1421
|
# # shape: (3, 2)
|
1420
|
-
# #
|
1421
|
-
# # │ lyrics
|
1422
|
-
# # │ ---
|
1423
|
-
# # │ str
|
1424
|
-
# #
|
1425
|
-
# # │ Everybody wants to rule the
|
1426
|
-
# # │ Tell me what you want, what
|
1427
|
-
# # │ Can you feel the love tonight
|
1428
|
-
# #
|
1422
|
+
# # ┌─────────────────────────────────┬──────────────┐
|
1423
|
+
# # │ lyrics ┆ contains_any │
|
1424
|
+
# # │ --- ┆ --- │
|
1425
|
+
# # │ str ┆ bool │
|
1426
|
+
# # ╞═════════════════════════════════╪══════════════╡
|
1427
|
+
# # │ Everybody wants to rule the wo… ┆ false │
|
1428
|
+
# # │ Tell me what you want, what yo… ┆ true │
|
1429
|
+
# # │ Can you feel the love tonight ┆ true │
|
1430
|
+
# # └─────────────────────────────────┴──────────────┘
|
1429
1431
|
def contains_any(patterns, ascii_case_insensitive: false)
|
1430
1432
|
patterns = Utils.parse_as_expression(patterns, str_as_lit: false, list_as_lit: false)
|
1431
1433
|
Utils.wrap_expr(
|
@@ -1467,15 +1469,15 @@ module Polars
|
|
1467
1469
|
# )
|
1468
1470
|
# # =>
|
1469
1471
|
# # shape: (3, 2)
|
1470
|
-
# #
|
1471
|
-
# # │ lyrics
|
1472
|
-
# # │ ---
|
1473
|
-
# # │ str
|
1474
|
-
# #
|
1475
|
-
# # │ Everybody wants to rule the
|
1476
|
-
# # │ Tell me what you want, what
|
1477
|
-
# # │ Can you feel the love tonight
|
1478
|
-
# #
|
1472
|
+
# # ┌─────────────────────────────────┬─────────────────────────────────┐
|
1473
|
+
# # │ lyrics ┆ removes_pronouns │
|
1474
|
+
# # │ --- ┆ --- │
|
1475
|
+
# # │ str ┆ str │
|
1476
|
+
# # ╞═════════════════════════════════╪═════════════════════════════════╡
|
1477
|
+
# # │ Everybody wants to rule the wo… ┆ Everybody wants to rule the wo… │
|
1478
|
+
# # │ Tell me what you want, what yo… ┆ Tell what want, what really… │
|
1479
|
+
# # │ Can you feel the love tonight ┆ Can feel the love tonight │
|
1480
|
+
# # └─────────────────────────────────┴─────────────────────────────────┘
|
1479
1481
|
#
|
1480
1482
|
# @example
|
1481
1483
|
# df.with_columns(
|
@@ -1488,15 +1490,15 @@ module Polars
|
|
1488
1490
|
# )
|
1489
1491
|
# # =>
|
1490
1492
|
# # shape: (3, 2)
|
1491
|
-
# #
|
1492
|
-
# # │ lyrics
|
1493
|
-
# # │ ---
|
1494
|
-
# # │ str
|
1495
|
-
# #
|
1496
|
-
# # │ Everybody wants to rule the
|
1497
|
-
# # │ Tell me what you want, what
|
1498
|
-
# # │ Can you feel the love tonight
|
1499
|
-
# #
|
1493
|
+
# # ┌─────────────────────────────────┬─────────────────────────────────┐
|
1494
|
+
# # │ lyrics ┆ confusing │
|
1495
|
+
# # │ --- ┆ --- │
|
1496
|
+
# # │ str ┆ str │
|
1497
|
+
# # ╞═════════════════════════════════╪═════════════════════════════════╡
|
1498
|
+
# # │ Everybody wants to rule the wo… ┆ Everybody wants to rule the wo… │
|
1499
|
+
# # │ Tell me what you want, what yo… ┆ Tell you what me want, what me… │
|
1500
|
+
# # │ Can you feel the love tonight ┆ Can me feel the love tonight │
|
1501
|
+
# # └─────────────────────────────────┴─────────────────────────────────┘
|
1500
1502
|
def replace_many(patterns, replace_with, ascii_case_insensitive: false)
|
1501
1503
|
patterns = Utils.parse_as_expression(patterns, str_as_lit: false, list_as_lit: false)
|
1502
1504
|
replace_with = Utils.parse_as_expression(
|
data/lib/polars/utils.rb
CHANGED
@@ -139,7 +139,7 @@ module Polars
|
|
139
139
|
Polars.lit(value)
|
140
140
|
end
|
141
141
|
|
142
|
-
def self.
|
142
|
+
def self.normalize_filepath(path, check_not_directory: true)
|
143
143
|
path = File.expand_path(path)
|
144
144
|
if check_not_directory && File.exist?(path) && Dir.exist?(path)
|
145
145
|
raise ArgumentError, "Expected a file path; #{path} is a directory"
|
@@ -364,5 +364,93 @@ module Polars
|
|
364
364
|
end
|
365
365
|
end
|
366
366
|
end
|
367
|
+
|
368
|
+
def self._expand_selectors(frame, *items)
|
369
|
+
items_iter = _parse_inputs_as_iterable(items)
|
370
|
+
|
371
|
+
expanded = []
|
372
|
+
items_iter.each do |item|
|
373
|
+
if is_selector(item)
|
374
|
+
selector_cols = expand_selector(frame, item)
|
375
|
+
expanded.concat(selector_cols)
|
376
|
+
else
|
377
|
+
expanded << item
|
378
|
+
end
|
379
|
+
end
|
380
|
+
expanded
|
381
|
+
end
|
382
|
+
|
383
|
+
# TODO
|
384
|
+
def self.is_selector(obj)
|
385
|
+
false
|
386
|
+
end
|
387
|
+
|
388
|
+
def self.parse_predicates_constraints_as_expression(*predicates, **constraints)
|
389
|
+
all_predicates = _parse_positional_inputs(predicates)
|
390
|
+
|
391
|
+
if constraints.any?
|
392
|
+
constraint_predicates = _parse_constraints(constraints)
|
393
|
+
all_predicates.concat(constraint_predicates)
|
394
|
+
end
|
395
|
+
|
396
|
+
_combine_predicates(all_predicates)
|
397
|
+
end
|
398
|
+
|
399
|
+
def self._parse_constraints(constraints)
|
400
|
+
constraints.map do |name, value|
|
401
|
+
Polars.col(name).eq(value)._rbexpr
|
402
|
+
end
|
403
|
+
end
|
404
|
+
|
405
|
+
def self._combine_predicates(predicates)
|
406
|
+
if !predicates.any?
|
407
|
+
msg = "at least one predicate or constraint must be provided"
|
408
|
+
raise TypeError, msg
|
409
|
+
end
|
410
|
+
|
411
|
+
if predicates.length == 1
|
412
|
+
return predicates[0]
|
413
|
+
end
|
414
|
+
|
415
|
+
Plr.all_horizontal(predicates)
|
416
|
+
end
|
417
|
+
|
418
|
+
def self.parse_when_inputs(*predicates, **constraints)
|
419
|
+
parse_predicates_constraints_as_expression(*predicates, **constraints)
|
420
|
+
end
|
421
|
+
|
422
|
+
def self.parse_interval_argument(interval)
|
423
|
+
if interval.include?(" ")
|
424
|
+
interval = interval.gsub(" ", "")
|
425
|
+
end
|
426
|
+
interval.downcase
|
427
|
+
end
|
428
|
+
|
429
|
+
def self.validate_rolling_by_aggs_arguments(weights, center:)
|
430
|
+
if !weights.nil?
|
431
|
+
msg = "`weights` is not supported in `rolling_*(..., by=...)` expression"
|
432
|
+
raise InvalidOperationError, msg
|
433
|
+
end
|
434
|
+
if center
|
435
|
+
msg = "`center=True` is not supported in `rolling_*(..., by=...)` expression"
|
436
|
+
raise InvalidOperationError, msg
|
437
|
+
end
|
438
|
+
end
|
439
|
+
|
440
|
+
def self.validate_rolling_aggs_arguments(window_size, closed)
|
441
|
+
if window_size.is_a?(::String)
|
442
|
+
begin
|
443
|
+
window_size = window_size.delete_suffix("i").to_i
|
444
|
+
rescue
|
445
|
+
msg = "Expected a string of the form 'ni', where `n` is a positive integer, got: #{window_size}"
|
446
|
+
raise InvalidOperationError, msg
|
447
|
+
end
|
448
|
+
end
|
449
|
+
if !closed.nil?
|
450
|
+
msg = "`closed` is not supported in `rolling_*(...)` expression"
|
451
|
+
raise InvalidOperationError, msg
|
452
|
+
end
|
453
|
+
window_size
|
454
|
+
end
|
367
455
|
end
|
368
456
|
end
|
data/lib/polars/version.rb
CHANGED
@@ -0,0 +1,83 @@
|
|
1
|
+
module Polars
|
2
|
+
# @private
|
3
|
+
class When
|
4
|
+
attr_accessor :_when
|
5
|
+
|
6
|
+
def initialize(rbwhen)
|
7
|
+
self._when = rbwhen
|
8
|
+
end
|
9
|
+
|
10
|
+
def then(statement)
|
11
|
+
statement_rbexpr = Utils.parse_as_expression(statement)
|
12
|
+
Then.new(_when.then(statement_rbexpr))
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# @private
|
17
|
+
class Then < Expr
|
18
|
+
attr_accessor :_then
|
19
|
+
|
20
|
+
def initialize(rbthen)
|
21
|
+
self._then = rbthen
|
22
|
+
end
|
23
|
+
|
24
|
+
def self._from_rbexpr(rbexpr)
|
25
|
+
Utils.wrap_expr(rbexpr)
|
26
|
+
end
|
27
|
+
|
28
|
+
def _rbexpr
|
29
|
+
_then.otherwise(Polars.lit(nil)._rbexpr)
|
30
|
+
end
|
31
|
+
|
32
|
+
def when(*predicates, **constraints)
|
33
|
+
condition_rbexpr = Utils.parse_when_inputs(*predicates, **constraints)
|
34
|
+
ChainedWhen.new(_then.when(condition_rbexpr))
|
35
|
+
end
|
36
|
+
|
37
|
+
def otherwise(statement)
|
38
|
+
statement_rbexpr = Utils.parse_as_expression(statement)
|
39
|
+
Utils.wrap_expr(_then.otherwise(statement_rbexpr))
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# @private
|
44
|
+
class ChainedWhen
|
45
|
+
attr_accessor :_chained_when
|
46
|
+
|
47
|
+
def initialize(chained_when)
|
48
|
+
self._chained_when = chained_when
|
49
|
+
end
|
50
|
+
|
51
|
+
def then(statement)
|
52
|
+
statement_rbexpr = Utils.parse_as_expression(statement)
|
53
|
+
ChainedThen.new(_chained_when.then(statement_rbexpr))
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# @private
|
58
|
+
class ChainedThen < Expr
|
59
|
+
attr_accessor :_chained_then
|
60
|
+
|
61
|
+
def initialize(chained_then)
|
62
|
+
self._chained_then = chained_then
|
63
|
+
end
|
64
|
+
|
65
|
+
def self._from_rbexpr(rbexpr)
|
66
|
+
Utils.wrap_expr(rbexpr)
|
67
|
+
end
|
68
|
+
|
69
|
+
def _rbexpr
|
70
|
+
_chained_then.otherwise(Polars.lit(nil)._rbexpr)
|
71
|
+
end
|
72
|
+
|
73
|
+
def when(*predicates, **constraints)
|
74
|
+
condition_rbexpr = Utils.parse_when_inputs(*predicates, **constraints)
|
75
|
+
ChainedWhen.new(_chained_then.when(condition_rbexpr))
|
76
|
+
end
|
77
|
+
|
78
|
+
def otherwise(statement)
|
79
|
+
statement_rbexpr = Utils.parse_as_expression(statement)
|
80
|
+
Utils.wrap_expr(_chained_then.otherwise(statement_rbexpr))
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
data/lib/polars.rb
CHANGED
@@ -42,9 +42,17 @@ require_relative "polars/functions/whenthen"
|
|
42
42
|
require_relative "polars/functions/aggregation/horizontal"
|
43
43
|
require_relative "polars/functions/aggregation/vertical"
|
44
44
|
require_relative "polars/functions/range/date_range"
|
45
|
+
require_relative "polars/functions/range/datetime_range"
|
45
46
|
require_relative "polars/functions/range/int_range"
|
47
|
+
require_relative "polars/functions/range/time_range"
|
46
48
|
require_relative "polars/group_by"
|
47
|
-
require_relative "polars/io"
|
49
|
+
require_relative "polars/io/avro"
|
50
|
+
require_relative "polars/io/csv"
|
51
|
+
require_relative "polars/io/database"
|
52
|
+
require_relative "polars/io/ipc"
|
53
|
+
require_relative "polars/io/json"
|
54
|
+
require_relative "polars/io/ndjson"
|
55
|
+
require_relative "polars/io/parquet"
|
48
56
|
require_relative "polars/lazy_frame"
|
49
57
|
require_relative "polars/lazy_group_by"
|
50
58
|
require_relative "polars/list_expr"
|
@@ -63,8 +71,7 @@ require_relative "polars/struct_name_space"
|
|
63
71
|
require_relative "polars/testing"
|
64
72
|
require_relative "polars/utils"
|
65
73
|
require_relative "polars/version"
|
66
|
-
require_relative "polars/
|
67
|
-
require_relative "polars/when_then"
|
74
|
+
require_relative "polars/whenthen"
|
68
75
|
|
69
76
|
module Polars
|
70
77
|
extend Convert
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: polars-df
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.0
|
5
5
|
platform: x86_64-linux
|
6
6
|
authors:
|
7
7
|
- Andrew Kane
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-06-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bigdecimal
|
@@ -71,11 +71,19 @@ files:
|
|
71
71
|
- lib/polars/functions/lit.rb
|
72
72
|
- lib/polars/functions/random.rb
|
73
73
|
- lib/polars/functions/range/date_range.rb
|
74
|
+
- lib/polars/functions/range/datetime_range.rb
|
74
75
|
- lib/polars/functions/range/int_range.rb
|
76
|
+
- lib/polars/functions/range/time_range.rb
|
75
77
|
- lib/polars/functions/repeat.rb
|
76
78
|
- lib/polars/functions/whenthen.rb
|
77
79
|
- lib/polars/group_by.rb
|
78
|
-
- lib/polars/io.rb
|
80
|
+
- lib/polars/io/avro.rb
|
81
|
+
- lib/polars/io/csv.rb
|
82
|
+
- lib/polars/io/database.rb
|
83
|
+
- lib/polars/io/ipc.rb
|
84
|
+
- lib/polars/io/json.rb
|
85
|
+
- lib/polars/io/ndjson.rb
|
86
|
+
- lib/polars/io/parquet.rb
|
79
87
|
- lib/polars/lazy_frame.rb
|
80
88
|
- lib/polars/lazy_group_by.rb
|
81
89
|
- lib/polars/list_expr.rb
|
@@ -95,9 +103,8 @@ files:
|
|
95
103
|
- lib/polars/testing.rb
|
96
104
|
- lib/polars/utils.rb
|
97
105
|
- lib/polars/version.rb
|
98
|
-
- lib/polars/
|
99
|
-
|
100
|
-
homepage: https://github.com/ankane/polars-ruby
|
106
|
+
- lib/polars/whenthen.rb
|
107
|
+
homepage: https://github.com/ankane/ruby-polars
|
101
108
|
licenses:
|
102
109
|
- MIT
|
103
110
|
metadata: {}
|
data/lib/polars/when.rb
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
module Polars
|
2
|
-
# @private
|
3
|
-
class When
|
4
|
-
attr_accessor :_rbwhen
|
5
|
-
|
6
|
-
def initialize(rbwhen)
|
7
|
-
self._rbwhen = rbwhen
|
8
|
-
end
|
9
|
-
|
10
|
-
def then(expr)
|
11
|
-
expr = Utils.expr_to_lit_or_expr(expr)
|
12
|
-
rbwhenthen = _rbwhen._then(expr._rbexpr)
|
13
|
-
WhenThen.new(rbwhenthen)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
data/lib/polars/when_then.rb
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
module Polars
|
2
|
-
# @private
|
3
|
-
class WhenThen
|
4
|
-
attr_accessor :_rbwhenthen
|
5
|
-
|
6
|
-
def initialize(rbwhenthen)
|
7
|
-
self._rbwhenthen = rbwhenthen
|
8
|
-
end
|
9
|
-
|
10
|
-
def when(predicate)
|
11
|
-
WhenThenThen.new(_rbwhenthen.when(predicate._rbexpr))
|
12
|
-
end
|
13
|
-
|
14
|
-
def otherwise(expr)
|
15
|
-
expr = Utils.expr_to_lit_or_expr(expr)
|
16
|
-
Utils.wrap_expr(_rbwhenthen.otherwise(expr._rbexpr))
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|