rover-df 0.3.0 → 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
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