rover-df 0.4.1 → 0.5.0
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 +9 -0
- data/LICENSE.txt +1 -1
- data/README.md +0 -2
- data/lib/rover/data_frame.rb +20 -11
- data/lib/rover/vector.rb +15 -14
- data/lib/rover/version.rb +1 -1
- data/lib/rover.rb +2 -1
- metadata +4 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1073cc7597ae35e09e20efb34bc8f22026fb597783a2746a69dbc46b6f6ce0cb
|
4
|
+
data.tar.gz: c22191045efeb2892ffc0393ca37e19b700dcaf05ee1761840875e4c4eda8087
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 23c85ed31b9c2f481860d1304fb229094afbe66eef81075e0caa46d8e42c4052081b14cef1120614b04e2a45999a790dc73682b6aa60bf525ac9dda0b2d897ea
|
7
|
+
data.tar.gz: 62ee77f8a3344751828711f0d0e73c3f2ae2ac9525d56c7bfbce114a715d0b1bf2f4e75ee475850e3dab6d606078606e19dfed3627bdb4b6a877928795c82d85
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
## 0.5.0 (2025-06-07)
|
2
|
+
|
3
|
+
- Strings and symbols are no longer treated as different keys
|
4
|
+
- Changed methods that return column names to always use strings
|
5
|
+
- Changed `[]` method to return vector instead of Numo array with range or array argument
|
6
|
+
- Changed `first` and `last` methods to return element instead of vector when no arguments
|
7
|
+
- Changed `round`, `ceil`, and `floor` methods to always return same type as original vector
|
8
|
+
- Dropped support for Ruby < 3.2
|
9
|
+
|
1
10
|
## 0.4.1 (2024-10-07)
|
2
11
|
|
3
12
|
- Fixed connection leasing for Active Record 7.2+
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
data/lib/rover/data_frame.rb
CHANGED
@@ -4,7 +4,7 @@ module Rover
|
|
4
4
|
data, options = process_args(args)
|
5
5
|
|
6
6
|
@vectors = {}
|
7
|
-
types = options[:types] || {}
|
7
|
+
types = (options[:types] || {}).transform_keys(&:to_s)
|
8
8
|
|
9
9
|
if data.is_a?(DataFrame)
|
10
10
|
data.vectors.each do |k, v|
|
@@ -14,7 +14,7 @@ module Rover
|
|
14
14
|
data.to_h.each do |k, v|
|
15
15
|
@vectors[k] =
|
16
16
|
if v.respond_to?(:to_a)
|
17
|
-
Vector.new(v, type: types[k])
|
17
|
+
Vector.new(v, type: types[k.to_s])
|
18
18
|
else
|
19
19
|
v
|
20
20
|
end
|
@@ -23,7 +23,7 @@ module Rover
|
|
23
23
|
# handle scalars
|
24
24
|
size = @vectors.values.find { |v| v.is_a?(Vector) }&.size || 1
|
25
25
|
@vectors.each_key do |k|
|
26
|
-
@vectors[k] = to_vector(@vectors[k], size: size, type: types[k])
|
26
|
+
@vectors[k] = to_vector(@vectors[k], size: size, type: types[k.to_s])
|
27
27
|
end
|
28
28
|
elsif data.is_a?(Array)
|
29
29
|
vectors = {}
|
@@ -38,12 +38,12 @@ module Rover
|
|
38
38
|
end
|
39
39
|
end
|
40
40
|
vectors.each do |k, v|
|
41
|
-
@vectors[k] = to_vector(v, type: types[k])
|
41
|
+
@vectors[k] = to_vector(v, type: types[k.to_s])
|
42
42
|
end
|
43
43
|
elsif defined?(ActiveRecord) && (data.is_a?(ActiveRecord::Relation) || (data.is_a?(Class) && data < ActiveRecord::Base) || data.is_a?(ActiveRecord::Result))
|
44
44
|
result = data.is_a?(ActiveRecord::Result) ? data : data.connection_pool.with_connection { |c| c.select_all(data.all.to_sql) }
|
45
45
|
result.columns.each_with_index do |k, i|
|
46
|
-
@vectors[k] = to_vector(result.rows.map { |r| r[i] }, type: types[k])
|
46
|
+
@vectors[k] = to_vector(result.rows.map { |r| r[i] }, type: types[k.to_s])
|
47
47
|
end
|
48
48
|
else
|
49
49
|
raise ArgumentError, "Cannot cast to data frame: #{data.class.name}"
|
@@ -54,6 +54,9 @@ module Rover
|
|
54
54
|
check_key(k)
|
55
55
|
end
|
56
56
|
|
57
|
+
# TODO check for duplicate keys
|
58
|
+
@vectors.transform_keys!(&:to_s)
|
59
|
+
|
57
60
|
# check sizes
|
58
61
|
sizes = @vectors.values.map(&:size).uniq
|
59
62
|
if sizes.size > 1
|
@@ -73,12 +76,12 @@ module Rover
|
|
73
76
|
df = DataFrame.new
|
74
77
|
where.each do |k|
|
75
78
|
check_column(k)
|
76
|
-
df[k] = @vectors[k]
|
79
|
+
df[k] = @vectors[k.to_s]
|
77
80
|
end
|
78
81
|
df
|
79
82
|
else
|
80
83
|
# single column
|
81
|
-
@vectors[where]
|
84
|
+
@vectors[where.to_s]
|
82
85
|
end
|
83
86
|
end
|
84
87
|
|
@@ -103,7 +106,7 @@ module Rover
|
|
103
106
|
check_key(k)
|
104
107
|
v = to_vector(v, size: size)
|
105
108
|
raise ArgumentError, "Size mismatch (given #{v.size}, expected #{size})" if @vectors.any? && v.size != size
|
106
|
-
@vectors[k] = v
|
109
|
+
@vectors[k.to_s] = v
|
107
110
|
end
|
108
111
|
|
109
112
|
def size
|
@@ -140,6 +143,7 @@ module Rover
|
|
140
143
|
mapping.each_key do |k|
|
141
144
|
check_column(k)
|
142
145
|
end
|
146
|
+
mapping = mapping.to_h { |k, v| [k.to_s, v.to_s] }
|
143
147
|
# use transform_keys! to preserve order
|
144
148
|
@vectors.transform_keys! do |k|
|
145
149
|
mapping[k] || k
|
@@ -148,7 +152,7 @@ module Rover
|
|
148
152
|
end
|
149
153
|
|
150
154
|
def delete(key)
|
151
|
-
@vectors.delete(key)
|
155
|
+
@vectors.delete(key.to_s)
|
152
156
|
end
|
153
157
|
|
154
158
|
def except(*keys)
|
@@ -163,7 +167,7 @@ module Rover
|
|
163
167
|
end
|
164
168
|
|
165
169
|
def include?(key)
|
166
|
-
@vectors.include?(key)
|
170
|
+
@vectors.include?(key.to_s)
|
167
171
|
end
|
168
172
|
|
169
173
|
def head(n = 5)
|
@@ -237,6 +241,7 @@ module Rover
|
|
237
241
|
|
238
242
|
def to_csv
|
239
243
|
require "csv"
|
244
|
+
|
240
245
|
CSV.generate do |csv|
|
241
246
|
csv << keys
|
242
247
|
numo = vectors.values.map(&:to_numo)
|
@@ -287,6 +292,7 @@ module Rover
|
|
287
292
|
# for IRuby
|
288
293
|
def to_html
|
289
294
|
require "iruby"
|
295
|
+
|
290
296
|
if size > 7
|
291
297
|
# pass 8 rows so maxrows is applied
|
292
298
|
IRuby::HTML.table((self[0..4] + self[-4..-1]).to_h, maxrows: 7)
|
@@ -347,7 +353,7 @@ module Rover
|
|
347
353
|
end
|
348
354
|
|
349
355
|
def group(*columns)
|
350
|
-
Group.new(self, columns.flatten)
|
356
|
+
Group.new(self, columns.flatten.map(&:to_s))
|
351
357
|
end
|
352
358
|
|
353
359
|
[:max, :min, :median, :mean, :percentile, :sum, :std, :var].each do |name|
|
@@ -549,6 +555,9 @@ module Rover
|
|
549
555
|
check_join_keys(self, self_on)
|
550
556
|
check_join_keys(other, other_on)
|
551
557
|
|
558
|
+
self_on.map!(&:to_s)
|
559
|
+
other_on.map!(&:to_s)
|
560
|
+
|
552
561
|
indexed = other.to_a.group_by { |r| r.values_at(*other_on) }
|
553
562
|
indexed.default = []
|
554
563
|
|
data/lib/rover/vector.rb
CHANGED
@@ -88,9 +88,10 @@ module Rover
|
|
88
88
|
def [](v)
|
89
89
|
if v.is_a?(Vector)
|
90
90
|
Vector.new(v.to_numo.mask(@data))
|
91
|
-
|
92
|
-
# TODO return vector unless v is an integer in 0.4.0
|
91
|
+
elsif v.is_a?(Numeric)
|
93
92
|
@data[v]
|
93
|
+
else
|
94
|
+
Vector.new(@data[v])
|
94
95
|
end
|
95
96
|
end
|
96
97
|
|
@@ -204,8 +205,7 @@ module Rover
|
|
204
205
|
if ndigits == 0
|
205
206
|
Vector.new(@data.round)
|
206
207
|
else
|
207
|
-
|
208
|
-
Vector.new(@data.to_a.map { |v| v.round(ndigits) })
|
208
|
+
Vector.new(@data.map { |v| v.round(ndigits) })
|
209
209
|
end
|
210
210
|
end
|
211
211
|
|
@@ -213,8 +213,7 @@ module Rover
|
|
213
213
|
if ndigits == 0
|
214
214
|
Vector.new(@data.ceil)
|
215
215
|
else
|
216
|
-
|
217
|
-
Vector.new(@data.to_a.map { |v| v.ceil(ndigits) })
|
216
|
+
Vector.new(@data.map { |v| v.ceil(ndigits) })
|
218
217
|
end
|
219
218
|
end
|
220
219
|
|
@@ -222,8 +221,7 @@ module Rover
|
|
222
221
|
if ndigits == 0
|
223
222
|
Vector.new(@data.floor)
|
224
223
|
else
|
225
|
-
|
226
|
-
Vector.new(@data.to_a.map { |v| v.floor(ndigits) })
|
224
|
+
Vector.new(@data.map { |v| v.floor(ndigits) })
|
227
225
|
end
|
228
226
|
end
|
229
227
|
|
@@ -327,18 +325,20 @@ module Rover
|
|
327
325
|
to_a.zip(other.to_a, &block)
|
328
326
|
end
|
329
327
|
|
330
|
-
|
331
|
-
|
332
|
-
|
328
|
+
def first(n = NOT_SET)
|
329
|
+
if n == NOT_SET
|
330
|
+
@data[0]
|
331
|
+
elsif n >= size
|
333
332
|
Vector.new(@data)
|
334
333
|
else
|
335
334
|
Vector.new(@data[0...n])
|
336
335
|
end
|
337
336
|
end
|
338
337
|
|
339
|
-
|
340
|
-
|
341
|
-
|
338
|
+
def last(n = NOT_SET)
|
339
|
+
if n == NOT_SET
|
340
|
+
@data[-1]
|
341
|
+
elsif n >= size
|
342
342
|
Vector.new(@data)
|
343
343
|
else
|
344
344
|
Vector.new(@data[-n..-1])
|
@@ -398,6 +398,7 @@ module Rover
|
|
398
398
|
# for IRuby
|
399
399
|
def to_html
|
400
400
|
require "iruby"
|
401
|
+
|
401
402
|
if size > 7
|
402
403
|
# pass 8 rows so maxrows is applied
|
403
404
|
IRuby::HTML.table(first(4).to_a + last(4).to_a, maxrows: 7)
|
data/lib/rover/version.rb
CHANGED
data/lib/rover.rb
CHANGED
@@ -40,7 +40,7 @@ module Rover
|
|
40
40
|
|
41
41
|
raise ArgumentError, "Must specify headers" if headers == false
|
42
42
|
|
43
|
-
# TODO use date converter in 0.
|
43
|
+
# TODO use date converter in 0.5.0 - need to test performance
|
44
44
|
table = yield({converters: :numeric}.merge(csv_options))
|
45
45
|
|
46
46
|
headers = nil if headers == true
|
@@ -112,6 +112,7 @@ module Rover
|
|
112
112
|
table = yield
|
113
113
|
data = {}
|
114
114
|
types ||= {}
|
115
|
+
types = types.transform_keys(&:to_s)
|
115
116
|
table.each_column do |column|
|
116
117
|
k = column.field.name
|
117
118
|
if types[k]
|
metadata
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rover-df
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kane
|
8
|
-
autorequire:
|
9
8
|
bindir: bin
|
10
9
|
cert_chain: []
|
11
|
-
date:
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
12
11
|
dependencies:
|
13
12
|
- !ruby/object:Gem::Dependency
|
14
13
|
name: numo-narray
|
@@ -24,7 +23,6 @@ dependencies:
|
|
24
23
|
- - ">="
|
25
24
|
- !ruby/object:Gem::Version
|
26
25
|
version: 0.9.1.9
|
27
|
-
description:
|
28
26
|
email: andrew@ankane.org
|
29
27
|
executables: []
|
30
28
|
extensions: []
|
@@ -43,7 +41,6 @@ homepage: https://github.com/ankane/rover
|
|
43
41
|
licenses:
|
44
42
|
- MIT
|
45
43
|
metadata: {}
|
46
|
-
post_install_message:
|
47
44
|
rdoc_options: []
|
48
45
|
require_paths:
|
49
46
|
- lib
|
@@ -51,15 +48,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
51
48
|
requirements:
|
52
49
|
- - ">="
|
53
50
|
- !ruby/object:Gem::Version
|
54
|
-
version: '3.
|
51
|
+
version: '3.2'
|
55
52
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
56
53
|
requirements:
|
57
54
|
- - ">="
|
58
55
|
- !ruby/object:Gem::Version
|
59
56
|
version: '0'
|
60
57
|
requirements: []
|
61
|
-
rubygems_version: 3.
|
62
|
-
signing_key:
|
58
|
+
rubygems_version: 3.6.7
|
63
59
|
specification_version: 4
|
64
60
|
summary: Simple, powerful data frames for Ruby
|
65
61
|
test_files: []
|