rover-df 0.2.1 → 0.2.2
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 +6 -0
- data/LICENSE.txt +1 -1
- data/README.md +26 -5
- data/lib/rover/data_frame.rb +62 -10
- data/lib/rover/vector.rb +4 -4
- data/lib/rover/version.rb +1 -1
- metadata +5 -89
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0452f4e042fe699042ceebd158a63957b2c2aad0c6fb5652b5e1bb0c49b39f5f
|
4
|
+
data.tar.gz: 81eca93e309798632b1192b12d50a44828a07c82b84b1f58da9406968761960f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: feb735bbf9fd17006b2a66416527cd280241082db0bb61b3c1a16317833baa96392b0d5fe70f15ceb8878247747ee966da5fdea607600620e6aa806103c5547c
|
7
|
+
data.tar.gz: f56e61bb2869beddf953eaf64e3759ab3987b6c53f918d6c52be6d8efcb22a16a9aba8bff727ab6d477e1981cabe76be70ce5e875a5de2db5298dd2f6654163c
|
data/CHANGELOG.md
CHANGED
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -128,19 +128,34 @@ df[[1, 4, 5]]
|
|
128
128
|
Filter on a condition
|
129
129
|
|
130
130
|
```ruby
|
131
|
+
df[df[:a] == 100]
|
132
|
+
df[df[:a] != 100]
|
131
133
|
df[df[:a] > 100]
|
134
|
+
df[df[:a] >= 100]
|
135
|
+
df[df[:a] < 100]
|
136
|
+
df[df[:a] <= 100]
|
132
137
|
```
|
133
138
|
|
134
|
-
|
139
|
+
In
|
135
140
|
|
136
141
|
```ruby
|
137
|
-
df[df[:a]
|
142
|
+
df[df[:a].in?([1, 2, 3])]
|
143
|
+
df[df[:a].in?(1..3)]
|
144
|
+
df[df[:a].in?(["a", "b", "c"])]
|
138
145
|
```
|
139
146
|
|
140
|
-
|
147
|
+
Not in
|
148
|
+
|
149
|
+
```ruby
|
150
|
+
df[!df[:a].in?([1, 2, 3])]
|
151
|
+
```
|
152
|
+
|
153
|
+
And, or, and exclusive or
|
141
154
|
|
142
155
|
```ruby
|
143
|
-
df[df[:a] > 100
|
156
|
+
df[(df[:a] > 100) & (df[:b] == "one")] # and
|
157
|
+
df[(df[:a] > 100) | (df[:b] == "one")] # or
|
158
|
+
df[(df[:a] > 100) ^ (df[:b] == "one")] # xor
|
144
159
|
```
|
145
160
|
|
146
161
|
## Operations
|
@@ -200,7 +215,7 @@ Multiple groups
|
|
200
215
|
df.group([:a, :b]).count
|
201
216
|
```
|
202
217
|
|
203
|
-
## Visualization
|
218
|
+
## Visualization
|
204
219
|
|
205
220
|
Add [Vega](https://github.com/ankane/vega) to your application’s Gemfile:
|
206
221
|
|
@@ -214,6 +229,12 @@ And use:
|
|
214
229
|
df.plot(:a, :b)
|
215
230
|
```
|
216
231
|
|
232
|
+
Specify the chart type (`line`, `pie`, `column`, `bar`, `area`, or `scatter`)
|
233
|
+
|
234
|
+
```ruby
|
235
|
+
df.plot(:a, :b, type: "pie")
|
236
|
+
```
|
237
|
+
|
217
238
|
## Updating Data
|
218
239
|
|
219
240
|
Add a new column
|
data/lib/rover/data_frame.rb
CHANGED
@@ -72,6 +72,7 @@ module Rover
|
|
72
72
|
# multiple columns
|
73
73
|
df = DataFrame.new
|
74
74
|
where.each do |k|
|
75
|
+
check_column(k, true)
|
75
76
|
df[k] = @vectors[k]
|
76
77
|
end
|
77
78
|
df
|
@@ -374,22 +375,41 @@ module Rover
|
|
374
375
|
elsif types[x] == :object && self[y].numeric?
|
375
376
|
"column"
|
376
377
|
else
|
377
|
-
raise "Cannot determine type"
|
378
|
+
raise "Cannot determine type. Use the type option."
|
378
379
|
end
|
379
380
|
end
|
380
381
|
data = self[[x, y]]
|
381
382
|
|
382
383
|
case type
|
383
|
-
when "
|
384
|
+
when "line", "area"
|
385
|
+
x_type =
|
386
|
+
if data[x].numeric?
|
387
|
+
"quantitative"
|
388
|
+
elsif data[x].all? { |v| v.is_a?(Date) || v.is_a?(Time) }
|
389
|
+
"temporal"
|
390
|
+
else
|
391
|
+
"nominal"
|
392
|
+
end
|
393
|
+
|
394
|
+
scale = x_type == "temporal" ? {type: "utc"} : {}
|
395
|
+
|
384
396
|
Vega.lite
|
385
397
|
.data(data)
|
386
|
-
.mark(type: "
|
398
|
+
.mark(type: type, tooltip: true, interpolate: "cardinal", point: {size: 60})
|
387
399
|
.encoding(
|
388
|
-
x: {field: x, type:
|
389
|
-
y: {field: y, type: "quantitative"
|
390
|
-
|
400
|
+
x: {field: x, type: x_type, scale: scale},
|
401
|
+
y: {field: y, type: "quantitative"}
|
402
|
+
)
|
403
|
+
.config(axis: {labelFontSize: 12})
|
404
|
+
when "pie"
|
405
|
+
Vega.lite
|
406
|
+
.data(data)
|
407
|
+
.mark(type: "arc", tooltip: true)
|
408
|
+
.encoding(
|
409
|
+
color: {field: x, type: "nominal", sort: "none", axis: {title: nil}, legend: {labelFontSize: 12}},
|
410
|
+
theta: {field: y, type: "quantitative"}
|
391
411
|
)
|
392
|
-
.
|
412
|
+
.view(stroke: nil)
|
393
413
|
when "column"
|
394
414
|
Vega.lite
|
395
415
|
.data(data)
|
@@ -399,7 +419,27 @@ module Rover
|
|
399
419
|
x: {field: x, type: "nominal", sort: "none", axis: {labelAngle: 0}},
|
400
420
|
y: {field: y, type: "quantitative"}
|
401
421
|
)
|
402
|
-
.config(axis: {
|
422
|
+
.config(axis: {labelFontSize: 12})
|
423
|
+
when "bar"
|
424
|
+
Vega.lite
|
425
|
+
.data(data)
|
426
|
+
.mark(type: "bar", tooltip: true)
|
427
|
+
.encoding(
|
428
|
+
# TODO determine label angle
|
429
|
+
y: {field: x, type: "nominal", sort: "none", axis: {labelAngle: 0}},
|
430
|
+
x: {field: y, type: "quantitative"}
|
431
|
+
)
|
432
|
+
.config(axis: {labelFontSize: 12})
|
433
|
+
when "scatter"
|
434
|
+
Vega.lite
|
435
|
+
.data(data)
|
436
|
+
.mark(type: "circle", tooltip: true)
|
437
|
+
.encoding(
|
438
|
+
x: {field: x, type: "quantitative", scale: {zero: false}},
|
439
|
+
y: {field: y, type: "quantitative", scale: {zero: false}},
|
440
|
+
size: {value: 60}
|
441
|
+
)
|
442
|
+
.config(axis: {labelFontSize: 12})
|
403
443
|
else
|
404
444
|
raise ArgumentError, "Invalid type: #{type}"
|
405
445
|
end
|
@@ -467,8 +507,20 @@ module Rover
|
|
467
507
|
raise ArgumentError, "Missing keys: #{missing_keys.join(", ")}" if missing_keys.any?
|
468
508
|
end
|
469
509
|
|
470
|
-
|
471
|
-
|
510
|
+
# TODO in 0.3.0
|
511
|
+
# always use did_you_mean
|
512
|
+
def check_column(key, did_you_mean = false)
|
513
|
+
unless include?(key)
|
514
|
+
if did_you_mean
|
515
|
+
if RUBY_VERSION.to_f >= 2.6
|
516
|
+
raise KeyError.new("Missing column: #{key}", receiver: self, key: key)
|
517
|
+
else
|
518
|
+
raise KeyError.new("Missing column: #{key}")
|
519
|
+
end
|
520
|
+
else
|
521
|
+
raise ArgumentError, "Missing column: #{key}"
|
522
|
+
end
|
523
|
+
end
|
472
524
|
end
|
473
525
|
|
474
526
|
def to_vector(v, size: nil, type: nil)
|
data/lib/rover/vector.rb
CHANGED
@@ -91,7 +91,7 @@ module Rover
|
|
91
91
|
@data[k] = v
|
92
92
|
end
|
93
93
|
|
94
|
-
%w(+ - * / % ** &).each do |op|
|
94
|
+
%w(+ - * / % ** & | ^).each do |op|
|
95
95
|
define_method(op) do |other|
|
96
96
|
other = other.to_numo if other.is_a?(Vector)
|
97
97
|
# TODO better logic
|
@@ -161,9 +161,9 @@ module Rover
|
|
161
161
|
end
|
162
162
|
|
163
163
|
def map(&block)
|
164
|
-
|
165
|
-
|
166
|
-
Vector.new(
|
164
|
+
# convert to Ruby first to cast properly
|
165
|
+
# https://github.com/ruby-numo/numo-narray/issues/181
|
166
|
+
Vector.new(@data.to_a.map(&block))
|
167
167
|
end
|
168
168
|
|
169
169
|
def tally
|
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.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kane
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-01-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: numo-narray
|
@@ -16,98 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.9.1.
|
19
|
+
version: 0.9.1.9
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.9.1.
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: bundler
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ">="
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: rake
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ">="
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: minitest
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '5'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '5'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: activerecord
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '5'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - ">="
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '5'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: sqlite3
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - ">="
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '0'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - ">="
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '0'
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: iruby
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - ">="
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '0'
|
104
|
-
type: :development
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - ">="
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '0'
|
26
|
+
version: 0.9.1.9
|
111
27
|
description:
|
112
28
|
email: andrew@chartkick.com
|
113
29
|
executables: []
|
@@ -142,7 +58,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
142
58
|
- !ruby/object:Gem::Version
|
143
59
|
version: '0'
|
144
60
|
requirements: []
|
145
|
-
rubygems_version: 3.
|
61
|
+
rubygems_version: 3.2.3
|
146
62
|
signing_key:
|
147
63
|
specification_version: 4
|
148
64
|
summary: Simple, powerful data frames for Ruby
|