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