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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 843e2b3015dd7ad6a9d6a0bb604876a18f3a2f29c37359b50c86087bce64b257
4
- data.tar.gz: 4317f3694ee5fe5c4f0a1dd1dcd55aefa51575ad141779e619b80b4f65790057
3
+ metadata.gz: 1073cc7597ae35e09e20efb34bc8f22026fb597783a2746a69dbc46b6f6ce0cb
4
+ data.tar.gz: c22191045efeb2892ffc0393ca37e19b700dcaf05ee1761840875e4c4eda8087
5
5
  SHA512:
6
- metadata.gz: 72d33c6f391854f538271090663316e991baa23d2341d227f135802836891867b0bce0096fc6756a88c3cc121a32725d7c7705ad5fe9f9519587761bd86e3d87
7
- data.tar.gz: f487cd44ed31a8a79bf23fbf06dde3b9e5f8a77bb9ef3d56b7f36e7d5df5c3ea4ac3e386907a183afa8c973448d420a827dd3354cc35ea86d4e0625287b0182e
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
@@ -1,4 +1,4 @@
1
- Copyright (c) 2020-2022 Andrew Kane
1
+ Copyright (c) 2020-2025 Andrew Kane
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -97,8 +97,6 @@ Select a column
97
97
  df[:a]
98
98
  ```
99
99
 
100
- > Note that strings and symbols are different keys, just like hashes. Creating a data frame from Active Record, a CSV, or Parquet uses strings.
101
-
102
100
  Select multiple columns
103
101
 
104
102
  ```ruby
@@ -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
- else
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
- # TODO pass type
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
- # TODO pass type
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
- # TODO pass type
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
- # TODO return element instead of vector if no argument in 0.4.0
331
- def first(n = 1)
332
- if n >= size
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
- # TODO return element instead of vector if no argument in 0.4.0
340
- def last(n = 1)
341
- if n >= size
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
@@ -1,3 +1,3 @@
1
1
  module Rover
2
- VERSION = "0.4.1"
2
+ VERSION = "0.5.0"
3
3
  end
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.4.0 - need to test performance
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.1
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: 2024-10-08 00:00:00.000000000 Z
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.1'
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.5.16
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: []