rover-df 0.3.1 → 0.3.4

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: e7acc7d0f290ab905594bac7ab1641572e717346f1d0546b3d8b783bcd1e5aca
4
- data.tar.gz: 2569b64c237ef836884be2077e8bb8107512d6946631fdb217fb276439412419
3
+ metadata.gz: c77203874c704a18978e6a2483a1718c65fc96c47ef4dbe178a23bcd8ea6ce32
4
+ data.tar.gz: 24f04572c8197898387037c6800f487066ad4e56a35ef31df1877b6aef442fcd
5
5
  SHA512:
6
- metadata.gz: dc46c174fced1c55a96fff28a5c69dfe5a508de527432dac3801cf65375093e290860112191444ceaa23023456452f9331406cdf360a7e689f0db27c289c157c
7
- data.tar.gz: 770174c6fb1cc8a52cd47ef77eae871cb5a346d752e9c1c13b8cb44fdc5d791b60fea3d5480bcaa4453b3bca1e83e32af57a57ff0c2a319308d7206d620fa75b
6
+ metadata.gz: 383e162cd6f62d1d409b869081f4ba97025dd297567a01d300672451a0883f90464f1396b348b6991d1b99a383d4d328f33f8c7cd560e810c96e0ed2f231b688
7
+ data.tar.gz: 45bb86dfc58172021e7fdef8677f74bbb32075bfe15022e6c0cfe2ddbae0be9b0d1909f5ff42a7792a7863d54bb53afeb309610d22ae0fc02f93f9026c2ab782
data/CHANGELOG.md CHANGED
@@ -1,3 +1,25 @@
1
+ ## 0.3.4 (2022-07-12)
2
+
3
+ - Added `cbrt`, `erf`, `erfc`, and `hypot` methods to vectors
4
+ - Added `frexp` and `ldexp` methods to vectors
5
+ - Added `base` argument to `log` method
6
+
7
+ ## 0.3.3 (2022-07-11)
8
+
9
+ - Added `ln`, `log`, `log10`, and `log2` methods to vectors
10
+ - Added `exp` and `exp2` methods to vectors
11
+ - Added `sin`, `cos`, `tan`, `asin`, `acos`, and `atan` methods to vectors
12
+ - Added `sinh`, `cosh`, `tanh`, `asinh`, `acosh`, and `atanh` methods to vectors
13
+ - Added `round`, `ceil`, and `floor` methods to vectors
14
+ - Added `empty?` method to vectors
15
+ - Added `rename` method to data frames
16
+
17
+ ## 0.3.2 (2022-07-10)
18
+
19
+ - Added `sqrt` method to vectors
20
+ - Improved numeric operations between scalars and vectors
21
+ - Improved performance of `tally`
22
+
1
23
  ## 0.3.1 (2022-05-18)
2
24
 
3
25
  - Added `to!` to vectors
data/README.md CHANGED
@@ -191,6 +191,62 @@ 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].cbrt
196
+ df[:a].abs
197
+ ```
198
+
199
+ Rounding
200
+
201
+ ```ruby
202
+ df[:a].round
203
+ df[:a].ceil
204
+ df[:a].floor
205
+ ```
206
+
207
+ Logarithm
208
+
209
+ ```ruby
210
+ df[:a].ln # or log
211
+ df[:a].log(5)
212
+ df[:a].log10
213
+ df[:a].log2
214
+ ```
215
+
216
+ Exponentiation
217
+
218
+ ```ruby
219
+ df[:a].exp
220
+ df[:a].exp2
221
+ ```
222
+
223
+ Trigonometric functions
224
+
225
+ ```ruby
226
+ df[:a].sin
227
+ df[:a].cos
228
+ df[:a].tan
229
+ df[:a].asin
230
+ df[:a].acos
231
+ df[:a].atan
232
+ ```
233
+
234
+ Hyperbolic functions
235
+
236
+ ```ruby
237
+ df[:a].sinh
238
+ df[:a].cosh
239
+ df[:a].tanh
240
+ df[:a].asinh
241
+ df[:a].acosh
242
+ df[:a].atanh
243
+ ```
244
+
245
+ Error function
246
+
247
+ ```ruby
248
+ df[:a].erf
249
+ df[:a].erfc
194
250
  ```
195
251
 
196
252
  Summary statistics
@@ -323,9 +379,11 @@ df.delete(:a)
323
379
  df.except!(:a, :b)
324
380
  ```
325
381
 
326
- Rename a column
382
+ Rename columns
327
383
 
328
384
  ```ruby
385
+ df.rename(a: :new_a, b: :new_b)
386
+ # or
329
387
  df[:new_a] = df.delete(:a)
330
388
  ```
331
389
 
@@ -456,7 +514,7 @@ df[:a].type
456
514
  Change the type of a column
457
515
 
458
516
  ```ruby
459
- df[:a] = df[:a].to(:int32)
517
+ df[:a].to!(:int32)
460
518
  ```
461
519
 
462
520
  ## 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
@@ -21,6 +21,8 @@ module Rover
21
21
  uint: Numo::UInt64
