quandl_data 1.2.1 → 1.3.0
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/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
|