rover-df 0.2.1 → 0.2.2

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: 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