quandl_data 1.2.1 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -0
- data/UPGRADE.md +13 -0
- data/lib/quandl/data/babelfisher.rb +56 -0
- data/lib/quandl/data/enumerator.rb +3 -11
- data/lib/quandl/data/format.rb +217 -0
- data/lib/quandl/data/operations.rb +31 -12
- data/lib/quandl/data/version.rb +1 -1
- data/lib/quandl/data.rb +10 -2
- data/lib/quandl/errors/unknown_date_format.rb +5 -0
- data/quandl_data.gemspec +3 -3
- data/spec/lib/quandl/data/enumerator_spec.rb +1 -1
- data/spec/lib/quandl/data/format_spec.rb +81 -0
- data/spec/lib/quandl/data/operations_spec.rb +4 -4
- data/spec/lib/quandl/data_spec.rb +10 -4
- metadata +35 -30
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e811fb881ccd062b98502cddce1c7a27d5f53ac2
|
4
|
+
data.tar.gz: 5f84494fdae5960ebb598c032da19cf9ce342b3d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 514a0425af0aa3af800bb8a0c2f06299bc9a2bce9b825cccc57ad84cd8469107d2da25a5a4be4900bcf6c4d78958edb34a5d496d528467f64489a8f5e8e9d8ac
|
7
|
+
data.tar.gz: 91ff9683ef3c984c2e7e679178b04848699ede82b7e54b6f36b883d19823697888258d2f9b67fdf2803e72bfbda6ec88c7eab526c39346c6f631321059866f42
|
data/Gemfile
CHANGED
data/UPGRADE.md
CHANGED
@@ -1,3 +1,16 @@
|
|
1
|
+
## 1.3.0
|
2
|
+
|
3
|
+
* string_to_csv will not force values to float
|
4
|
+
* add #row to Operations
|
5
|
+
* add cleaned? cleaned! for tracking whether or not a Quandl::Data instance has already been cleaned
|
6
|
+
* replace parse with babelfish#clean
|
7
|
+
* add Quandl::Babelfish.clean to replace Quandl::Data::Format.parse
|
8
|
+
* bump Quandl::Operation to 0.3.0 for Quandl::Operation::Sort
|
9
|
+
* refactor sorting into Quandl::Operation::Sort
|
10
|
+
* import Quandl::Data::Format from Quandl::Operation
|
11
|
+
* remove data parse
|
12
|
+
|
13
|
+
|
1
14
|
## 1.2.1
|
2
15
|
|
3
16
|
* add Data#to_date_str that returns data as "yyyy-mm-dd"
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module Quandl
|
2
|
+
class Data
|
3
|
+
module Babelfisher
|
4
|
+
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
def headers=(value)
|
8
|
+
@headers = value
|
9
|
+
end
|
10
|
+
def headers
|
11
|
+
@headers ||= data_array.respond_to?(:headers) ? data_array.headers : nil
|
12
|
+
end
|
13
|
+
def headers?
|
14
|
+
headers.present?
|
15
|
+
end
|
16
|
+
|
17
|
+
def cleaned
|
18
|
+
@cleaned
|
19
|
+
end
|
20
|
+
def cleaned=(value)
|
21
|
+
@cleaned = (value == true)
|
22
|
+
end
|
23
|
+
def cleaned?
|
24
|
+
cleaned == true
|
25
|
+
end
|
26
|
+
|
27
|
+
protected
|
28
|
+
|
29
|
+
def clean(data)
|
30
|
+
# skip cleaning if already clean
|
31
|
+
return data if data.kind_of?(Array) && cleaned?
|
32
|
+
# Quandl::Data is already clean, but to avoid errors extract internal array
|
33
|
+
return data.data_array if data.kind_of?(Quandl::Data)
|
34
|
+
# Quandl::Babelfish::Data is already clean
|
35
|
+
return data if data.kind_of?(Quandl::Babelfish::Data)
|
36
|
+
# Return empty array if given empty string, nil, etc.
|
37
|
+
return [] if data.blank?
|
38
|
+
# String needs conversion to array
|
39
|
+
data = Format.csv_to_array( data ) if data.kind_of?(String)
|
40
|
+
# Hash needs conversion to array
|
41
|
+
data = Format.hash_to_array( data ) if data.kind_of?(Hash)
|
42
|
+
# Array needs cleaning
|
43
|
+
data = Quandl::Babelfish.clean( data )
|
44
|
+
# mark data as clean
|
45
|
+
cleaned!
|
46
|
+
# return data
|
47
|
+
data
|
48
|
+
end
|
49
|
+
|
50
|
+
def cleaned!
|
51
|
+
self.cleaned = true
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -5,7 +5,7 @@ module Quandl::Data::Enumerator
|
|
5
5
|
delegate *Array.forwardable_methods, to: :data_array
|
6
6
|
|
7
7
|
delegate :to_json, :as_json, to: :data_array
|
8
|
-
|
8
|
+
|
9
9
|
attr_accessor :pristine_data
|
10
10
|
end
|
11
11
|
|
@@ -15,11 +15,11 @@ module Quandl::Data::Enumerator
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def data_array
|
18
|
-
@data_array ||=
|
18
|
+
@data_array ||= clean( pristine_data )
|
19
19
|
end
|
20
20
|
|
21
21
|
def data_array=(data)
|
22
|
-
@data_array =
|
22
|
+
@data_array = clean(data)
|
23
23
|
end
|
24
24
|
|
25
25
|
def data_array?
|
@@ -42,12 +42,4 @@ module Quandl::Data::Enumerator
|
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
|
-
protected
|
46
|
-
|
47
|
-
def parse(data)
|
48
|
-
data = data.to_a if data.respond_to?(:to_a) && data.is_a?(Quandl::Data)
|
49
|
-
data = Quandl::Operation::Parse.perform( data )
|
50
|
-
data
|
51
|
-
end
|
52
|
-
|
53
45
|
end
|
@@ -0,0 +1,217 @@
|
|
1
|
+
module Quandl
|
2
|
+
class Data
|
3
|
+
class Format
|
4
|
+
|
5
|
+
class << self
|
6
|
+
|
7
|
+
def parse(data)
|
8
|
+
return [] if data.blank?
|
9
|
+
data = hash_to_array(data)
|
10
|
+
data = csv_to_array(data)
|
11
|
+
data = values_to_float(data)
|
12
|
+
data = to_date(data)
|
13
|
+
data.dup
|
14
|
+
end
|
15
|
+
|
16
|
+
def hash_to_array(data)
|
17
|
+
data = data.collect{|k,v| [k] + v } if data.kind_of?(Hash)
|
18
|
+
data
|
19
|
+
end
|
20
|
+
|
21
|
+
def csv_to_array(data)
|
22
|
+
if data.is_a?(String)
|
23
|
+
data = data.gsub('\n', "\n")
|
24
|
+
data = CSV.parse( data )
|
25
|
+
end
|
26
|
+
data
|
27
|
+
end
|
28
|
+
|
29
|
+
def to_date(data)
|
30
|
+
return data if data_missing_rows?(data)
|
31
|
+
# guess the current date format
|
32
|
+
format = date_format?(data)
|
33
|
+
# convert dates to Date
|
34
|
+
case format
|
35
|
+
when :date then return data
|
36
|
+
when :date_string then return date_strings_to_date( data )
|
37
|
+
when :jd, :jd_string then return jds_to_date( data )
|
38
|
+
when :unknown then raise_date_format_error!( data[0] )
|
39
|
+
end
|
40
|
+
# return data
|
41
|
+
data
|
42
|
+
end
|
43
|
+
|
44
|
+
def to_jd(data)
|
45
|
+
return data if data_missing_rows?(data)
|
46
|
+
# guess the current date format
|
47
|
+
format = date_format?(data)
|
48
|
+
# convert dates to Date
|
49
|
+
case format
|
50
|
+
when :jd then return data
|
51
|
+
when :jd_string then return jd_strings_to_jd( data )
|
52
|
+
when :date then return dates_to_jd( data )
|
53
|
+
when :date_string then return date_strings_to_jd( data )
|
54
|
+
when :unknown then raise_date_format_error!( data[0] )
|
55
|
+
end
|
56
|
+
# return data
|
57
|
+
data
|
58
|
+
end
|
59
|
+
|
60
|
+
def date_format?(data)
|
61
|
+
value = data[0][0]
|
62
|
+
# julian date?
|
63
|
+
return :date if value.is_a?(Date)
|
64
|
+
return :jd if value.is_a?(Integer)
|
65
|
+
return :date_string if value.is_a?(String) && value =~ /^[0-9]{4}\-[0-9]{2}\-[0-9]{2}$/
|
66
|
+
return :jd_string if value.kind_of?(String) && value.numeric?
|
67
|
+
return :unknown
|
68
|
+
end
|
69
|
+
|
70
|
+
def dates_to_jd(data)
|
71
|
+
return data if data_missing_rows?(data) || data[0][0].is_a?(Integer)
|
72
|
+
# dont alter by reference
|
73
|
+
result = []
|
74
|
+
# for each row
|
75
|
+
data.each_with_index do |row, index|
|
76
|
+
# copy
|
77
|
+
row = row.dup
|
78
|
+
# string to date
|
79
|
+
date = row[0]
|
80
|
+
date = Date.parse(row[0]) if row[0].is_a?(String)
|
81
|
+
# date to julian
|
82
|
+
row[0] = date.jd if date.respond_to?(:jd)
|
83
|
+
# save result
|
84
|
+
result[index] = row
|
85
|
+
end
|
86
|
+
# all done
|
87
|
+
result
|
88
|
+
end
|
89
|
+
|
90
|
+
|
91
|
+
###################
|
92
|
+
# DATES TO JULIAN #
|
93
|
+
###################
|
94
|
+
|
95
|
+
def jd_strings_to_jd(data)
|
96
|
+
# skip when already formatted correctly
|
97
|
+
return data if data_missing_rows?(data) || data[0][0].is_a?(Integer)
|
98
|
+
# otherwise cast string jds to int
|
99
|
+
output = []
|
100
|
+
data.each_with_index do |row, index|
|
101
|
+
output << parse_jd_string(row) rescue raise_date_format_error!( row, index, :jd_strings_to_jd )
|
102
|
+
end
|
103
|
+
output
|
104
|
+
end
|
105
|
+
|
106
|
+
def date_strings_to_jd(data)
|
107
|
+
# skip when already formatted correctly
|
108
|
+
return data if data_missing_rows?(data) || data[0][0].is_a?(Date)
|
109
|
+
# otherwise cast string jds to int
|
110
|
+
output = []
|
111
|
+
data.each_with_index do |row, index|
|
112
|
+
row = parse_date_string(row) rescue raise_date_format_error!( row, index, :date_strings_to_jd )
|
113
|
+
row[0] = row[0].jd
|
114
|
+
output << row
|
115
|
+
end
|
116
|
+
output
|
117
|
+
end
|
118
|
+
|
119
|
+
|
120
|
+
#################
|
121
|
+
# DATES TO DATE #
|
122
|
+
#################
|
123
|
+
|
124
|
+
def jds_to_date(data)
|
125
|
+
return data if data_missing_rows?(data) || data[0][0].is_a?(Date)
|
126
|
+
output = []
|
127
|
+
data.each_with_index do |row, index|
|
128
|
+
output << parse_jd(row) rescue raise_date_format_error!( row, index, :jds_to_date )
|
129
|
+
end
|
130
|
+
output
|
131
|
+
end
|
132
|
+
|
133
|
+
def date_strings_to_date(data)
|
134
|
+
# skip when already formatted correctly
|
135
|
+
return data if data_missing_rows?(data) || data[0][0].is_a?(Date)
|
136
|
+
# otherwise cast string jds to int
|
137
|
+
output = []
|
138
|
+
data.each_with_index do |row, index|
|
139
|
+
output << parse_date_string(row) rescue raise_date_format_error!( row, index, :date_strings_to_date )
|
140
|
+
end
|
141
|
+
output
|
142
|
+
end
|
143
|
+
|
144
|
+
|
145
|
+
###################
|
146
|
+
# VALUES TO FLOAT #
|
147
|
+
###################
|
148
|
+
|
149
|
+
def values_to_float(data)
|
150
|
+
# skip unless value is a string
|
151
|
+
return data if data_missing_rows?(data) || data[0][1].is_a?(Float)
|
152
|
+
# cast values to float
|
153
|
+
data.collect do |row|
|
154
|
+
new_row = [row[0]]
|
155
|
+
row[1..-1].each_with_index do |value, index|
|
156
|
+
value = value.to_f if value.is_a?(String)
|
157
|
+
new_row[index + 1] = value
|
158
|
+
end
|
159
|
+
new_row
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
|
164
|
+
def data_missing_rows?(data)
|
165
|
+
!data_has_rows?(data)
|
166
|
+
end
|
167
|
+
|
168
|
+
def data_has_rows?(data)
|
169
|
+
data.is_a?(Array) && data[0].is_a?(Array) && data[0][0].present?
|
170
|
+
end
|
171
|
+
|
172
|
+
|
173
|
+
protected
|
174
|
+
|
175
|
+
def parse_jd(row)
|
176
|
+
# parse jd_string
|
177
|
+
row = parse_jd_string(row)
|
178
|
+
# jd to date
|
179
|
+
row[0] = Date.jd( row[0] )
|
180
|
+
# onwards
|
181
|
+
row
|
182
|
+
end
|
183
|
+
|
184
|
+
def parse_jd_string(row)
|
185
|
+
row = row.dup
|
186
|
+
row[0] = row[0].to_i
|
187
|
+
# dont allow dates that are before 0000
|
188
|
+
raise Quandl::Errors::UnknownDateFormat if row[0] <= 1721058
|
189
|
+
row
|
190
|
+
end
|
191
|
+
|
192
|
+
def parse_date_string(row)
|
193
|
+
row = row.dup
|
194
|
+
# extract date
|
195
|
+
date = row[0]
|
196
|
+
# split date into parts
|
197
|
+
date_values = date.split('-').collect(&:to_i)
|
198
|
+
# ensure date is valid
|
199
|
+
raise Quandl::Errors::UnknownDateFormat unless date_values.count == 3
|
200
|
+
# add to row
|
201
|
+
row[0] = Date.new( *date_values )
|
202
|
+
row
|
203
|
+
end
|
204
|
+
|
205
|
+
|
206
|
+
private
|
207
|
+
|
208
|
+
def raise_date_format_error!(row, index = 0, type = :none)
|
209
|
+
message = "UnknownDateFormat: '#{row[0]}', index: data[#{index}][0], strategy: '#{type}', row: #{row}"
|
210
|
+
raise Quandl::Errors::UnknownDateFormat, message
|
211
|
+
end
|
212
|
+
|
213
|
+
end
|
214
|
+
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|
@@ -1,10 +1,18 @@
|
|
1
|
-
module Quandl
|
1
|
+
module Quandl
|
2
|
+
class Data
|
3
|
+
module Operations
|
2
4
|
|
3
5
|
extend ActiveSupport::Concern
|
4
|
-
include Quandl::Operation
|
5
6
|
|
6
7
|
module ClassMethods
|
7
8
|
|
9
|
+
def new_with_jd(*args)
|
10
|
+
# force data to date
|
11
|
+
args[0] = Format.to_date( args[0] )
|
12
|
+
# onwards
|
13
|
+
self.new( *args )
|
14
|
+
end
|
15
|
+
|
8
16
|
def forwardable_methods
|
9
17
|
@forwardable_methods ||= (operations + operations.collect{|o| "#{o}!" if method_defined?("#{o}!") }).compact
|
10
18
|
end
|
@@ -31,11 +39,11 @@ module Quandl::Data::Operations
|
|
31
39
|
end
|
32
40
|
|
33
41
|
def to_jd!
|
34
|
-
@data_array =
|
42
|
+
@data_array = Quandl::Data::Format.to_jd( data_array ); self
|
35
43
|
end
|
36
44
|
|
37
45
|
def to_date!
|
38
|
-
@data_array =
|
46
|
+
@data_array = Quandl::Data::Format.to_date( data_array ); self
|
39
47
|
end
|
40
48
|
|
41
49
|
def to_date_str!
|
@@ -73,11 +81,18 @@ module Quandl::Data::Operations
|
|
73
81
|
end
|
74
82
|
|
75
83
|
def sort_ascending!
|
76
|
-
@data_array =
|
84
|
+
@data_array = Quandl::Operation::Sort.asc( data_array ); self
|
77
85
|
end
|
78
86
|
|
79
87
|
def sort_descending!
|
80
|
-
@data_array =
|
88
|
+
@data_array = Quandl::Operation::Sort.desc( data_array ); self
|
89
|
+
end
|
90
|
+
|
91
|
+
def row(*args)
|
92
|
+
return @row if args[0].nil?
|
93
|
+
@row = args[0]
|
94
|
+
@data_array = [data_array[ args[0] ]]
|
95
|
+
self
|
81
96
|
end
|
82
97
|
|
83
98
|
def transform(*args)
|
@@ -86,9 +101,10 @@ module Quandl::Data::Operations
|
|
86
101
|
self
|
87
102
|
end
|
88
103
|
def transform=(value)
|
89
|
-
return false unless Transform.valid?(value)
|
104
|
+
return false unless Quandl::Operation::Transform.valid?(value)
|
90
105
|
@transform = value
|
91
|
-
@data_array = Transform.perform( data_array, value )
|
106
|
+
@data_array = Quandl::Operation::Transform.perform( data_array, value )
|
107
|
+
@data_array
|
92
108
|
end
|
93
109
|
|
94
110
|
def collapse(*args)
|
@@ -97,21 +113,21 @@ module Quandl::Data::Operations
|
|
97
113
|
self
|
98
114
|
end
|
99
115
|
def collapse=(collapse)
|
100
|
-
return false unless Collapse.valid?(collapse)
|
116
|
+
return false unless Quandl::Operation::Collapse.valid?(collapse)
|
101
117
|
@collapse = collapse
|
102
118
|
@frequency = collapse
|
103
|
-
@data_array = Collapse.perform( data_array, collapse )
|
119
|
+
@data_array = Quandl::Operation::Collapse.perform( data_array, collapse )
|
104
120
|
end
|
105
121
|
|
106
122
|
def frequency
|
107
|
-
@frequency ||= Collapse.frequency?( data_array )
|
123
|
+
@frequency ||= Quandl::Operation::Collapse.frequency?( data_array )
|
108
124
|
end
|
109
125
|
def frequency=(value)
|
110
126
|
@frequency = value.to_sym if value.present?
|
111
127
|
end
|
112
128
|
|
113
129
|
def clone
|
114
|
-
|
130
|
+
self.class.new( data_array.dup, headers: headers, cleaned: cleaned )
|
115
131
|
end
|
116
132
|
|
117
133
|
def to_jd
|
@@ -138,4 +154,7 @@ module Quandl::Data::Operations
|
|
138
154
|
def sort_descending
|
139
155
|
clone.sort_descending!
|
140
156
|
end
|
157
|
+
|
158
|
+
end
|
159
|
+
end
|
141
160
|
end
|
data/lib/quandl/data/version.rb
CHANGED
data/lib/quandl/data.rb
CHANGED
@@ -6,13 +6,21 @@ require "active_support/core_ext/hash"
|
|
6
6
|
require "active_support/core_ext/object"
|
7
7
|
|
8
8
|
require "quandl/operation"
|
9
|
+
require "quandl/babelfish"
|
9
10
|
|
11
|
+
require 'quandl/errors/unknown_date_format'
|
12
|
+
|
13
|
+
require 'quandl/data/babelfisher'
|
10
14
|
require 'quandl/data/enumerator'
|
11
15
|
require 'quandl/data/operations'
|
16
|
+
require 'quandl/data/format'
|
12
17
|
require 'quandl/data/logging'
|
13
18
|
|
14
|
-
|
19
|
+
module Quandl
|
20
|
+
class Data
|
21
|
+
include Babelfisher
|
15
22
|
include Enumerator
|
16
23
|
include Operations
|
17
24
|
include Logging if defined?(QUANDL_LOGGER) && QUANDL_LOGGER == true
|
18
|
-
end
|
25
|
+
end
|
26
|
+
end
|
data/quandl_data.gemspec
CHANGED
@@ -17,6 +17,9 @@ Gem::Specification.new do |s|
|
|
17
17
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
18
18
|
s.require_paths = ["lib"]
|
19
19
|
|
20
|
+
s.add_runtime_dependency "quandl_operation", "~> 0.3.1"
|
21
|
+
s.add_runtime_dependency "quandl_babelfish", "~> 0.0"
|
22
|
+
|
20
23
|
s.add_development_dependency "rake", "~> 10.0"
|
21
24
|
s.add_development_dependency "rspec", "~> 2.13"
|
22
25
|
s.add_development_dependency "fivemat", "~> 1.2"
|
@@ -24,7 +27,4 @@ Gem::Specification.new do |s|
|
|
24
27
|
s.add_development_dependency "simplecov"
|
25
28
|
s.add_development_dependency "guard"
|
26
29
|
s.add_development_dependency "guard-rspec"
|
27
|
-
|
28
|
-
s.add_runtime_dependency "activesupport", ">= 3.0.0"
|
29
|
-
s.add_runtime_dependency "quandl_operation", "~> 0.2"
|
30
30
|
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Quandl::Data::Format do
|
5
|
+
|
6
|
+
expectations = [
|
7
|
+
{
|
8
|
+
input: "2013-12-05,10.03,11.0271,13.96623,19.1262\n2013-12-04,10.0760,11.0745,13.9777,19.2117",
|
9
|
+
output: [[ Date.parse('2013-12-05'), 10.03, 11.0271, 13.96623, 19.1262 ], [ Date.parse('2013-12-04'), 10.0760, 11.0745, 13.9777, 19.2117 ]]
|
10
|
+
},
|
11
|
+
]
|
12
|
+
|
13
|
+
describe ".data" do
|
14
|
+
expectations.each do |data|
|
15
|
+
it "should recieve:\n#{data[:input].gsub(%Q{\n},'\n')} \n and return:\n#{data[:output]}" do
|
16
|
+
Quandl::Data::Format.parse(data[:input]).should eq data[:output]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
subject{ Quandl::Data::Format }
|
22
|
+
let(:escaped_csv){ '2444628,0.00385,0.001,0.123,0.00631,0.534\n2444627,0.00384,0.00159507,0.0056,0.00628948,0.009896' }
|
23
|
+
let(:data_array){ [[ Date.jd(2444628),0.00385,0.001,0.123,0.00631,0.534], [ Date.jd(2444627),0.00384,0.00159507,0.0056,0.00628948,0.009896 ]] }
|
24
|
+
|
25
|
+
let(:csv_data){ "#{Date.today}, 1.0, 2.0" }
|
26
|
+
let(:hash_data){ { Date.today.to_s => [ 1.0, 2.0 ] } }
|
27
|
+
let(:array_data){ [[ Date.today.to_s, 1.0, 2.0 ]] }
|
28
|
+
let(:julian_data){ [[ Date.today.jd, 1.0, 2.0 ]] }
|
29
|
+
let(:date_data){ [[ Date.today, 1.0, 2.0 ]] }
|
30
|
+
|
31
|
+
it "#hash outputs array" do
|
32
|
+
subject.hash_to_array( hash_data ).should eq array_data
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "#parse" do
|
36
|
+
|
37
|
+
[:csv, :hash, :array, :julian, :date].each do |type|
|
38
|
+
context "#{type} data" do
|
39
|
+
it "should eq date_data" do
|
40
|
+
subject.parse( self.send("#{type}_data") ).should eq date_data
|
41
|
+
end
|
42
|
+
it "values should be_a Float" do
|
43
|
+
subject.parse( self.send("#{type}_data") ).each{|r| r[1..-1].each{|v| v.should be_a Float } }
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
let(:csv1){ "2012-12-31,20.0,10.0,35.0,35.0,20.0,28.0,30.0,25.0,0.0,0.0,27.5,25.0,18.0,33.99,0.0,25.0,0.0,10.0,22.0,34.0,10.0,20.0,26.0,0.0,18.5,25.0,33.0,30.0,20.0,27.5,10.0,19.0,25.0,29.0,23.0,25.0,21.0,30.0,28.0,24.5,33.33,0.0,29.48,10.0,20.0,31.0,0.0,35.0,16.5,19.0,20.0,32.45,25.0,12.5,0.0,25.0,31.4,33.33,38.01,0.0,14.0,20.0,30.0,24.2,15.0,15.0,20.0,12.5,15.0,28.8,12.0,10.0,30.0,25.0,35.0,15.0,30.0,9.0,32.0,34.0,25.0,28.0,30.0,28.0,12.0,35.0,25.0,30.0,10.0,30.0,30.0,19.0,25.0,10.0,16.0,20.0,0.0,27.0,20.0,10.0,17.0,19.0,18.0,34.55,30.0,28.0,0.0,34.5,35.0,26.3,21.17,28.0,17.0,30.0,23.0,25.0,30.0,20.0,30.0,21.0,55.0,24.0,40.0,25.0,0.0,34.0,25.0,20.0,35.0,25.75,29.02,33.0,22.89,20.5,28.3,28.6,22.6,25.25,24.43\n2011-12-31,20.0,10.0,35.0,35.0,20.0,28.0,30.0,25.0,0.0,0.0,27.5,25.0,24.0,33.99,0.0,0.0,0.0,10.0,22.0,34.0,10.0,20.0,28.0,0.0,20.0,25.0,33.0,30.0,20.0,34.5,10.0,19.0,25.0,29.0,24.0,20.0,21.0,0.0,28.0,26.0,33.33,0.0,29.37,10.0,20.0,31.0,0.0,35.0,16.5,19.0,20.0,32.44,25.0,12.5,0.0,24.0,31.4,33.33,40.69,0.0,14.0,20.0,0.0,22.0,15.0,15.0,20.0,12.5,15.0,28.8,12.0,10.0,0.0,25.0,35.0,15.0,30.0,9.0,32.0,34.0,25.0,28.0,30.0,28.0,12.0,35.0,25.0,30.0,10.0,30.0,30.0,19.0,25.0,10.0,16.0,20.0,0.0,27.0,20.0,10.0,17.0,19.0,20.0,34.55,30.0,28.0,0.0,34.5,35.0,26.3,21.17,28.0,17.0,30.0,30.0,0.0,30.0,20.0,30.0,25.0,55.0,26.0,40.0,25.0,0.0,34.0,25.0,20.0,35.0,25.75,28.55,34.0,23.1,20.88,29.02,28.6,22.8,25.5,24.52\n2010-12-31,20.0,10.0,35.0,35.0,20.0,28.0,30.0,25.0,0.0,0.0,27.5,25.0,24.0,33.99,0.0,25.0,0.0,10.0,25.0,34.0,10.0,20.0,31.0,0.0,17.0,25.0,33.0,30.0,20.0,0.0,10.0,19.0,25.0,25.0,25.0,20.0,21.0,0.0,28.0,26.0,33.33,0.0,29.41,22.0,24.0,31.0,0.0,25.0,16.5,19.0,18.0,33.99,25.0,12.5,0.0,25.0,31.4,33.33,40.69,0.0,14.0,20.0,0.0,24.2,15.0,15.0,40.0,0.0,15.0,28.59,12.0,10.0,0.0,25.0,35.0,15.0,30.0,9.0,32.0,0.0,25.5,30.0,30.0,28.0,12.0,35.0,27.5,30.0,10.0,30.0,30.0,19.0,25.0,10.0,16.0,20.0,0.0,27.0,20.0,10.0,17.0,19.0,20.0,34.55,30.0,35.0,0.0,0.0,15.0,26.3,21.17,28.0,17.0,30.0,30.0,0.0,30.0,20.0,30.0,25.0,55.0,28.0,40.0,25.0,0.0,34.0,25.0,35.0,35.0,25.75,28.38,35.5,23.96,21.52,27.52,29.0,23.04,25.79,24.71\n2009-12-31,20.0,10.0,35.0,35.0,20.0,28.0,30.0,25.0,0.0,0.0,27.5,25.0,24.0,33.99,0.0,0.0,0.0,10.0,25.0,34.0,10.0,0.0,33.0,0.0,17.0,25.0,33.0,30.0,20.0,0.0,10.0,20.0,25.0,25.0,25.0,20.0,21.0,0.0,29.0,26.0,33.33,0.0,29.44,27.0,25.0,31.0,0.0,30.0,16.5,16.0,15.0,33.99,28.0,12.5,0.0,26.0,31.4,33.33,40.69,0.0,25.0,20.0,0.0,24.2,15.0,15.0,40.0,0.0,20.0,28.59,12.0,10.0,0.0,25.0,35.0,15.0,28.0,9.0,32.0,0.0,25.5,30.0,30.0,28.0,12.0,35.0,30.0,30.0,10.0,30.0,30.0,19.0,25.0,35.0,16.0,20.0,0.0,27.0,20.0,10.0,18.0,19.0,21.0,34.55,30.0,35.0,0.0,0.0,15.0,26.3,21.17,28.0,25.0,30.0,30.0,0.0,30.0,20.0,30.0,25.0,55.0,28.0,40.0,25.0,0.0,34.0,25.0,35.0,35.0,30.9,28.75,36.5,25.73,21.7,27.96,29.2,23.22,25.73,25.4\n2008-12-31,20.0,10.0,35.0,35.0,20.0,28.0,30.0,25.0,0.0,0.0,30.0,25.0,24.0,33.99,0.0,0.0,0.0,10.0,25.0,34.0,10.0,0.0,33.5,0.0,17.0,25.0,33.0,30.0,20.0,0.0,10.0,21.0,25.0,25.0,25.0,20.0,21.0,0.0,31.0,26.0,33.33,0.0,29.51,33.0,25.0,31.0,0.0,30.0,16.5,16.0,15.0,33.99,30.0,12.5,0.0,27.0,31.4,33.33,40.69,0.0,25.0,30.0,0.0,27.5,55.0,15.0,40.0,0.0,15.0,29.63,12.0,10.0,0.0,26.0,35.0,15.0,28.0,9.0,32.0,0.0,25.5,30.0,30.0,28.0,12.0,35.0,30.0,30.0,10.0,30.0,35.0,19.0,25.0,35.0,16.0,24.0,0.0,27.0,20.0,10.0,18.0,19.0,22.0,34.55,30.0,35.0,0.0,0.0,15.0,28.0,21.17,28.0,25.0,0.0,30.0,0.0,30.0,20.0,30.0,25.0,55.0,30.0,40.0,25.0,0.0,34.0,28.0,35.0,35.0,30.9,28.65,36.75,27.99,22.0,27.96,29.6,23.29,26.08,26.12\n2007-12-31,20.0,20.0,35.0,35.0,20.0,28.0,30.0,25.0,0.0,0.0,30.0,25.0,24.0,33.99,0.0,0.0,0.0,10.0,25.0,34.0,10.0,0.0,36.1,0.0,17.0,33.0,34.0,30.0,20.0,0.0,10.0,24.0,25.0,25.0,25.0,20.0,22.0,0.0,31.0,26.0,33.33,0.0,38.36,35.0,25.0,31.0,0.0,30.0,17.5,16.0,18.0,33.99,30.0,12.5,0.0,29.0,37.25,33.33,40.69,0.0,25.0,30.0,0.0,27.5,55.0,15.0,40.0,0.0,15.0,29.63,12.0,12.0,0.0,27.0,35.0,22.5,28.0,9.0,32.0,0.0,25.5,33.0,30.0,28.0,12.0,35.0,30.0,30.0,10.0,30.0,35.0,19.0,25.0,35.0,16.0,24.0,0.0,27.0,20.0,10.0,20.0,19.0,23.0,36.89,32.5,35.0,0.0,0.0,30.0,28.0,21.32,28.0,25.0,0.0,30.0,0.0,30.0,20.0,30.0,25.0,55.0,30.0,40.0,30.0,0.0,34.0,28.0,35.0,35.0,30.9,30.56,38.05,28.46,23.01,28.3,30.2,24.11,27.08,26.96\n"}
|
50
|
+
let(:csv2){ "2012-03-07,,69.75,69.75,69.75,0.0,0.0,0.0\n2012-03-06,69.75,69.75,69.75,69.75,0.0,0.0,0.0\n2012-03-05,69.75,69.75,69.75,69.75,0.0,0.0,0.0\n2012-03-04,69.75,69.75,69.75,69.75,0.0,0.0,0.0\n2012-02-29,,69.75,69.75,69.75,0.0,0.0,0.0\n2012-02-28,69.75,69.75,69.75,69.75,0.0,0.0,0.0\n" }
|
51
|
+
|
52
|
+
[:csv1, :csv2].each do |type|
|
53
|
+
context "#{type} data" do
|
54
|
+
it "dates should be_a Date" do
|
55
|
+
subject.parse( self.send(type) ).each{|r| r[0].should be_a Date }
|
56
|
+
end
|
57
|
+
|
58
|
+
it "values should be_a Float" do
|
59
|
+
subject.parse( self.send(type) ).each do |row|
|
60
|
+
row[1..-1].each do |value|
|
61
|
+
next if value.nil?
|
62
|
+
value.should be_a Float
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
let(:invalid1){ "Date, Column 1, Column 2, C3, C4, C5, C6, C7\n 2012-03-07,,69.75,69.75,69.75,0.0,0.0,0.0\n2012-03-06,69.75,69.75,69.75,69.75,0.0,0.0,0.0\n2012-03-05,69.75,69.75,69.75,69.75,0.0,0.0,0.0\n2012-03-04,69.75,69.75,69.75,69.75,0.0,0.0,0.0\n2012-02-29,,69.75,69.75,69.75,0.0,0.0,0.0\n2012-02-28,69.75,69.75,69.75,69.75,0.0,0.0,0.0\n" }
|
71
|
+
let(:invalid2){ "2012-03-07,,69.75,69.75,69.75,0.0,0.0,0.0\nDate, Column 1, Column 2, C3, C4, C5, C6, C7\n2012-03-06,69.75,69.75,69.75,69.75,0.0,0.0,0.0\n2012-03-05,69.75,69.75,69.75,69.75,0.0,0.0,0.0\n2012-03-04,69.75,69.75,69.75,69.75,0.0,0.0,0.0\n2012-02-29,,69.75,69.75,69.75,0.0,0.0,0.0\n2012-02-28,69.75,69.75,69.75,69.75,0.0,0.0,0.0\n" }
|
72
|
+
|
73
|
+
[:invalid1, :invalid2].each do |type|
|
74
|
+
it "#{type} should raise Quandl::Errors::UnknownDateFormat" do
|
75
|
+
expect { Quandl::Data::Format.parse( self.send(type) ) }.to raise_error Quandl::Errors::UnknownDateFormat
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
@@ -54,12 +54,12 @@ describe Quandl::Data::Operations do
|
|
54
54
|
subject.transform(:rdiff).first[1].should_not eq value
|
55
55
|
end
|
56
56
|
it "should rdiff_from" do
|
57
|
-
data = Quandl::Data.new
|
58
|
-
data.transform(:rdiff_from).
|
57
|
+
data = Quandl::Data.new [["2013-11-27", 3.0, 5.0], ["2013-11-28", 5.0, 4.0], ["2013-11-29", 15.0, 20.0]]
|
58
|
+
data.transform(:rdiff_from).to_date_str.should eq [["2013-11-27", 4.0, 3.0], ["2013-11-28", 2.0, 4.0], ["2013-11-29", 0.0, 0.0]]
|
59
59
|
end
|
60
60
|
it "should cumul" do
|
61
|
-
data = Quandl::Data.new
|
62
|
-
data.transform(:cumul).
|
61
|
+
data = Quandl::Data.new [["2013-11-27", 10.0], ["2013-11-28", 20.0], ["2013-11-29", 30.0]]
|
62
|
+
data.transform(:cumul).to_date_str.should eq [["2013-11-27", 10.0], ["2013-11-28", 30.0], ["2013-11-29", 60.0]]
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
@@ -10,6 +10,16 @@ describe Quandl::Data do
|
|
10
10
|
let(:data){ Quandl::Data.new(csv2) }
|
11
11
|
subject{ data }
|
12
12
|
|
13
|
+
describe "#headers" do
|
14
|
+
subject{ Quandl::Data.new(csv3) }
|
15
|
+
let(:expectation){ ['Date', 'Column 1', 'Column 2', 'C3', 'C4', 'C5', 'C6', 'C7'] }
|
16
|
+
its(:headers){ should eq expectation }
|
17
|
+
|
18
|
+
its('clone.headers'){ should eq expectation }
|
19
|
+
its('to_jd.headers'){ should eq expectation }
|
20
|
+
|
21
|
+
end
|
22
|
+
|
13
23
|
describe "#clone" do
|
14
24
|
subject{ data.clone }
|
15
25
|
it{ should be_a Quandl::Data }
|
@@ -34,10 +44,6 @@ describe Quandl::Data do
|
|
34
44
|
end
|
35
45
|
|
36
46
|
end
|
37
|
-
|
38
|
-
it "csv3 should raise Quandl::Operation::Errors::UnknownDateFormat" do
|
39
|
-
expect { Quandl::Data.new( csv3 ).to_jd }.to raise_error Quandl::Operation::Errors::UnknownDateFormat
|
40
|
-
end
|
41
47
|
end
|
42
48
|
|
43
49
|
[:to_jd, :sort_ascending, :sort_descending, :to_date_str].each do |o1|
|
metadata
CHANGED
@@ -1,15 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: quandl_data
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Blake Hilscher
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-12-
|
11
|
+
date: 2013-12-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: quandl_operation
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.3.1
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.3.1
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: quandl_babelfish
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.0'
|
13
41
|
- !ruby/object:Gem::Dependency
|
14
42
|
name: rake
|
15
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -108,34 +136,6 @@ dependencies:
|
|
108
136
|
- - '>='
|
109
137
|
- !ruby/object:Gem::Version
|
110
138
|
version: '0'
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: activesupport
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - '>='
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: 3.0.0
|
118
|
-
type: :runtime
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
requirements:
|
122
|
-
- - '>='
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
version: 3.0.0
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
|
-
name: quandl_operation
|
127
|
-
requirement: !ruby/object:Gem::Requirement
|
128
|
-
requirements:
|
129
|
-
- - ~>
|
130
|
-
- !ruby/object:Gem::Version
|
131
|
-
version: '0.2'
|
132
|
-
type: :runtime
|
133
|
-
prerelease: false
|
134
|
-
version_requirements: !ruby/object:Gem::Requirement
|
135
|
-
requirements:
|
136
|
-
- - ~>
|
137
|
-
- !ruby/object:Gem::Version
|
138
|
-
version: '0.2'
|
139
139
|
description: Data will be interfaced
|
140
140
|
email:
|
141
141
|
- blake@hilscher.ca
|
@@ -154,15 +154,19 @@ files:
|
|
154
154
|
- Rakefile
|
155
155
|
- UPGRADE.md
|
156
156
|
- lib/quandl/data.rb
|
157
|
+
- lib/quandl/data/babelfisher.rb
|
157
158
|
- lib/quandl/data/enumerator.rb
|
159
|
+
- lib/quandl/data/format.rb
|
158
160
|
- lib/quandl/data/logging.rb
|
159
161
|
- lib/quandl/data/operations.rb
|
160
162
|
- lib/quandl/data/version.rb
|
163
|
+
- lib/quandl/errors/unknown_date_format.rb
|
161
164
|
- lib/quandl/fabricate.rb
|
162
165
|
- lib/quandl/fabricate/data.rb
|
163
166
|
- quandl_data.gemspec
|
164
167
|
- spec/lib/fabricate/data_spec.rb
|
165
168
|
- spec/lib/quandl/data/enumerator_spec.rb
|
169
|
+
- spec/lib/quandl/data/format_spec.rb
|
166
170
|
- spec/lib/quandl/data/operations_spec.rb
|
167
171
|
- spec/lib/quandl/data_spec.rb
|
168
172
|
- spec/spec_helper.rb
|
@@ -193,6 +197,7 @@ summary: For interfacing with data
|
|
193
197
|
test_files:
|
194
198
|
- spec/lib/fabricate/data_spec.rb
|
195
199
|
- spec/lib/quandl/data/enumerator_spec.rb
|
200
|
+
- spec/lib/quandl/data/format_spec.rb
|
196
201
|
- spec/lib/quandl/data/operations_spec.rb
|
197
202
|
- spec/lib/quandl/data_spec.rb
|
198
203
|
- spec/spec_helper.rb
|