rover-df 0.3.0 → 0.3.3

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: 171a06a05afa4ec4bb09efe7fef53b49220a3d4fa5352621112e29f2b70812b9
4
- data.tar.gz: 435d8f3d4781f1960236f3c2b7f9fa2c4e38dfc987b53cb9fbe6351a9e8db4e9
3
+ metadata.gz: 7a1b47800b1d7e9b84e7a1976f2cfbc551e9dee6a9a0ec39b3759b6564e4e278
4
+ data.tar.gz: a41f8ed9bdeabc01a0fc83bdb98487a375bfa6f6d1d2fd4041db7cc38f803482
5
5
  SHA512:
6
- metadata.gz: 9e5baa8cb051f7c7f06bbe0025ac4d923947b34768461a814e533aa78ec5d2d391a12edc6a9a64abc2fa9b1147255211ff26e8094cfaef67c9d70e393e57bcc0
7
- data.tar.gz: 55f3438d438326c324c612a92b39a54698123889aeb28bafd93a196f2659208b4b72a1ac02efd407166fc56c8c9f3abff9472804ddfb231220b6adf41ff38df1
6
+ metadata.gz: 7b2e10547e204ff592757373bc93c7d8dfd004802a87e10ca886c47771c29aa717fe19ef11e20c9b830765c64c6ef65db5d0bfead0d1b064c680938a1cca8184
7
+ data.tar.gz: ce25fac82709a912e78c871f356e681ad8f85a599db1eeea58d5654ddf3928554d70a7434e92beb4352c81b69307dce77062baedd8669f2584bda54f1e40ee42
data/CHANGELOG.md CHANGED
@@ -1,3 +1,25 @@
1
+ ## 0.3.3 (2022-07-11)
2
+
3
+ - Added `ln`, `log`, `log10`, and `log2` methods to vectors
4
+ - Added `exp` and `exp2` methods to vectors
5
+ - Added `sin`, `cos`, `tan`, `asin`, `acos`, and `atan` methods to vectors
6
+ - Added `sinh`, `cosh`, `tanh`, `asinh`, `acosh`, and `atanh` methods to vectors
7
+ - Added `round`, `ceil`, and `floor` methods to vectors
8
+ - Added `empty?` method to vectors
9
+ - Added `rename` method to data frames
10
+
11
+ ## 0.3.2 (2022-07-10)
12
+
13
+ - Added `sqrt` method to vectors
14
+ - Improved numeric operations between scalars and vectors
15
+ - Improved performance of `tally`
16
+
17
+ ## 0.3.1 (2022-05-18)
18
+
19
+ - Added `to!` to vectors
20
+ - Fixed error with `nil` and `:float64` type
21
+ - Fixed `:header_converters` option with `read_csv` and `parse_csv`
22
+
1
23
  ## 0.3.0 (2022-04-03)
2
24
 
3
25
  - Added `deep_dup` method to data frames
data/README.md CHANGED
@@ -191,6 +191,53 @@ df[:a] * 5
191
191
  df[:a] / 5
192
192
  df[:a] % 5
193
193
  df[:a] ** 2
194
+ df[:a].sqrt
195
+ df[:a].abs
196
+ ```
197
+
198
+ Rounding
199
+
200
+ ```ruby
201
+ df[:a].round
202
+ df[:a].ceil
203
+ df[:a].floor
204
+ ```
205
+
206
+ Logarithm
207
+
208
+ ```ruby
209
+ df[:a].ln # or log
210
+ df[:a].log10
211
+ df[:a].log2
212
+ ```
213
+
214
+ Exponentiation
215
+
216
+ ```ruby
217
+ df[:a].exp
218
+ df[:a].exp2
219
+ ```
220
+
221
+ Trigonometric functions
222
+
223
+ ```ruby
224
+ df[:a].sin
225
+ df[:a].cos
226
+ df[:a].tan
227
+ df[:a].asin
228
+ df[:a].acos
229
+ df[:a].atan
230
+ ```
231
+
232
+ Hyperbolic functions
233
+
234
+ ```ruby
235
+ df[:a].sinh
236
+ df[:a].cosh
237
+ df[:a].tanh
238
+ df[:a].asinh
239
+ df[:a].acosh
240
+ df[:a].atanh
194
241
  ```
195
242
 
196
243
  Summary statistics
@@ -323,9 +370,11 @@ df.delete(:a)
323
370
  df.except!(:a, :b)
324
371
  ```
325
372
 
326
- Rename a column
373
+ Rename columns
327
374
 
328
375
  ```ruby
376
+ df.rename(a: :new_a, b: :new_b)
377
+ # or
329
378
  df[:new_a] = df.delete(:a)
330
379
  ```
331
380
 
@@ -456,7 +505,7 @@ df[:a].type
456
505
  Change the type of a column
457
506
 
458
507
  ```ruby
459
- df[:a] = df[:a].to(:int32)
508
+ df[:a].to!(:int32)
460
509
  ```
461
510
 
462
511
  ## History
@@ -136,6 +136,17 @@ module Rover
136
136
  alias_method :names, :keys
137
137
  alias_method :vector_names, :keys
138
138
 