22
22
  }
23
23
 
24
+ NOT_SET = Object.new
25
+
24
26
  def initialize(data, type: nil)
25
27
  @data = cast_data(data, type: type)
26
28
  raise ArgumentError, "Bad size: #{@data.shape}" unless @data.ndim == 1
@@ -87,6 +89,7 @@ module Rover
87
89
  if v.is_a?(Vector)
88
90
  Vector.new(v.to_numo.mask(@data))
89
91
  else
92
+ # TODO return vector unless v is an integer in 0.4.0
90
93
  @data[v]
91
94
  end
92
95
  end
@@ -184,13 +187,9 @@ module Rover
184
187
  Vector.new(@data.to_a.reject(&block))
185
188
  end
186
189
 
190
+ # use Ruby tally for performance
187
191
  def tally
188
- result = Hash.new(0)
189
- @data.each do |v|
190
- result[v] += 1
191
- end
192
- result.default = nil
193
- result
192
+ @data.to_a.tally
194
193
  end
195
194
 
196
195
  def sort
@@ -201,6 +200,67 @@ module Rover
201
200
  Vector.new(@data.abs)
202
201
  end
203
202
 
203
+ def round(ndigits = 0)
204
+ if ndigits == 0
205
+ Vector.new(@data.round)
206
+ else
207
+ # TODO pass type
208
+ Vector.new(@data.to_a.map { |v| v.round(ndigits) })
209
+ end
210
+ end
211
+
212
+ def ceil(ndigits = 0)
213
+ if ndigits == 0
214
+ Vector.new(@data.ceil)
215
+ else
216
+ # TODO pass type
217
+ Vector.new(@data.to_a.map { |v| v.ceil(ndigits) })
218
+ end
219
+ end
220
+
221
+ def floor(ndigits = 0)
222
+ if ndigits == 0
223
+ Vector.new(@data.floor)
224
+ else
225
+ # TODO pass type
226
+ Vector.new(@data.to_a.map { |v| v.floor(ndigits) })
227
+ end
228
+ end
229
+
230
+ [:sqrt, :cbrt, :sin, :cos, :tan, :asin, :acos, :atan, :sinh, :cosh, :tanh, :asinh, :acosh, :atanh, :log2, :log10, :exp, :exp2, :erf, :erfc].each do |m|
231
+ define_method(m) do
232
+ Vector.new(Numo::NMath.send(m, @data))
233
+ end
234
+ end
235
+
236
+ def log(base = NOT_SET)
237
+ if base == NOT_SET
238
+ Vector.new(Numo::NMath.log(@data))
239
+ else
240
+ type = self.type == :float32 ? :float32 : :float64
241
+ Vector.new(@data.to_a.map { |v| Math.log(v, base) }, type: type)
242
+ end
243
+ end
244
+
245
+ def ln
246
+ log
247
+ end
248
+
249
+ def hypot(y)
250
+ y = y.to_numo if y.is_a?(Rover::Vector)
251
+ Vector.new(Numo::NMath.hypot(@data, y))
252
+ end
253
+
254
+ def frexp
255
+ fraction, exponent = Numo::NMath.frexp(@data)
256
+ [Vector.new(fraction), Vector.new(exponent)]
257
+ end
258
+
259
+ def ldexp(exponent)
260
+ exponent = exponent.to_numo if exponent.is_a?(Rover::Vector)
261
+ Vector.new(Numo::NMath.ldexp(@data, exponent))
262
+ end
263
+
204
264
  def each(&block)
205
265
  @data.each(&block)
206
266
  end
@@ -255,10 +315,15 @@ module Rover
255
315
  to_a.any?(&block)
256
316
  end
257
317
 
318
+ def empty?
319
+ size == 0
320
+ end
321
+
258
322
  def zip(other, &block)
259
323
  to_a.zip(other.to_a, &block)
260
324
  end
261
325
 
326
+ # TODO return element instead of vector if no argument in 0.4.0
262
327
  def first(n = 1)
263
328
  if n >= size
264
329
  Vector.new(@data)
@@ -267,6 +332,7 @@ module Rover
267
332
  end
268
333
  end
269
334
 
335
+ # TODO return element instead of vector if no argument in 0.4.0
270
336
  def last(n = 1)
271
337
  if n >= size
272
338
  Vector.new(@data)
@@ -350,6 +416,14 @@ module Rover
350
416
  super
351
417
  end
352
418
 
419
+ def coerce(other)
420
+ if other.is_a?(Numeric)
421
+ [Vector.new([other]), self]
422
+ else
423
+ raise TypeError, "#{self.class} can't be coerced into #{other.class}"
424
+ end
425
+ end
426
+
353
427
  def cast_data(data, type: nil)
354
428
  numo_type = numo_type(type) if type
355
429
 
data/lib/rover/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Rover
2
- VERSION = "0.3.1"
2
+ VERSION = "0.3.4"
3
3
  end
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.1
4
+ version: 0.3.4
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-05-18 00:00:00.000000000 Z
11
+ date: 2022-07-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: numo-narray