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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ca5bc03c4ec953809ecabafb2e637410965b1404
4
- data.tar.gz: 6e44598ca8bc5256d7a002c7f84bde9e6de5c0ba
3
+ metadata.gz: e811fb881ccd062b98502cddce1c7a27d5f53ac2
4
+ data.tar.gz: 5f84494fdae5960ebb598c032da19cf9ce342b3d
5
5
  SHA512:
6
- metadata.gz: 2bc2f15ee8b8a799b0dc95fb6d5be8e4b4aa98aad1e2532cf59aea3d298a3c0d82a6470703cde24dc42b36eac3ccbcbaf053062720cd3012088efb964d731986
7
- data.tar.gz: e654676035a82af7479e53cd706d8f4f0d2a93275beb58d79ae1bbc7adbc11ca2915c5a79c825ede14690122afb57004acc99ba0eeceb4fec451276eeb50686a
6
+ metadata.gz: 514a0425af0aa3af800bb8a0c2f06299bc9a2bce9b825cccc57ad84cd8469107d2da25a5a4be4900bcf6c4d78958edb34a5d496d528467f64489a8f5e8e9d8ac
7
+ data.tar.gz: 91ff9683ef3c984c2e7e679178b04848699ede82b7e54b6f36b883d19823697888258d2f9b67fdf2803e72bfbda6ec88c7eab526c39346c6f631321059866f42
data/Gemfile CHANGED
@@ -6,4 +6,5 @@ local_gem_dir = ENV['BUNDLE_LOCAL_DIR']
6
6
 
7
7
  if use_local_gems
8
8
  gem 'quandl_operation', path: "#{local_gem_dir}/quandl/operation"
9
+ gem 'quandl_babelfish', path: "#{local_gem_dir}/quandl/babelfish"
9
10
  end
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 ||= parse( pristine_data )
18
+ @data_array ||= clean( pristine_data )
19
19
  end
20
20
 
21
21
  def data_array=(data)
22
- @data_array = parse(data)
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::Data::Operations
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 = Parse.to_jd( data_array ); self
42
+ @data_array = Quandl::Data::Format.to_jd( data_array ); self
35
43
  end
36
44
 
37
45
  def to_date!
38
- @data_array = Parse.to_date( data_array ); self
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 = Parse.sort_asc( data_array ); self
84
+ @data_array = Quandl::Operation::Sort.asc( data_array ); self
77
85
  end
78
86
 
79
87
  def sort_descending!
80
- @data_array = Parse.sort_desc( data_array ); self
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
- Quandl::Data.new( data_array.dup )
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
@@ -1,5 +1,5 @@
1
1
  module Quandl
2
2
  class Data
3
- VERSION = "1.2.1"
3
+ VERSION = "1.3.0"
4
4
  end
5
5
  end
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
- class Quandl::Data
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
@@ -0,0 +1,5 @@
1
+ module Quandl
2
+ module Errors
3
+ class UnknownDateFormat < StandardError; end
4
+ end
5
+ 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
@@ -31,7 +31,7 @@ describe Quandl::Data::Enumerator do
31
31
 
32
32
  its('to_jd.first.first'){ should be_a Integer }
33
33
  its('to_date.first.first'){ should be_a Date }
34
-
34
+
35
35
  end
36
36
 
37
37
  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([[2456624,3,5],[2456625,5,4],[2456626,15,20]])
58
- data.transform(:rdiff_from).to_jd.should eq [[2456624,4,3],[2456625,2,4],[2456626,0,0]]
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( [[2456624, 10], [2456625, 20], [2456626, 30]] )
62
- data.transform(:cumul).to_jd.should eq [[2456624, 10], [2456625, 30], [2456626, 60]]
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.2.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-04 00:00:00.000000000 Z
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