139
+ def rename(mapping)
140
+ mapping.each_key do |k|
141
+ check_column(k)
142
+ end
143
+ # use transform_keys! to preserve order
144
+ @vectors.transform_keys! do |k|
145
+ mapping[k] || k
146
+ end
147
+ self
148
+ end
149
+
139
150
  def delete(key)
140
151
  @vectors.delete(key)
141
152
  end
data/lib/rover/vector.rb CHANGED
@@ -31,7 +31,12 @@ module Rover
31
31
  end
32
32
 
33
33
  def to(type)
34
- Vector.new(self, type: type)
34
+ dup.to!(type)
35
+ end
36
+
37
+ def to!(type)
38
+ @data = cast_data(@data, type: type)
39
+ self
35
40
  end
36
41
 
37
42
  def to_numo
@@ -179,13 +184,9 @@ module Rover
179
184
  Vector.new(@data.to_a.reject(&block))
180
185
  end
181
186
 
187
+ # use Ruby tally for performance
182
188
  def tally
183
- result = Hash.new(0)
184
- @data.each do |v|
185
- result[v] += 1
186
- end
187
- result.default = nil
188
- result
189
+ @data.to_a.tally
189
190
  end
190
191
 
191
192
  def sort
@@ -196,6 +197,43 @@ module Rover
196
197
  Vector.new(@data.abs)
197
198
  end
198
199
 
200
+ def round(ndigits = 0)
201
+ if ndigits == 0
202
+ Vector.new(@data.round)
203
+ else
204
+ map { |v| v.round(ndigits) }
205
+ end
206
+ end
207
+
208
+ def ceil(ndigits = 0)
209
+ if ndigits == 0
210
+ Vector.new(@data.ceil)
211
+ else
212
+ map { |v| v.ceil(ndigits) }
213
+ end
214
+ end
215
+
216
+ def floor(ndigits = 0)
217
+ if ndigits == 0
218
+ Vector.new(@data.floor)
219
+ else
220
+ map { |v| v.floor(ndigits) }
221
+ end
222
+ end
223
+
224
+ [:sqrt, :sin, :cos, :tan, :asin, :acos, :atan, :sinh, :cosh, :tanh, :asinh, :acosh, :atanh, :log, :log2, :log10, :exp, :exp2].each do |m|
225
+ define_method(m) do
226
+ data =
227
+ if @data.is_a?(Numo::SFloat)
228
+ Numo::SFloat::Math.send(m, @data)
229
+ else
230
+ Numo::DFloat::Math.send(m, @data)
231
+ end
232
+ Vector.new(data)
233
+ end
234
+ end
235
+ alias_method :ln, :log
236
+
199
237
  def each(&block)
200
238
  @data.each(&block)
201
239
  end
@@ -250,10 +288,15 @@ module Rover
250
288
  to_a.any?(&block)
251
289
  end
252
290
 
291
+ def empty?
292
+ size == 0
293
+ end
294
+
253
295
  def zip(other, &block)
254
296
  to_a.zip(other.to_a, &block)
255
297
  end
256
298
 
299
+ # TODO return element instead of vector if no argument in 0.4.0
257
300
  def first(n = 1)
258
301
  if n >= size
259
302
  Vector.new(@data)
@@ -262,6 +305,7 @@ module Rover
262
305
  end
263
306
  end
264
307
 
308
+ # TODO return element instead of vector if no argument in 0.4.0
265
309
  def last(n = 1)
266
310
  if n >= size
267
311
  Vector.new(@data)
@@ -345,6 +389,14 @@ module Rover
345
389
  super
346
390
  end
347
391
 
392
+ def coerce(other)
393
+ if other.is_a?(Numeric)
394
+ [Vector.new([other]), self]
395
+ else
396
+ raise TypeError, "#{self.class} can't be coerced into #{other.class}"
397
+ end
398
+ end
399
+
348
400
  def cast_data(data, type: nil)
349
401
  numo_type = numo_type(type) if type
350
402
 
@@ -371,7 +423,7 @@ module Rover
371
423
  data = data.to_a
372
424
 
373
425
  if type
374
- data = data.map { |v| v || Float::NAN } if [:float, :float32].include?(type)
426
+ data = data.map { |v| v || Float::NAN } if [:float, :float32, :float64].include?(type)
375
427
  data = numo_type.cast(data)
376
428
  else
377
429
  data =
data/lib/rover/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Rover
2
- VERSION = "0.3.0"
2
+ VERSION = "0.3.3"
3
3
  end
data/lib/rover.rb CHANGED
@@ -55,6 +55,12 @@ module Rover
55
55
  table_headers << nil
56
56
  end
57
57
  end
58
+ # TODO handle date converters
59
+ table_headers = table_headers.map! { |v| v.nil? ? nil : v.to_s }
60
+
61
+ if csv_options[:header_converters]
62
+ table_headers = CSV.parse(CSV.generate_line(table_headers), headers: true, header_converters: csv_options[:header_converters]).headers
63
+ end
58
64
 
59
65
  data = {}
60
66
  keys = table_headers.map { |k| [k, true] }.to_h
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rover-df
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-04-04 00:00:00.000000000 Z
11
+ date: 2022-07-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: numo-narray