rover-df 0.3.1 → 0.3.4
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 +22 -0
- data/README.md +60 -2
- data/lib/rover/data_frame.rb +11 -0
- data/lib/rover/vector.rb +80 -6
- data/lib/rover/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c77203874c704a18978e6a2483a1718c65fc96c47ef4dbe178a23bcd8ea6ce32
|
4
|
+
data.tar.gz: 24f04572c8197898387037c6800f487066ad4e56a35ef31df1877b6aef442fcd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
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]
|
517
|
+
df[:a].to!(:int32)
|
460
518
|
```
|
461
519
|
|
462
520
|
## History
|
data/lib/rover/data_frame.rb
CHANGED
@@ -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
|
-
|
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
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.
|
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-
|
11
|
+
date: 2022-07-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: numo-narray
|