polars-df 0.5.0-arm64-darwin → 0.7.0-arm64-darwin
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 +26 -0
- data/Cargo.lock +595 -709
- data/Cargo.toml +1 -0
- data/LICENSE-THIRD-PARTY.txt +4572 -5214
- data/README.md +11 -9
- data/lib/polars/3.0/polars.bundle +0 -0
- data/lib/polars/3.1/polars.bundle +0 -0
- data/lib/polars/3.2/polars.bundle +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/config.rb +530 -0
- data/lib/polars/data_frame.rb +206 -131
- data/lib/polars/data_types.rb +163 -29
- data/lib/polars/date_time_expr.rb +13 -18
- data/lib/polars/date_time_name_space.rb +22 -28
- data/lib/polars/dynamic_group_by.rb +2 -2
- data/lib/polars/expr.rb +241 -151
- data/lib/polars/functions.rb +29 -38
- data/lib/polars/group_by.rb +38 -76
- data/lib/polars/io.rb +37 -2
- data/lib/polars/lazy_frame.rb +174 -95
- data/lib/polars/lazy_functions.rb +87 -63
- data/lib/polars/lazy_group_by.rb +7 -8
- data/lib/polars/list_expr.rb +40 -36
- data/lib/polars/list_name_space.rb +15 -15
- data/lib/polars/name_expr.rb +198 -0
- data/lib/polars/rolling_group_by.rb +6 -4
- data/lib/polars/series.rb +95 -28
- data/lib/polars/sql_context.rb +194 -0
- data/lib/polars/string_expr.rb +249 -69
- data/lib/polars/string_name_space.rb +155 -25
- data/lib/polars/utils.rb +119 -57
- data/lib/polars/version.rb +1 -1
- data/lib/polars.rb +6 -0
- metadata +7 -2
@@ -1,9 +1,9 @@
|
|
1
1
|
module Polars
|
2
|
-
# Series.
|
2
|
+
# Series.list namespace.
|
3
3
|
class ListNameSpace
|
4
4
|
include ExprDispatch
|
5
5
|
|
6
|
-
self._accessor = "
|
6
|
+
self._accessor = "list"
|
7
7
|
|
8
8
|
# @private
|
9
9
|
def initialize(series)
|
@@ -16,7 +16,7 @@ module Polars
|
|
16
16
|
#
|
17
17
|
# @example
|
18
18
|
# s = Polars::Series.new([[1, 2, 3], [5]])
|
19
|
-
# s.
|
19
|
+
# s.list.lengths
|
20
20
|
# # =>
|
21
21
|
# # shape: (2,)
|
22
22
|
# # Series: '' [u32]
|
@@ -119,13 +119,13 @@ module Polars
|
|
119
119
|
#
|
120
120
|
# @example
|
121
121
|
# s = Polars::Series.new([["foo", "bar"], ["hello", "world"]])
|
122
|
-
# s.
|
122
|
+
# s.list.join("-")
|
123
123
|
# # =>
|
124
124
|
# # shape: (2,)
|
125
125
|
# # Series: '' [str]
|
126
126
|
# # [
|
127
|
-
# #
|
128
|
-
# #
|
127
|
+
# # "foo-bar"
|
128
|
+
# # "hello-world"
|
129
129
|
# # ]
|
130
130
|
def join(separator)
|
131
131
|
super
|
@@ -180,7 +180,7 @@ module Polars
|
|
180
180
|
#
|
181
181
|
# @example
|
182
182
|
# s = Polars::Series.new("a", [[1, 2, 3, 4], [10, 2, 1]])
|
183
|
-
# s.
|
183
|
+
# s.list.diff
|
184
184
|
# # =>
|
185
185
|
# # shape: (2,)
|
186
186
|
# # Series: 'a' [list[i64]]
|
@@ -201,7 +201,7 @@ module Polars
|
|
201
201
|
#
|
202
202
|
# @example
|
203
203
|
# s = Polars::Series.new("a", [[1, 2, 3, 4], [10, 2, 1]])
|
204
|
-
# s.
|
204
|
+
# s.list.shift
|
205
205
|
# # =>
|
206
206
|
# # shape: (2,)
|
207
207
|
# # Series: 'a' [list[i64]]
|
@@ -225,7 +225,7 @@ module Polars
|
|
225
225
|
#
|
226
226
|
# @example
|
227
227
|
# s = Polars::Series.new("a", [[1, 2, 3, 4], [10, 2, 1]])
|
228
|
-
# s.
|
228
|
+
# s.list.slice(1, 2)
|
229
229
|
# # =>
|
230
230
|
# # shape: (2,)
|
231
231
|
# # Series: 'a' [list[i64]]
|
@@ -246,7 +246,7 @@ module Polars
|
|
246
246
|
#
|
247
247
|
# @example
|
248
248
|
# s = Polars::Series.new("a", [[1, 2, 3, 4], [10, 2, 1]])
|
249
|
-
# s.
|
249
|
+
# s.list.head(2)
|
250
250
|
# # =>
|
251
251
|
# # shape: (2,)
|
252
252
|
# # Series: 'a' [list[i64]]
|
@@ -267,7 +267,7 @@ module Polars
|
|
267
267
|
#
|
268
268
|
# @example
|
269
269
|
# s = Polars::Series.new("a", [[1, 2, 3, 4], [10, 2, 1]])
|
270
|
-
# s.
|
270
|
+
# s.list.tail(2)
|
271
271
|
# # =>
|
272
272
|
# # shape: (2,)
|
273
273
|
# # Series: 'a' [list[i64]]
|
@@ -291,7 +291,7 @@ module Polars
|
|
291
291
|
#
|
292
292
|
# @example
|
293
293
|
# df = Polars::DataFrame.new({"a" => [[1, 2, 3], [1, 2]]})
|
294
|
-
# df.select([Polars.col("a").
|
294
|
+
# df.select([Polars.col("a").list.to_struct])
|
295
295
|
# # =>
|
296
296
|
# # shape: (2, 1)
|
297
297
|
# # ┌────────────┐
|
@@ -315,7 +315,7 @@ module Polars
|
|
315
315
|
# Run all expression parallel. Don't activate this blindly.
|
316
316
|
# Parallelism is worth it if there is enough work to do per thread.
|
317
317
|
#
|
318
|
-
# This likely should not be use in the
|
318
|
+
# This likely should not be use in the group by context, because we already
|
319
319
|
# parallel execution per group
|
320
320
|
#
|
321
321
|
# @return [Series]
|
@@ -323,14 +323,14 @@ module Polars
|
|
323
323
|
# @example
|
324
324
|
# df = Polars::DataFrame.new({"a" => [1, 8, 3], "b" => [4, 5, 2]})
|
325
325
|
# df.with_column(
|
326
|
-
# Polars.concat_list(["a", "b"]).
|
326
|
+
# Polars.concat_list(["a", "b"]).list.eval(Polars.element.rank).alias("rank")
|
327
327
|
# )
|
328
328
|
# # =>
|
329
329
|
# # shape: (3, 3)
|
330
330
|
# # ┌─────┬─────┬────────────┐
|
331
331
|
# # │ a ┆ b ┆ rank │
|
332
332
|
# # │ --- ┆ --- ┆ --- │
|
333
|
-
# # │ i64 ┆ i64 ┆ list[
|
333
|
+
# # │ i64 ┆ i64 ┆ list[f64] │
|
334
334
|
# # ╞═════╪═════╪════════════╡
|
335
335
|
# # │ 1 ┆ 4 ┆ [1.0, 2.0] │
|
336
336
|
# # │ 8 ┆ 5 ┆ [2.0, 1.0] │
|
@@ -0,0 +1,198 @@
|
|
1
|
+
module Polars
|
2
|
+
# Namespace for expressions that operate on expression names.
|
3
|
+
class NameExpr
|
4
|
+
# @private
|
5
|
+
attr_accessor :_rbexpr
|
6
|
+
|
7
|
+
# @private
|
8
|
+
def initialize(expr)
|
9
|
+
self._rbexpr = expr._rbexpr
|
10
|
+
end
|
11
|
+
|
12
|
+
# Keep the original root name of the expression.
|
13
|
+
#
|
14
|
+
# @note
|
15
|
+
# Due to implementation constraints, this method can only be called as the last
|
16
|
+
# expression in a chain.
|
17
|
+
#
|
18
|
+
# @return [Expr]
|
19
|
+
#
|
20
|
+
# @example Prevent errors due to potential duplicate column names.
|
21
|
+
# df = Polars::DataFrame.new(
|
22
|
+
# {
|
23
|
+
# "a" => [1, 2],
|
24
|
+
# "b" => [3, 4]
|
25
|
+
# }
|
26
|
+
# )
|
27
|
+
# df.select((Polars.lit(10) / Polars.all).name.keep)
|
28
|
+
# # =>
|
29
|
+
# # shape: (2, 2)
|
30
|
+
# # ┌──────┬──────────┐
|
31
|
+
# # │ a ┆ b │
|
32
|
+
# # │ --- ┆ --- │
|
33
|
+
# # │ f64 ┆ f64 │
|
34
|
+
# # ╞══════╪══════════╡
|
35
|
+
# # │ 10.0 ┆ 3.333333 │
|
36
|
+
# # │ 5.0 ┆ 2.5 │
|
37
|
+
# # └──────┴──────────┘
|
38
|
+
#
|
39
|
+
# @example Undo an alias operation.
|
40
|
+
# df.with_columns((Polars.col("a") * 9).alias("c").name.keep)
|
41
|
+
# # =>
|
42
|
+
# # shape: (2, 2)
|
43
|
+
# # ┌─────┬─────┐
|
44
|
+
# # │ a ┆ b │
|
45
|
+
# # │ --- ┆ --- │
|
46
|
+
# # │ i64 ┆ i64 │
|
47
|
+
# # ╞═════╪═════╡
|
48
|
+
# # │ 9 ┆ 3 │
|
49
|
+
# # │ 18 ┆ 4 │
|
50
|
+
# # └─────┴─────┘
|
51
|
+
def keep
|
52
|
+
Utils.wrap_expr(_rbexpr.name_keep)
|
53
|
+
end
|
54
|
+
|
55
|
+
# Rename the output of an expression by mapping a function over the root name.
|
56
|
+
#
|
57
|
+
# @return [Expr]
|
58
|
+
#
|
59
|
+
# @example Remove a common suffix and convert to lower case.
|
60
|
+
# df = Polars::DataFrame.new(
|
61
|
+
# {
|
62
|
+
# "A_reverse" => [3, 2, 1],
|
63
|
+
# "B_reverse" => ["z", "y", "x"]
|
64
|
+
# }
|
65
|
+
# )
|
66
|
+
# df.with_columns(
|
67
|
+
# Polars.all.reverse.name.map { |c| c.delete_suffix("_reverse").downcase }
|
68
|
+
# )
|
69
|
+
# # =>
|
70
|
+
# # shape: (3, 4)
|
71
|
+
# # ┌───────────┬───────────┬─────┬─────┐
|
72
|
+
# # │ A_reverse ┆ B_reverse ┆ a ┆ b │
|
73
|
+
# # │ --- ┆ --- ┆ --- ┆ --- │
|
74
|
+
# # │ i64 ┆ str ┆ i64 ┆ str │
|
75
|
+
# # ╞═══════════╪═══════════╪═════╪═════╡
|
76
|
+
# # │ 3 ┆ z ┆ 1 ┆ x │
|
77
|
+
# # │ 2 ┆ y ┆ 2 ┆ y │
|
78
|
+
# # │ 1 ┆ x ┆ 3 ┆ z │
|
79
|
+
# # └───────────┴───────────┴─────┴─────┘
|
80
|
+
def map(&f)
|
81
|
+
Utils.wrap_expr(_rbexpr.name_map(f))
|
82
|
+
end
|
83
|
+
|
84
|
+
# Add a prefix to the root column name of the expression.
|
85
|
+
#
|
86
|
+
# @param prefix [Object]
|
87
|
+
# Prefix to add to the root column name.
|
88
|
+
#
|
89
|
+
# @return [Expr]
|
90
|
+
#
|
91
|
+
# @example
|
92
|
+
# df = Polars::DataFrame.new(
|
93
|
+
# {
|
94
|
+
# "a" => [1, 2, 3],
|
95
|
+
# "b" => ["x", "y", "z"]
|
96
|
+
# }
|
97
|
+
# )
|
98
|
+
# df.with_columns(Polars.all.reverse.name.prefix("reverse_"))
|
99
|
+
# # =>
|
100
|
+
# # shape: (3, 4)
|
101
|
+
# # ┌─────┬─────┬───────────┬───────────┐
|
102
|
+
# # │ a ┆ b ┆ reverse_a ┆ reverse_b │
|
103
|
+
# # │ --- ┆ --- ┆ --- ┆ --- │
|
104
|
+
# # │ i64 ┆ str ┆ i64 ┆ str │
|
105
|
+
# # ╞═════╪═════╪═══════════╪═══════════╡
|
106
|
+
# # │ 1 ┆ x ┆ 3 ┆ z │
|
107
|
+
# # │ 2 ┆ y ┆ 2 ┆ y │
|
108
|
+
# # │ 3 ┆ z ┆ 1 ┆ x │
|
109
|
+
# # └─────┴─────┴───────────┴───────────┘
|
110
|
+
def prefix(prefix)
|
111
|
+
Utils.wrap_expr(_rbexpr.name_prefix(prefix))
|
112
|
+
end
|
113
|
+
|
114
|
+
# Add a suffix to the root column name of the expression.
|
115
|
+
#
|
116
|
+
# @param suffix [Object]
|
117
|
+
# Suffix to add to the root column name.
|
118
|
+
#
|
119
|
+
# @return [Expr]
|
120
|
+
#
|
121
|
+
# @example
|
122
|
+
# df = Polars::DataFrame.new(
|
123
|
+
# {
|
124
|
+
# "a" => [1, 2, 3],
|
125
|
+
# "b" => ["x", "y", "z"]
|
126
|
+
# }
|
127
|
+
# )
|
128
|
+
# df.with_columns(Polars.all.reverse.name.suffix("_reverse"))
|
129
|
+
# # =>
|
130
|
+
# # shape: (3, 4)
|
131
|
+
# # ┌─────┬─────┬───────────┬───────────┐
|
132
|
+
# # │ a ┆ b ┆ a_reverse ┆ b_reverse │
|
133
|
+
# # │ --- ┆ --- ┆ --- ┆ --- │
|
134
|
+
# # │ i64 ┆ str ┆ i64 ┆ str │
|
135
|
+
# # ╞═════╪═════╪═══════════╪═══════════╡
|
136
|
+
# # │ 1 ┆ x ┆ 3 ┆ z │
|
137
|
+
# # │ 2 ┆ y ┆ 2 ┆ y │
|
138
|
+
# # │ 3 ┆ z ┆ 1 ┆ x │
|
139
|
+
# # └─────┴─────┴───────────┴───────────┘
|
140
|
+
def suffix(suffix)
|
141
|
+
Utils.wrap_expr(_rbexpr.name_suffix(suffix))
|
142
|
+
end
|
143
|
+
|
144
|
+
# Make the root column name lowercase.
|
145
|
+
#
|
146
|
+
# @return [Expr]
|
147
|
+
#
|
148
|
+
# @example
|
149
|
+
# df = Polars::DataFrame.new(
|
150
|
+
# {
|
151
|
+
# "ColX" => [1, 2, 3],
|
152
|
+
# "ColY" => ["x", "y", "z"],
|
153
|
+
# }
|
154
|
+
# )
|
155
|
+
# df.with_columns(Polars.all.name.to_lowercase)
|
156
|
+
# # =>
|
157
|
+
# # shape: (3, 4)
|
158
|
+
# # ┌──────┬──────┬──────┬──────┐
|
159
|
+
# # │ ColX ┆ ColY ┆ colx ┆ coly │
|
160
|
+
# # │ --- ┆ --- ┆ --- ┆ --- │
|
161
|
+
# # │ i64 ┆ str ┆ i64 ┆ str │
|
162
|
+
# # ╞══════╪══════╪══════╪══════╡
|
163
|
+
# # │ 1 ┆ x ┆ 1 ┆ x │
|
164
|
+
# # │ 2 ┆ y ┆ 2 ┆ y │
|
165
|
+
# # │ 3 ┆ z ┆ 3 ┆ z │
|
166
|
+
# # └──────┴──────┴──────┴──────┘
|
167
|
+
def to_lowercase
|
168
|
+
Utils.wrap_expr(_rbexpr.name_to_lowercase)
|
169
|
+
end
|
170
|
+
|
171
|
+
# Make the root column name uppercase.
|
172
|
+
#
|
173
|
+
# @return [Expr]
|
174
|
+
#
|
175
|
+
# @example
|
176
|
+
# df = Polars::DataFrame.new(
|
177
|
+
# {
|
178
|
+
# "ColX" => [1, 2, 3],
|
179
|
+
# "ColY" => ["x", "y", "z"]
|
180
|
+
# }
|
181
|
+
# )
|
182
|
+
# df.with_columns(Polars.all.name.to_uppercase)
|
183
|
+
# # =>
|
184
|
+
# # shape: (3, 4)
|
185
|
+
# # ┌──────┬──────┬──────┬──────┐
|
186
|
+
# # │ ColX ┆ ColY ┆ COLX ┆ COLY │
|
187
|
+
# # │ --- ┆ --- ┆ --- ┆ --- │
|
188
|
+
# # │ i64 ┆ str ┆ i64 ┆ str │
|
189
|
+
# # ╞══════╪══════╪══════╪══════╡
|
190
|
+
# # │ 1 ┆ x ┆ 1 ┆ x │
|
191
|
+
# # │ 2 ┆ y ┆ 2 ┆ y │
|
192
|
+
# # │ 3 ┆ z ┆ 3 ┆ z │
|
193
|
+
# # └──────┴──────┴──────┴──────┘
|
194
|
+
def to_uppercase
|
195
|
+
Utils.wrap_expr(_rbexpr.name_to_uppercase)
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
@@ -2,7 +2,7 @@ module Polars
|
|
2
2
|
# A rolling grouper.
|
3
3
|
#
|
4
4
|
# This has an `.agg` method which will allow you to run all polars expressions in a
|
5
|
-
#
|
5
|
+
# group by context.
|
6
6
|
class RollingGroupBy
|
7
7
|
def initialize(
|
8
8
|
df,
|
@@ -10,7 +10,8 @@ module Polars
|
|
10
10
|
period,
|
11
11
|
offset,
|
12
12
|
closed,
|
13
|
-
by
|
13
|
+
by,
|
14
|
+
check_sorted
|
14
15
|
)
|
15
16
|
period = Utils._timedelta_to_pl_duration(period)
|
16
17
|
offset = Utils._timedelta_to_pl_duration(offset)
|
@@ -21,12 +22,13 @@ module Polars
|
|
21
22
|
@offset = offset
|
22
23
|
@closed = closed
|
23
24
|
@by = by
|
25
|
+
@check_sorted = check_sorted
|
24
26
|
end
|
25
27
|
|
26
28
|
def agg(aggs)
|
27
29
|
@df.lazy
|
28
|
-
.
|
29
|
-
index_column: @time_column, period: @period, offset: @offset, closed: @closed, by: @by
|
30
|
+
.group_by_rolling(
|
31
|
+
index_column: @time_column, period: @period, offset: @offset, closed: @closed, by: @by, check_sorted: @check_sorted
|
30
32
|
)
|
31
33
|
.agg(aggs)
|
32
34
|
.collect(no_optimization: true, string_cache: false)
|
data/lib/polars/series.rb
CHANGED
@@ -65,7 +65,7 @@ module Polars
|
|
65
65
|
)
|
66
66
|
.rename(name, in_place: true)
|
67
67
|
._s
|
68
|
-
elsif values.is_a?(Array)
|
68
|
+
elsif values.is_a?(::Array)
|
69
69
|
self._s = sequence_to_rbseries(name, values, dtype: dtype, strict: strict, dtype_if_empty: dtype_if_empty)
|
70
70
|
elsif defined?(Numo::NArray) && values.is_a?(Numo::NArray)
|
71
71
|
self._s = numo_to_rbseries(name, values, strict: strict, nan_to_null: nan_to_null)
|
@@ -317,6 +317,10 @@ module Polars
|
|
317
317
|
end
|
318
318
|
|
319
319
|
if item.is_a?(Integer)
|
320
|
+
if item < 0
|
321
|
+
item = len + item
|
322
|
+
end
|
323
|
+
|
320
324
|
return _s.get_idx(item)
|
321
325
|
end
|
322
326
|
|
@@ -335,7 +339,7 @@ module Polars
|
|
335
339
|
#
|
336
340
|
# @return [Object]
|
337
341
|
def []=(key, value)
|
338
|
-
if value.is_a?(Array)
|
342
|
+
if value.is_a?(::Array)
|
339
343
|
if is_numeric || is_datelike
|
340
344
|
set_at_idx(key, value)
|
341
345
|
return
|
@@ -353,7 +357,7 @@ module Polars
|
|
353
357
|
else
|
354
358
|
raise Todo
|
355
359
|
end
|
356
|
-
elsif key.is_a?(Array)
|
360
|
+
elsif key.is_a?(::Array)
|
357
361
|
s = Utils.wrap_s(sequence_to_rbseries("", key, dtype: UInt32))
|
358
362
|
self[s] = value
|
359
363
|
elsif key.is_a?(Range)
|
@@ -428,6 +432,18 @@ module Polars
|
|
428
432
|
end
|
429
433
|
alias_method :all, :all?
|
430
434
|
|
435
|
+
# Check if all boolean values in the column are `false`.
|
436
|
+
#
|
437
|
+
# @return [Boolean]
|
438
|
+
def none?(&block)
|
439
|
+
if block_given?
|
440
|
+
apply(&block).none?
|
441
|
+
else
|
442
|
+
to_frame.select(Polars.col(name).is_not.all).to_series[0]
|
443
|
+
end
|
444
|
+
end
|
445
|
+
alias_method :none, :none?
|
446
|
+
|
431
447
|
# Compute the logarithm to a given base.
|
432
448
|
#
|
433
449
|
# @param base [Float]
|
@@ -715,8 +731,8 @@ module Polars
|
|
715
731
|
# # │ 0 ┆ 1 ┆ 0 │
|
716
732
|
# # │ 0 ┆ 0 ┆ 1 │
|
717
733
|
# # └─────┴─────┴─────┘
|
718
|
-
def to_dummies(separator: "_")
|
719
|
-
Utils.wrap_df(_s.to_dummies(separator))
|
734
|
+
def to_dummies(separator: "_", drop_first: false)
|
735
|
+
Utils.wrap_df(_s.to_dummies(separator, drop_first))
|
720
736
|
end
|
721
737
|
|
722
738
|
# Count the unique values in a Series.
|
@@ -795,7 +811,7 @@ module Polars
|
|
795
811
|
# Number of valid values there should be in the window before the expression
|
796
812
|
# is evaluated. valid values = `length - null_count`
|
797
813
|
# @param parallel [Boolean]
|
798
|
-
# Run in parallel. Don't do this in a
|
814
|
+
# Run in parallel. Don't do this in a group by or another operation that
|
799
815
|
# already has much parallelization.
|
800
816
|
#
|
801
817
|
# @return [Series]
|
@@ -1124,7 +1140,7 @@ module Polars
|
|
1124
1140
|
# # 3
|
1125
1141
|
# # ]
|
1126
1142
|
def filter(predicate)
|
1127
|
-
if predicate.is_a?(Array)
|
1143
|
+
if predicate.is_a?(::Array)
|
1128
1144
|
predicate = Series.new("", predicate)
|
1129
1145
|
end
|
1130
1146
|
Utils.wrap_s(_s.filter(predicate._s))
|
@@ -2813,7 +2829,8 @@ module Polars
|
|
2813
2829
|
window_size,
|
2814
2830
|
weights: nil,
|
2815
2831
|
min_periods: nil,
|
2816
|
-
center: false
|
2832
|
+
center: false,
|
2833
|
+
ddof: 1
|
2817
2834
|
)
|
2818
2835
|
to_frame
|
2819
2836
|
.select(
|
@@ -2821,7 +2838,8 @@ module Polars
|
|
2821
2838
|
window_size,
|
2822
2839
|
weights: weights,
|
2823
2840
|
min_periods: min_periods,
|
2824
|
-
center: center
|
2841
|
+
center: center,
|
2842
|
+
ddof: ddof
|
2825
2843
|
)
|
2826
2844
|
)
|
2827
2845
|
.to_series
|
@@ -2864,7 +2882,8 @@ module Polars
|
|
2864
2882
|
window_size,
|
2865
2883
|
weights: nil,
|
2866
2884
|
min_periods: nil,
|
2867
|
-
center: false
|
2885
|
+
center: false,
|
2886
|
+
ddof: 1
|
2868
2887
|
)
|
2869
2888
|
to_frame
|
2870
2889
|
.select(
|
@@ -2872,7 +2891,8 @@ module Polars
|
|
2872
2891
|
window_size,
|
2873
2892
|
weights: weights,
|
2874
2893
|
min_periods: min_periods,
|
2875
|
-
center: center
|
2894
|
+
center: center,
|
2895
|
+
ddof: ddof
|
2876
2896
|
)
|
2877
2897
|
)
|
2878
2898
|
.to_series
|
@@ -3089,7 +3109,7 @@ module Polars
|
|
3089
3109
|
# s.peak_max
|
3090
3110
|
# # =>
|
3091
3111
|
# # shape: (5,)
|
3092
|
-
# # Series: '' [bool]
|
3112
|
+
# # Series: 'a' [bool]
|
3093
3113
|
# # [
|
3094
3114
|
# # false
|
3095
3115
|
# # false
|
@@ -3098,7 +3118,7 @@ module Polars
|
|
3098
3118
|
# # true
|
3099
3119
|
# # ]
|
3100
3120
|
def peak_max
|
3101
|
-
|
3121
|
+
super
|
3102
3122
|
end
|
3103
3123
|
|
3104
3124
|
# Get a boolean mask of the local minimum peaks.
|
@@ -3110,7 +3130,7 @@ module Polars
|
|
3110
3130
|
# s.peak_min
|
3111
3131
|
# # =>
|
3112
3132
|
# # shape: (5,)
|
3113
|
-
# # Series: '' [bool]
|
3133
|
+
# # Series: 'a' [bool]
|
3114
3134
|
# # [
|
3115
3135
|
# # false
|
3116
3136
|
# # true
|
@@ -3119,7 +3139,7 @@ module Polars
|
|
3119
3139
|
# # false
|
3120
3140
|
# # ]
|
3121
3141
|
def peak_min
|
3122
|
-
|
3142
|
+
super
|
3123
3143
|
end
|
3124
3144
|
|
3125
3145
|
# Count the number of unique values in this Series.
|
@@ -3203,13 +3223,13 @@ module Polars
|
|
3203
3223
|
# s.interpolate
|
3204
3224
|
# # =>
|
3205
3225
|
# # shape: (5,)
|
3206
|
-
# # Series: 'a' [
|
3226
|
+
# # Series: 'a' [f64]
|
3207
3227
|
# # [
|
3208
|
-
# # 1
|
3209
|
-
# # 2
|
3210
|
-
# # 3
|
3211
|
-
# # 4
|
3212
|
-
# # 5
|
3228
|
+
# # 1.0
|
3229
|
+
# # 2.0
|
3230
|
+
# # 3.0
|
3231
|
+
# # 4.0
|
3232
|
+
# # 5.0
|
3213
3233
|
# # ]
|
3214
3234
|
def interpolate(method: "linear")
|
3215
3235
|
super
|
@@ -3252,7 +3272,7 @@ module Polars
|
|
3252
3272
|
# s.rank
|
3253
3273
|
# # =>
|
3254
3274
|
# # shape: (5,)
|
3255
|
-
# # Series: 'a' [
|
3275
|
+
# # Series: 'a' [f64]
|
3256
3276
|
# # [
|
3257
3277
|
# # 3.0
|
3258
3278
|
# # 4.5
|
@@ -3581,10 +3601,17 @@ module Polars
|
|
3581
3601
|
# Create an object namespace of all list related methods.
|
3582
3602
|
#
|
3583
3603
|
# @return [ListNameSpace]
|
3584
|
-
def
|
3604
|
+
def list
|
3585
3605
|
ListNameSpace.new(self)
|
3586
3606
|
end
|
3587
3607
|
|
3608
|
+
# Create an object namespace of all array related methods.
|
3609
|
+
#
|
3610
|
+
# @return [ArrayNameSpace]
|
3611
|
+
def arr
|
3612
|
+
ArrayNameSpace.new(self)
|
3613
|
+
end
|
3614
|
+
|
3588
3615
|
# Create an object namespace of all binary related methods.
|
3589
3616
|
#
|
3590
3617
|
# @return [BinaryNameSpace]
|
@@ -3824,9 +3851,12 @@ module Polars
|
|
3824
3851
|
|
3825
3852
|
if (values.nil? || values.empty?) && dtype.nil?
|
3826
3853
|
dtype = dtype_if_empty || Float32
|
3854
|
+
elsif dtype == List
|
3855
|
+
ruby_dtype = ::Array
|
3827
3856
|
end
|
3828
3857
|
|
3829
3858
|
rb_temporal_types = [::Date, ::DateTime, ::Time]
|
3859
|
+
rb_temporal_types << ActiveSupport::TimeWithZone if defined?(ActiveSupport::TimeWithZone)
|
3830
3860
|
|
3831
3861
|
value = _get_first_non_none(values)
|
3832
3862
|
if !value.nil?
|
@@ -3835,9 +3865,20 @@ module Polars
|
|
3835
3865
|
end
|
3836
3866
|
end
|
3837
3867
|
|
3838
|
-
if !dtype.nil? && Utils.is_polars_dtype(dtype) && ruby_dtype.nil?
|
3868
|
+
if !dtype.nil? && ![List, Unknown].include?(dtype) && Utils.is_polars_dtype(dtype) && ruby_dtype.nil?
|
3869
|
+
if dtype == Array && !dtype.is_a?(Array) && value.is_a?(::Array)
|
3870
|
+
dtype = Array.new(value.size)
|
3871
|
+
end
|
3872
|
+
|
3839
3873
|
constructor = polars_type_to_constructor(dtype)
|
3840
3874
|
rbseries = constructor.call(name, values, strict)
|
3875
|
+
|
3876
|
+
base_type = dtype.is_a?(DataType) ? dtype.class : dtype
|
3877
|
+
if [Date, Datetime, Duration, Time, Categorical, Boolean].include?(base_type)
|
3878
|
+
if rbseries.dtype != dtype
|
3879
|
+
rbseries = rbseries.cast(dtype, true)
|
3880
|
+
end
|
3881
|
+
end
|
3841
3882
|
return rbseries
|
3842
3883
|
else
|
3843
3884
|
if ruby_dtype.nil?
|
@@ -3868,7 +3909,17 @@ module Polars
|
|
3868
3909
|
return s._s
|
3869
3910
|
elsif defined?(Numo::NArray) && value.is_a?(Numo::NArray) && value.shape.length == 1
|
3870
3911
|
raise Todo
|
3871
|
-
elsif ruby_dtype == Array
|
3912
|
+
elsif ruby_dtype == ::Array
|
3913
|
+
if dtype.is_a?(Object)
|
3914
|
+
return RbSeries.new_object(name, values, strict)
|
3915
|
+
end
|
3916
|
+
if dtype
|
3917
|
+
srs = sequence_from_anyvalue_or_object(name, values)
|
3918
|
+
if dtype != srs.dtype
|
3919
|
+
srs = srs.cast(dtype, strict: false)
|
3920
|
+
end
|
3921
|
+
return srs
|
3922
|
+
end
|
3872
3923
|
return sequence_from_anyvalue_or_object(name, values)
|
3873
3924
|
elsif ruby_dtype == Series
|
3874
3925
|
return RbSeries.new_series_list(name, values.map(&:_s), strict)
|
@@ -3910,9 +3961,17 @@ module Polars
|
|
3910
3961
|
UInt16 => RbSeries.method(:new_opt_u16),
|
3911
3962
|
UInt32 => RbSeries.method(:new_opt_u32),
|
3912
3963
|
UInt64 => RbSeries.method(:new_opt_u64),
|
3964
|
+
Decimal => RbSeries.method(:new_decimal),
|
3965
|
+
Date => RbSeries.method(:new_from_anyvalues),
|
3966
|
+
Datetime => RbSeries.method(:new_from_anyvalues),
|
3967
|
+
Duration => RbSeries.method(:new_from_anyvalues),
|
3968
|
+
Time => RbSeries.method(:new_from_anyvalues),
|
3913
3969
|
Boolean => RbSeries.method(:new_opt_bool),
|
3914
3970
|
Utf8 => RbSeries.method(:new_str),
|
3915
|
-
|
3971
|
+
Object => RbSeries.method(:new_object),
|
3972
|
+
Categorical => RbSeries.method(:new_str),
|
3973
|
+
Binary => RbSeries.method(:new_binary),
|
3974
|
+
Null => RbSeries.method(:new_null)
|
3916
3975
|
}
|
3917
3976
|
|
3918
3977
|
SYM_TYPE_TO_CONSTRUCTOR = {
|
@@ -3931,8 +3990,14 @@ module Polars
|
|
3931
3990
|
}
|
3932
3991
|
|
3933
3992
|
def polars_type_to_constructor(dtype)
|
3934
|
-
if dtype.is_a?(
|
3993
|
+
if dtype.is_a?(Array)
|
3994
|
+
lambda do |name, values, strict|
|
3995
|
+
RbSeries.new_array(dtype.width, dtype.inner, name, values, strict)
|
3996
|
+
end
|
3997
|
+
elsif dtype.is_a?(Class) && dtype < DataType
|
3935
3998
|
POLARS_TYPE_TO_CONSTRUCTOR.fetch(dtype)
|
3999
|
+
elsif dtype.is_a?(DataType)
|
4000
|
+
POLARS_TYPE_TO_CONSTRUCTOR.fetch(dtype.class)
|
3936
4001
|
else
|
3937
4002
|
SYM_TYPE_TO_CONSTRUCTOR.fetch(dtype.to_sym)
|
3938
4003
|
end
|
@@ -3944,7 +4009,9 @@ module Polars
|
|
3944
4009
|
Float => RbSeries.method(:new_opt_f64),
|
3945
4010
|
Integer => RbSeries.method(:new_opt_i64),
|
3946
4011
|
TrueClass => RbSeries.method(:new_opt_bool),
|
3947
|
-
FalseClass => RbSeries.method(:new_opt_bool)
|
4012
|
+
FalseClass => RbSeries.method(:new_opt_bool),
|
4013
|
+
BigDecimal => RbSeries.method(:new_decimal),
|
4014
|
+
NilClass => RbSeries.method(:new_null)
|
3948
4015
|
}
|
3949
4016
|
|
3950
4017
|
def rb_type_to_constructor(dtype)
|