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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1c750c49e4cb313565a3b52a273c4820ae406471a1007ddb8e83742f3f2640f1
4
- data.tar.gz: 2a7469abd672a87c9b4c874469baf07f42b22067ac2281c424eeb7b60841bbfe
3
+ metadata.gz: 0452f4e042fe699042ceebd158a63957b2c2aad0c6fb5652b5e1bb0c49b39f5f
4
+ data.tar.gz: 81eca93e309798632b1192b12d50a44828a07c82b84b1f58da9406968761960f
5
5
  SHA512:
6
- metadata.gz: 24e7874a67e498cadb8c2b4773f00c5cf53ab76e8231b7c762b8f403c2d4783809beb44ba3b37cb50b801032c3a3a9c140b18e1a10967eb331c517b5dd5251aa
7
- data.tar.gz: b62f4bfd7591e9c4869ab13e4e6efeba5c4e121c92470bc81d517ec85045a2fdc080a7a6ca3f61a15e7c98335543fcb11893d00d374cb5a3cf1294e12ed65130
6
+ metadata.gz: feb735bbf9fd17006b2a66416527cd280241082db0bb61b3c1a16317833baa96392b0d5fe70f15ceb8878247747ee966da5fdea607600620e6aa806103c5547c
7
+ data.tar.gz: f56e61bb2869beddf953eaf64e3759ab3987b6c53f918d6c52be6d8efcb22a16a9aba8bff727ab6d477e1981cabe76be70ce5e875a5de2db5298dd2f6654163c
@@ -1,3 +1,9 @@
1
+ ## 0.2.2 (2021-01-01)
2
+
3
+ - Added line, pie, area, and bar charts
4
+ - Added `|` and `^` for vectors
5
+ - Fixed typecasting with `map`
6
+
1
7
  ## 0.2.1 (2020-11-23)
2
8
 
3
9
  - Added `plot` method to data frames
@@ -1,4 +1,4 @@
1
- Copyright (c) 2020 Andrew Kane
1
+ Copyright (c) 2020-2021 Andrew Kane
2
2
 
3
3
  MIT License
4
4
 
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
- And
139
+ In
135
140
 
136
141
  ```ruby
137
- df[df[:a] > 100 & df[:b] == "one"]
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
- Or
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 | df[:b] == "one"]
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 [master]
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
@@ -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 "scatter"
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: "circle", tooltip: true)
398
+ .mark(type: type, tooltip: true, interpolate: "cardinal", point: {size: 60})
387
399
  .encoding(
388
- x: {field: x, type: "quantitative", scale: {zero: false}},
389
- y: {field: y, type: "quantitative", scale: {zero: false}},
390
- size: {value: 60}
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
- .config(axis: {title: nil, labelFontSize: 12})
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: {title: nil, labelFontSize: 12})
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
- def check_column(key)
471
- raise ArgumentError, "Missing column: #{key}" unless include?(key)
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)
@@ -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
- mapped = @data.map(&block)
165
- mapped = mapped.to_a if mapped.is_a?(Numo::RObject) # re-evaluate cast
166
- Vector.new(mapped)
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
@@ -1,3 +1,3 @@
1
1
  module Rover
2
- VERSION = "0.2.1"
2
+ VERSION = "0.2.2"
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.2.1
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: 2020-11-24 00:00:00.000000000 Z
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.7
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.7
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.1.4
61
+ rubygems_version: 3.2.3
146
62
  signing_key:
147
63
  specification_version: 4
148
64
  summary: Simple, powerful data frames for Ruby