polars-df 0.5.0-x86_64-linux → 0.6.0-x86_64-linux
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +14 -0
- data/Cargo.lock +337 -381
- data/LICENSE-THIRD-PARTY.txt +1161 -832
- data/README.md +4 -3
- data/lib/polars/3.0/polars.so +0 -0
- data/lib/polars/3.1/polars.so +0 -0
- data/lib/polars/3.2/polars.so +0 -0
- data/lib/polars/array_expr.rb +84 -0
- data/lib/polars/array_name_space.rb +77 -0
- data/lib/polars/batched_csv_reader.rb +1 -1
- data/lib/polars/data_frame.rb +91 -49
- data/lib/polars/data_types.rb +163 -29
- data/lib/polars/date_time_name_space.rb +17 -3
- data/lib/polars/expr.rb +76 -69
- data/lib/polars/functions.rb +0 -1
- data/lib/polars/group_by.rb +1 -22
- data/lib/polars/lazy_frame.rb +82 -30
- data/lib/polars/lazy_functions.rb +67 -31
- data/lib/polars/list_expr.rb +28 -28
- data/lib/polars/list_name_space.rb +13 -13
- data/lib/polars/rolling_group_by.rb +4 -2
- data/lib/polars/series.rb +70 -16
- data/lib/polars/string_expr.rb +137 -11
- data/lib/polars/string_name_space.rb +137 -22
- data/lib/polars/utils.rb +107 -57
- data/lib/polars/version.rb +1 -1
- data/lib/polars.rb +3 -0
- metadata +4 -2
data/lib/polars/data_types.rb
CHANGED
@@ -1,6 +1,25 @@
|
|
1
1
|
module Polars
|
2
2
|
# Base class for all Polars data types.
|
3
3
|
class DataType
|
4
|
+
def self.base_type
|
5
|
+
self
|
6
|
+
end
|
7
|
+
|
8
|
+
def base_type
|
9
|
+
is_a?(DataType) ? self.class : self
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.nested?
|
13
|
+
false
|
14
|
+
end
|
15
|
+
|
16
|
+
def nested?
|
17
|
+
self.class.nested?
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.==(other)
|
21
|
+
eql?(other) || other.is_a?(self)
|
22
|
+
end
|
4
23
|
end
|
5
24
|
|
6
25
|
# Base class for numeric data types.
|
@@ -15,12 +34,19 @@ module Polars
|
|
15
34
|
class FractionalType < NumericType
|
16
35
|
end
|
17
36
|
|
37
|
+
# Base class for float data types.
|
38
|
+
class FloatType < FractionalType
|
39
|
+
end
|
40
|
+
|
18
41
|
# Base class for temporal data types.
|
19
42
|
class TemporalType < DataType
|
20
43
|
end
|
21
44
|
|
22
45
|
# Base class for nested data types.
|
23
46
|
class NestedType < DataType
|
47
|
+
def self.nested?
|
48
|
+
true
|
49
|
+
end
|
24
50
|
end
|
25
51
|
|
26
52
|
# 8-bit signed integer type.
|
@@ -56,11 +82,37 @@ module Polars
|
|
56
82
|
end
|
57
83
|
|
58
84
|
# 32-bit floating point type.
|
59
|
-
class Float32 <
|
85
|
+
class Float32 < FloatType
|
60
86
|
end
|
61
87
|
|
62
88
|
# 64-bit floating point type.
|
63
|
-
class Float64 <
|
89
|
+
class Float64 < FloatType
|
90
|
+
end
|
91
|
+
|
92
|
+
# Decimal 128-bit type with an optional precision and non-negative scale.
|
93
|
+
#
|
94
|
+
# NOTE: this is an experimental work-in-progress feature and may not work as expected.
|
95
|
+
class Decimal < FractionalType
|
96
|
+
attr_reader :precision, :scale
|
97
|
+
|
98
|
+
def initialize(precision, scale)
|
99
|
+
@precision = precision
|
100
|
+
@scale = scale
|
101
|
+
end
|
102
|
+
|
103
|
+
def ==(other)
|
104
|
+
if other.eql?(Decimal)
|
105
|
+
true
|
106
|
+
elsif other.is_a?(Decimal)
|
107
|
+
precision == other.precision && scale == other.scale
|
108
|
+
else
|
109
|
+
false
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def to_s
|
114
|
+
"#{self.class.name}(precision: #{precision.inspect}, scale: #{scale.inspect})"
|
115
|
+
end
|
64
116
|
end
|
65
117
|
|
66
118
|
# Boolean type.
|
@@ -71,17 +123,18 @@ module Polars
|
|
71
123
|
class Utf8 < DataType
|
72
124
|
end
|
73
125
|
|
74
|
-
#
|
75
|
-
class
|
76
|
-
def initialize(inner)
|
77
|
-
@inner = Utils.rb_type_to_dtype(inner)
|
78
|
-
end
|
126
|
+
# Binary type.
|
127
|
+
class Binary < DataType
|
79
128
|
end
|
80
129
|
|
81
130
|
# Calendar date type.
|
82
131
|
class Date < TemporalType
|
83
132
|
end
|
84
133
|
|
134
|
+
# Time of day type.
|
135
|
+
class Time < TemporalType
|
136
|
+
end
|
137
|
+
|
85
138
|
# Calendar date and time type.
|
86
139
|
class Datetime < TemporalType
|
87
140
|
attr_reader :time_unit, :time_zone
|
@@ -91,6 +144,20 @@ module Polars
|
|
91
144
|
@time_unit = time_unit || "us"
|
92
145
|
@time_zone = time_zone
|
93
146
|
end
|
147
|
+
|
148
|
+
def ==(other)
|
149
|
+
if other.eql?(Datetime)
|
150
|
+
true
|
151
|
+
elsif other.is_a?(Datetime)
|
152
|
+
time_unit == other.time_unit && time_zone == other.time_zone
|
153
|
+
else
|
154
|
+
false
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
def to_s
|
159
|
+
"#{self.class.name}(time_unit: #{time_unit.inspect}, time_zone: #{time_zone.inspect})"
|
160
|
+
end
|
94
161
|
end
|
95
162
|
|
96
163
|
# Time duration/delta type.
|
@@ -101,18 +168,85 @@ module Polars
|
|
101
168
|
def initialize(time_unit = "us")
|
102
169
|
@time_unit = time_unit
|
103
170
|
end
|
171
|
+
|
172
|
+
def ==(other)
|
173
|
+
if other.eql?(Duration)
|
174
|
+
true
|
175
|
+
elsif other.is_a?(Duration)
|
176
|
+
time_unit == other.time_unit
|
177
|
+
else
|
178
|
+
false
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
def to_s
|
183
|
+
"#{self.class.name}(time_unit: #{time_unit.inspect})"
|
184
|
+
end
|
104
185
|
end
|
105
186
|
|
106
|
-
#
|
107
|
-
class
|
187
|
+
# A categorical encoding of a set of strings.
|
188
|
+
class Categorical < DataType
|
108
189
|
end
|
109
190
|
|
110
191
|
# Type for wrapping arbitrary Ruby objects.
|
111
192
|
class Object < DataType
|
112
193
|
end
|
113
194
|
|
114
|
-
#
|
115
|
-
class
|
195
|
+
# Type representing Null / None values.
|
196
|
+
class Null < DataType
|
197
|
+
end
|
198
|
+
|
199
|
+
# Type representing Datatype values that could not be determined statically.
|
200
|
+
class Unknown < DataType
|
201
|
+
end
|
202
|
+
|
203
|
+
# Nested list/array type.
|
204
|
+
class List < NestedType
|
205
|
+
attr_reader :inner
|
206
|
+
|
207
|
+
def initialize(inner)
|
208
|
+
@inner = Utils.rb_type_to_dtype(inner)
|
209
|
+
end
|
210
|
+
|
211
|
+
def ==(other)
|
212
|
+
if other.eql?(List)
|
213
|
+
true
|
214
|
+
elsif other.is_a?(List)
|
215
|
+
@inner.nil? || other.inner.nil? || @inner == other.inner
|
216
|
+
else
|
217
|
+
false
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
def to_s
|
222
|
+
"#{self.class.name}(#{inner})"
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
# Nested list/array type.
|
227
|
+
class Array < NestedType
|
228
|
+
attr_reader :width, :inner
|
229
|
+
|
230
|
+
def initialize(width, inner = nil)
|
231
|
+
@width = width
|
232
|
+
@inner = Utils.rb_type_to_dtype(inner) if inner
|
233
|
+
end
|
234
|
+
|
235
|
+
# TODO check width?
|
236
|
+
def ==(other)
|
237
|
+
if other.eql?(Array)
|
238
|
+
true
|
239
|
+
elsif other.is_a?(Array)
|
240
|
+
@inner.nil? || other.inner.nil? || @inner == other.inner
|
241
|
+
else
|
242
|
+
false
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
# TODO add width?
|
247
|
+
def to_s
|
248
|
+
"#{self.class.name}(#{inner})"
|
249
|
+
end
|
116
250
|
end
|
117
251
|
|
118
252
|
# Definition of a single field within a `Struct` DataType.
|
@@ -124,9 +258,12 @@ module Polars
|
|
124
258
|
@dtype = Utils.rb_type_to_dtype(dtype)
|
125
259
|
end
|
126
260
|
|
127
|
-
def
|
128
|
-
|
129
|
-
|
261
|
+
def ==(other)
|
262
|
+
name == other.name && dtype == other.dtype
|
263
|
+
end
|
264
|
+
|
265
|
+
def to_s
|
266
|
+
"#{self.class.name}(#{name.inspect}, #{dtype})"
|
130
267
|
end
|
131
268
|
end
|
132
269
|
|
@@ -142,25 +279,22 @@ module Polars
|
|
142
279
|
end
|
143
280
|
end
|
144
281
|
|
145
|
-
def
|
146
|
-
|
147
|
-
|
282
|
+
def ==(other)
|
283
|
+
if other.eql?(Struct)
|
284
|
+
true
|
285
|
+
elsif other.is_a?(Struct)
|
286
|
+
fields == other.fields
|
287
|
+
else
|
288
|
+
false
|
289
|
+
end
|
290
|
+
end
|
291
|
+
|
292
|
+
def to_s
|
293
|
+
"#{self.class.name}([#{fields.map(&:to_s).join("\n")}])"
|
148
294
|
end
|
149
295
|
|
150
296
|
def to_schema
|
151
297
|
@fields.to_h { |f| [f.name, f.dtype] }
|
152
298
|
end
|
153
299
|
end
|
154
|
-
|
155
|
-
# Binary type.
|
156
|
-
class Binary < DataType
|
157
|
-
end
|
158
|
-
|
159
|
-
# Type representing Null / None values.
|
160
|
-
class Null < DataType
|
161
|
-
end
|
162
|
-
|
163
|
-
# Type representing Datatype values that could not be determined statically.
|
164
|
-
class Unknown < DataType
|
165
|
-
end
|
166
300
|
end
|
@@ -82,8 +82,15 @@ module Polars
|
|
82
82
|
# # => 2001-01-02 00:00:00 UTC
|
83
83
|
def median
|
84
84
|
s = Utils.wrap_s(_s)
|
85
|
-
out = s.median
|
86
|
-
|
85
|
+
out = s.median
|
86
|
+
if !out.nil?
|
87
|
+
if s.dtype == Date
|
88
|
+
return Utils._to_ruby_date(out.to_i)
|
89
|
+
else
|
90
|
+
return Utils._to_ruby_datetime(out.to_i, s.time_unit)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
nil
|
87
94
|
end
|
88
95
|
|
89
96
|
# Return mean as Ruby object.
|
@@ -107,7 +114,14 @@ module Polars
|
|
107
114
|
def mean
|
108
115
|
s = Utils.wrap_s(_s)
|
109
116
|
out = s.mean.to_i
|
110
|
-
|
117
|
+
if !out.nil?
|
118
|
+
if s.dtype == Date
|
119
|
+
return Utils._to_ruby_date(out.to_i)
|
120
|
+
else
|
121
|
+
return Utils._to_ruby_datetime(out.to_i, s.time_unit)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
nil
|
111
125
|
end
|
112
126
|
|
113
127
|
# Format Date/datetime with a formatting rule.
|
data/lib/polars/expr.rb
CHANGED
@@ -362,7 +362,7 @@ module Polars
|
|
362
362
|
if columns.is_a?(String)
|
363
363
|
columns = [columns]
|
364
364
|
return wrap_expr(_rbexpr.exclude(columns))
|
365
|
-
elsif !columns.is_a?(Array)
|
365
|
+
elsif !columns.is_a?(::Array)
|
366
366
|
columns = [columns]
|
367
367
|
return wrap_expr(_rbexpr.exclude_dtype(columns))
|
368
368
|
end
|
@@ -820,18 +820,18 @@ module Polars
|
|
820
820
|
# df.select(Polars.repeat(nil, 3).append(Polars.col("a")).rechunk)
|
821
821
|
# # =>
|
822
822
|
# # shape: (6, 1)
|
823
|
-
# #
|
824
|
-
# # │
|
825
|
-
# # │ ---
|
826
|
-
# # │ i64
|
827
|
-
# #
|
828
|
-
# # │ null
|
829
|
-
# # │ null
|
830
|
-
# # │ null
|
831
|
-
# # │ 1
|
832
|
-
# # │ 1
|
833
|
-
# # │ 2
|
834
|
-
# #
|
823
|
+
# # ┌────────┐
|
824
|
+
# # │ repeat │
|
825
|
+
# # │ --- │
|
826
|
+
# # │ i64 │
|
827
|
+
# # ╞════════╡
|
828
|
+
# # │ null │
|
829
|
+
# # │ null │
|
830
|
+
# # │ null │
|
831
|
+
# # │ 1 │
|
832
|
+
# # │ 1 │
|
833
|
+
# # │ 2 │
|
834
|
+
# # └────────┘
|
835
835
|
def rechunk
|
836
836
|
wrap_expr(_rbexpr.rechunk)
|
837
837
|
end
|
@@ -1534,10 +1534,10 @@ module Polars
|
|
1534
1534
|
# # │ two │
|
1535
1535
|
# # └───────┘
|
1536
1536
|
def sort_by(by, reverse: false)
|
1537
|
-
if !by.is_a?(Array)
|
1537
|
+
if !by.is_a?(::Array)
|
1538
1538
|
by = [by]
|
1539
1539
|
end
|
1540
|
-
if !reverse.is_a?(Array)
|
1540
|
+
if !reverse.is_a?(::Array)
|
1541
1541
|
reverse = [reverse]
|
1542
1542
|
end
|
1543
1543
|
by = Utils.selection_to_rbexpr_list(by)
|
@@ -1578,7 +1578,7 @@ module Polars
|
|
1578
1578
|
# # │ two ┆ 99 │
|
1579
1579
|
# # └───────┴───────┘
|
1580
1580
|
def take(indices)
|
1581
|
-
if indices.is_a?(Array)
|
1581
|
+
if indices.is_a?(::Array)
|
1582
1582
|
indices_lit = Polars.lit(Series.new("", indices, dtype: :u32))
|
1583
1583
|
else
|
1584
1584
|
indices_lit = Utils.expr_to_lit_or_expr(indices, str_to_lit: false)
|
@@ -2436,14 +2436,14 @@ module Polars
|
|
2436
2436
|
# ).sort("group_col")
|
2437
2437
|
# # =>
|
2438
2438
|
# # shape: (2, 3)
|
2439
|
-
# #
|
2440
|
-
# # │ group_col ┆ lt
|
2441
|
-
# # │ --- ┆ ---
|
2442
|
-
# # │ str ┆ i64
|
2443
|
-
# #
|
2444
|
-
# # │ g1 ┆ 1
|
2445
|
-
# # │ g2 ┆
|
2446
|
-
# #
|
2439
|
+
# # ┌───────────┬─────┬─────┐
|
2440
|
+
# # │ group_col ┆ lt ┆ gte │
|
2441
|
+
# # │ --- ┆ --- ┆ --- │
|
2442
|
+
# # │ str ┆ i64 ┆ i64 │
|
2443
|
+
# # ╞═══════════╪═════╪═════╡
|
2444
|
+
# # │ g1 ┆ 1 ┆ 2 │
|
2445
|
+
# # │ g2 ┆ 0 ┆ 3 │
|
2446
|
+
# # └───────────┴─────┴─────┘
|
2447
2447
|
def filter(predicate)
|
2448
2448
|
wrap_expr(_rbexpr.filter(predicate._rbexpr))
|
2449
2449
|
end
|
@@ -2474,14 +2474,14 @@ module Polars
|
|
2474
2474
|
# ).sort("group_col")
|
2475
2475
|
# # =>
|
2476
2476
|
# # shape: (2, 3)
|
2477
|
-
# #
|
2478
|
-
# # │ group_col ┆ lt
|
2479
|
-
# # │ --- ┆ ---
|
2480
|
-
# # │ str ┆ i64
|
2481
|
-
# #
|
2482
|
-
# # │ g1 ┆ 1
|
2483
|
-
# # │ g2 ┆
|
2484
|
-
# #
|
2477
|
+
# # ┌───────────┬─────┬─────┐
|
2478
|
+
# # │ group_col ┆ lt ┆ gte │
|
2479
|
+
# # │ --- ┆ --- ┆ --- │
|
2480
|
+
# # │ str ┆ i64 ┆ i64 │
|
2481
|
+
# # ╞═══════════╪═════╪═════╡
|
2482
|
+
# # │ g1 ┆ 1 ┆ 2 │
|
2483
|
+
# # │ g2 ┆ 0 ┆ 3 │
|
2484
|
+
# # └───────────┴─────┴─────┘
|
2485
2485
|
def where(predicate)
|
2486
2486
|
filter(predicate)
|
2487
2487
|
end
|
@@ -2616,25 +2616,23 @@ module Polars
|
|
2616
2616
|
# @return [Expr]
|
2617
2617
|
#
|
2618
2618
|
# @example
|
2619
|
-
#
|
2620
|
-
#
|
2621
|
-
#
|
2622
|
-
#
|
2623
|
-
#
|
2624
|
-
#
|
2625
|
-
#
|
2626
|
-
#
|
2627
|
-
#
|
2628
|
-
#
|
2629
|
-
#
|
2630
|
-
#
|
2631
|
-
#
|
2632
|
-
#
|
2633
|
-
#
|
2634
|
-
#
|
2635
|
-
#
|
2636
|
-
# # │ d │
|
2637
|
-
# # └─────┘
|
2619
|
+
# df = Polars::DataFrame.new(
|
2620
|
+
# {
|
2621
|
+
# "group" => ["a", "b", "b"],
|
2622
|
+
# "values" => [[1, 2], [2, 3], [4]]
|
2623
|
+
# }
|
2624
|
+
# )
|
2625
|
+
# df.groupby("group").agg(Polars.col("values").flatten)
|
2626
|
+
# # =>
|
2627
|
+
# # shape: (2, 2)
|
2628
|
+
# # ┌───────┬───────────┐
|
2629
|
+
# # │ group ┆ values │
|
2630
|
+
# # │ --- ┆ --- │
|
2631
|
+
# # │ str ┆ list[i64] │
|
2632
|
+
# # ╞═══════╪═══════════╡
|
2633
|
+
# # │ a ┆ [1, 2] │
|
2634
|
+
# # │ b ┆ [2, 3, 4] │
|
2635
|
+
# # └───────┴───────────┘
|
2638
2636
|
def flatten
|
2639
2637
|
wrap_expr(_rbexpr.explode)
|
2640
2638
|
end
|
@@ -2798,7 +2796,7 @@ module Polars
|
|
2798
2796
|
# # │ false │
|
2799
2797
|
# # └──────────┘
|
2800
2798
|
def is_in(other)
|
2801
|
-
if other.is_a?(Array)
|
2799
|
+
if other.is_a?(::Array)
|
2802
2800
|
if other.length == 0
|
2803
2801
|
other = Polars.lit(nil)
|
2804
2802
|
else
|
@@ -3502,14 +3500,15 @@ module Polars
|
|
3502
3500
|
min_periods: nil,
|
3503
3501
|
center: false,
|
3504
3502
|
by: nil,
|
3505
|
-
closed: "left"
|
3503
|
+
closed: "left",
|
3504
|
+
ddof: 1
|
3506
3505
|
)
|
3507
3506
|
window_size, min_periods = _prepare_rolling_window_args(
|
3508
3507
|
window_size, min_periods
|
3509
3508
|
)
|
3510
3509
|
wrap_expr(
|
3511
3510
|
_rbexpr.rolling_std(
|
3512
|
-
window_size, weights, min_periods, center, by, closed
|
3511
|
+
window_size, weights, min_periods, center, by, closed, ddof
|
3513
3512
|
)
|
3514
3513
|
)
|
3515
3514
|
end
|
@@ -3591,14 +3590,15 @@ module Polars
|
|
3591
3590
|
min_periods: nil,
|
3592
3591
|
center: false,
|
3593
3592
|
by: nil,
|
3594
|
-
closed: "left"
|
3593
|
+
closed: "left",
|
3594
|
+
ddof: 1
|
3595
3595
|
)
|
3596
3596
|
window_size, min_periods = _prepare_rolling_window_args(
|
3597
3597
|
window_size, min_periods
|
3598
3598
|
)
|
3599
3599
|
wrap_expr(
|
3600
3600
|
_rbexpr.rolling_var(
|
3601
|
-
window_size, weights, min_periods, center, by, closed
|
3601
|
+
window_size, weights, min_periods, center, by, closed, ddof
|
3602
3602
|
)
|
3603
3603
|
)
|
3604
3604
|
end
|
@@ -4558,11 +4558,11 @@ module Polars
|
|
4558
4558
|
# # │ 1 │
|
4559
4559
|
# # │ 3 │
|
4560
4560
|
# # └─────┘
|
4561
|
-
def shuffle(seed: nil)
|
4561
|
+
def shuffle(seed: nil, fixed_seed: false)
|
4562
4562
|
if seed.nil?
|
4563
4563
|
seed = rand(10000)
|
4564
4564
|
end
|
4565
|
-
wrap_expr(_rbexpr.shuffle(seed))
|
4565
|
+
wrap_expr(_rbexpr.shuffle(seed, fixed_seed))
|
4566
4566
|
end
|
4567
4567
|
|
4568
4568
|
# Sample from this expression.
|
@@ -4600,21 +4600,22 @@ module Polars
|
|
4600
4600
|
with_replacement: true,
|
4601
4601
|
shuffle: false,
|
4602
4602
|
seed: nil,
|
4603
|
-
n: nil
|
4603
|
+
n: nil,
|
4604
|
+
fixed_seed: false
|
4604
4605
|
)
|
4605
4606
|
if !n.nil? && !frac.nil?
|
4606
4607
|
raise ArgumentError, "cannot specify both `n` and `frac`"
|
4607
4608
|
end
|
4608
4609
|
|
4609
4610
|
if !n.nil? && frac.nil?
|
4610
|
-
return wrap_expr(_rbexpr.sample_n(n, with_replacement, shuffle, seed))
|
4611
|
+
return wrap_expr(_rbexpr.sample_n(n, with_replacement, shuffle, seed, fixed_seed))
|
4611
4612
|
end
|
4612
4613
|
|
4613
4614
|
if frac.nil?
|
4614
4615
|
frac = 1.0
|
4615
4616
|
end
|
4616
4617
|
wrap_expr(
|
4617
|
-
_rbexpr.sample_frac(frac, with_replacement, shuffle, seed)
|
4618
|
+
_rbexpr.sample_frac(frac, with_replacement, shuffle, seed, fixed_seed)
|
4618
4619
|
)
|
4619
4620
|
end
|
4620
4621
|
|
@@ -4929,8 +4930,8 @@ module Polars
|
|
4929
4930
|
#
|
4930
4931
|
# Enables downstream code to user fast paths for sorted arrays.
|
4931
4932
|
#
|
4932
|
-
# @param
|
4933
|
-
#
|
4933
|
+
# @param descending [Boolean]
|
4934
|
+
# Whether the `Series` order is descending.
|
4934
4935
|
#
|
4935
4936
|
# @return [Expr]
|
4936
4937
|
#
|
@@ -4950,9 +4951,9 @@ module Polars
|
|
4950
4951
|
# # ╞════════╡
|
4951
4952
|
# # │ 3 │
|
4952
4953
|
# # └────────┘
|
4953
|
-
|
4954
|
-
|
4955
|
-
|
4954
|
+
def set_sorted(descending: false)
|
4955
|
+
wrap_expr(_rbexpr.set_sorted_flag(descending))
|
4956
|
+
end
|
4956
4957
|
|
4957
4958
|
# Aggregate to list.
|
4958
4959
|
#
|
@@ -4965,7 +4966,7 @@ module Polars
|
|
4965
4966
|
# "b" => [4, 5, 6]
|
4966
4967
|
# }
|
4967
4968
|
# )
|
4968
|
-
# df.select(Polars.all.
|
4969
|
+
# df.select(Polars.all.implode)
|
4969
4970
|
# # =>
|
4970
4971
|
# # shape: (1, 2)
|
4971
4972
|
# # ┌───────────┬───────────┐
|
@@ -4978,7 +4979,6 @@ module Polars
|
|
4978
4979
|
def implode
|
4979
4980
|
wrap_expr(_rbexpr.implode)
|
4980
4981
|
end
|
4981
|
-
alias_method :list, :implode
|
4982
4982
|
|
4983
4983
|
# Shrink numeric columns to the minimal required datatype.
|
4984
4984
|
#
|
@@ -5018,10 +5018,17 @@ module Polars
|
|
5018
5018
|
# Create an object namespace of all list related methods.
|
5019
5019
|
#
|
5020
5020
|
# @return [ListExpr]
|
5021
|
-
def
|
5021
|
+
def list
|
5022
5022
|
ListExpr.new(self)
|
5023
5023
|
end
|
5024
5024
|
|
5025
|
+
# Create an object namespace of all array related methods.
|
5026
|
+
#
|
5027
|
+
# @return [ArrayExpr]
|
5028
|
+
def arr
|
5029
|
+
ArrayExpr.new(self)
|
5030
|
+
end
|
5031
|
+
|
5025
5032
|
# Create an object namespace of all binary related methods.
|
5026
5033
|
#
|
5027
5034
|
# @return [BinaryExpr]
|
data/lib/polars/functions.rb
CHANGED
data/lib/polars/group_by.rb
CHANGED
@@ -551,32 +551,11 @@ module Polars
|
|
551
551
|
agg(Polars.all.median)
|
552
552
|
end
|
553
553
|
|
554
|
-
# Aggregate the groups into Series.
|
555
|
-
#
|
556
|
-
# @return [DataFrame]
|
557
|
-
#
|
558
|
-
# @example
|
559
|
-
# df = Polars::DataFrame.new({"a" => ["one", "two", "one", "two"], "b" => [1, 2, 3, 4]})
|
560
|
-
# df.groupby("a", maintain_order: true).agg_list
|
561
|
-
# # =>
|
562
|
-
# # shape: (2, 2)
|
563
|
-
# # ┌─────┬─────────────────┐
|
564
|
-
# # │ a ┆ b │
|
565
|
-
# # │ --- ┆ --- │
|
566
|
-
# # │ str ┆ list[list[i64]] │
|
567
|
-
# # ╞═════╪═════════════════╡
|
568
|
-
# # │ one ┆ [[1, 3]] │
|
569
|
-
# # │ two ┆ [[2, 4]] │
|
570
|
-
# # └─────┴─────────────────┘
|
571
|
-
def agg_list
|
572
|
-
agg(Polars.all.list)
|
573
|
-
end
|
574
|
-
|
575
554
|
# Plot data.
|
576
555
|
#
|
577
556
|
# @return [Vega::LiteChart]
|
578
557
|
def plot(*args, **options)
|
579
|
-
raise ArgumentError, "Multiple groups not supported" if by.is_a?(Array) && by.size > 1
|
558
|
+
raise ArgumentError, "Multiple groups not supported" if by.is_a?(::Array) && by.size > 1
|
580
559
|
# same message as Ruby
|
581
560
|
raise ArgumentError, "unknown keyword: :group" if options.key?(:group)
|
582
561
|
|