datamix 0.0.2 → 0.0.3
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/README.md +50 -6
- data/lib/datamix/refinements/array.rb +20 -28
- data/lib/datamix/refinements/csv_table.rb +3 -1
- data/lib/datamix/version.rb +1 -1
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2e25311621834c0792028b34973e716c1dc0bce2
|
4
|
+
data.tar.gz: df08942707700a403c16e55bf0cd39659520ec7c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 643e11e9a83a4c498ca2c042b59780eed0e95a26f07cb6f2624e294b78812c6abeb6669bc897cccb21b65119d906f751b3f671e4696b7d90b802df9a0399d933
|
7
|
+
data.tar.gz: 1c9dc5162696b3b6de6110bee2d0cf183ceec3f913186bc7887554a6d716255212b4761514da3762866b1a668d41c0f55ac2d1a98183d5d86265d36948a82e58
|
data/README.md
CHANGED
@@ -8,8 +8,8 @@ DataMix - DSL for manipulating tabular data
|
|
8
8
|
|
9
9
|
---
|
10
10
|
|
11
|
-
This library refines Ruby's [`CSV::Table`][1] and `Array`
|
12
|
-
for manipulating tabular data.
|
11
|
+
This library refines Ruby's [`CSV::Table`][1] and `Array` objects to provide
|
12
|
+
a DSL for manipulating tabular data.
|
13
13
|
|
14
14
|
---
|
15
15
|
|
@@ -29,17 +29,61 @@ gem 'datamix'
|
|
29
29
|
|
30
30
|
|
31
31
|
|
32
|
-
Usage
|
32
|
+
Example Usage
|
33
33
|
--------------------------------------------------
|
34
34
|
|
35
|
-
Require the library and enable the refinements with `using DataMix`:
|
36
|
-
|
37
35
|
```ruby
|
38
36
|
require 'datamix'
|
39
37
|
using DataMix
|
38
|
+
|
39
|
+
# Load data (this is a shortcut to load a CSV::Table object)
|
40
|
+
sp500 = file 'sp500.csv'
|
41
|
+
vix = file 'vix.csv'
|
42
|
+
|
43
|
+
# Keep only desired columns, rename and round data
|
44
|
+
sp500.keep :date, :adjusted_close
|
45
|
+
sp500.rename :adjusted_close, to: :close
|
46
|
+
sp500.round :close, decimals: 2
|
47
|
+
|
48
|
+
# Calculate a Change column, based on the Close column and round
|
49
|
+
sp500[:change] = sp500[:close] - sp500[:close].prev
|
50
|
+
sp500.round :change, decimals: 2
|
51
|
+
|
52
|
+
# Keep only desired columns and rename
|
53
|
+
vix.keep :date, :adjusted_close
|
54
|
+
vix.rename :adjusted_close, to: :vix
|
55
|
+
|
56
|
+
# Join the two tables
|
57
|
+
sp500.join vix, on: :date
|
58
|
+
|
59
|
+
# Remove all rows that have any empty value
|
60
|
+
sp500.delete_empty_rows
|
61
|
+
|
62
|
+
# Save and preview
|
63
|
+
sp500.save_as 'output.csv'
|
64
|
+
sp500.preview
|
65
|
+
|
66
|
+
# Output
|
67
|
+
# +------------+---------+--------+-------+
|
68
|
+
# | date | close | change | vix |
|
69
|
+
# +------------+---------+--------+-------+
|
70
|
+
# | 2015-03-12 | 2065.95 | 25.71 | 15.42 |
|
71
|
+
# | 2015-03-13 | 2053.4 | -12.55 | 16.0 |
|
72
|
+
# | 2015-03-16 | 2081.19 | 27.79 | 15.61 |
|
73
|
+
# | 2015-03-17 | 2074.28 | -6.91 | 15.66 |
|
74
|
+
# | 2015-03-18 | 2099.5 | 25.22 | 13.97 |
|
75
|
+
# | 2015-03-19 | 2089.27 | -10.23 | 14.07 |
|
76
|
+
# | 2015-03-20 | 2108.1 | 18.83 | 13.02 |
|
77
|
+
# | 2015-03-23 | 2104.42 | -3.68 | 13.41 |
|
78
|
+
# | 2015-03-24 | 2091.5 | -12.92 | 13.62 |
|
79
|
+
# | 2015-03-25 | 2061.05 | -30.45 | 15.44 |
|
80
|
+
# +------------+---------+--------+-------+
|
40
81
|
```
|
41
82
|
|
42
|
-
|
83
|
+
Examples
|
84
|
+
--------------------------------------------------
|
43
85
|
|
86
|
+
See the [examples index][2] for more examples.
|
44
87
|
|
45
88
|
[1]: https://ruby-doc.org/stdlib-2.3.1/libdoc/csv/rdoc/CSV/Table.html
|
89
|
+
[2]: https://github.com/DannyBen/datamix/tree/master/examples#examples-index
|
@@ -1,43 +1,19 @@
|
|
1
1
|
module DataMix
|
2
2
|
refine Array do
|
3
3
|
def -(other)
|
4
|
-
|
5
|
-
each_with_index do |val, index|
|
6
|
-
self[index] = other[index] ? val - other[index] : nil
|
7
|
-
end
|
8
|
-
else
|
9
|
-
map { |val| val - other }
|
10
|
-
end
|
4
|
+
math_operation(other) { |left, right| left - right }
|
11
5
|
end
|
12
6
|
|
13
7
|
def +(other)
|
14
|
-
|
15
|
-
each_with_index do |val, index|
|
16
|
-
self[index] = other[index] ? val + other[index] : nil
|
17
|
-
end
|
18
|
-
else
|
19
|
-
map { |val| val + other }
|
20
|
-
end
|
8
|
+
math_operation(other) { |left, right| left + right }
|
21
9
|
end
|
22
10
|
|
23
11
|
def *(other)
|
24
|
-
|
25
|
-
each_with_index do |val, index|
|
26
|
-
self[index] = other[index] ? val * other[index] : nil
|
27
|
-
end
|
28
|
-
else
|
29
|
-
map { |val| val * other }
|
30
|
-
end
|
12
|
+
math_operation(other) { |left, right| left * right }
|
31
13
|
end
|
32
14
|
|
33
15
|
def /(other)
|
34
|
-
|
35
|
-
each_with_index do |val, index|
|
36
|
-
self[index] = other[index] ? val / other[index].to_f : nil
|
37
|
-
end
|
38
|
-
else
|
39
|
-
map { |val| val / other.to_f }
|
40
|
-
end
|
16
|
+
math_operation(other) { |left, right| left / right.to_f }
|
41
17
|
end
|
42
18
|
|
43
19
|
def offset(rows)
|
@@ -53,6 +29,10 @@ module DataMix
|
|
53
29
|
offset rows
|
54
30
|
end
|
55
31
|
|
32
|
+
def next(rows=1)
|
33
|
+
offset -rows
|
34
|
+
end
|
35
|
+
|
56
36
|
def round(decimals=0)
|
57
37
|
map { |val| val ? val.round(decimals) : nil }
|
58
38
|
end
|
@@ -69,5 +49,17 @@ module DataMix
|
|
69
49
|
Array.new(window_size-1).concat result
|
70
50
|
end
|
71
51
|
|
52
|
+
private
|
53
|
+
|
54
|
+
def math_operation(other)
|
55
|
+
if other.respond_to? :each
|
56
|
+
each_with_index do |val, index|
|
57
|
+
self[index] = other[index] ? yield(val, other[index]) : nil
|
58
|
+
end
|
59
|
+
else
|
60
|
+
map { |val| yield(val, other) }
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
72
64
|
end
|
73
65
|
end
|
@@ -39,11 +39,13 @@ module DataMix
|
|
39
39
|
raise CSVError, "source[#{on}] is not unique" unless by_col[on].uniq?
|
40
40
|
raise CSVError, "other[#{on}] is not unique" unless other.by_col[on].uniq?
|
41
41
|
|
42
|
+
original_headers = headers.dup
|
43
|
+
|
42
44
|
by_row.each do |row|
|
43
45
|
other_row = other.find { |r| r[on] == row[on] }
|
44
46
|
other.headers.each do |col|
|
45
47
|
next if col == on
|
46
|
-
new_col =
|
48
|
+
new_col = original_headers.include?(col) ? "_#{col}" : col
|
47
49
|
row[new_col] = other_row ? other_row[col] : nil
|
48
50
|
end
|
49
51
|
end
|
data/lib/datamix/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: datamix
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Danny Ben Shitrit
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-03-
|
11
|
+
date: 2017-03-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: terminal-table
|
@@ -136,6 +136,20 @@ dependencies:
|
|
136
136
|
- - "~>"
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '0.10'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: filewatcher
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0.5'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0.5'
|
139
153
|
description: DSL for manipulating tabular data
|
140
154
|
email: db@dannyben.com
|
141
155
|
executables: []
|