Class: Quandl::Data::Format

Inherits:
Object
  • Object
show all
Defined in:
lib/quandl/data/format.rb

Class Method Summary collapse

Class Method Details

.csv_to_array(data) ⇒ Object



21
22
23
24
25
26
27
# File 'lib/quandl/data/format.rb', line 21

def csv_to_array(data)
  if data.is_a?(String)
    data = data.gsub('\n', "\n")
    data = CSV.parse( data )
  end
  data
end

.data_has_rows?(data) ⇒ Boolean

Returns:

  • (Boolean)


174
175
176
# File 'lib/quandl/data/format.rb', line 174

def data_has_rows?(data)
  data.is_a?(Array) && data[0].is_a?(Array) && data[0][0].present?
end

.data_missing_rows?(data) ⇒ Boolean

Returns:

  • (Boolean)


170
171
172
# File 'lib/quandl/data/format.rb', line 170

def data_missing_rows?(data)
  !data_has_rows?(data)
end

.date_format?(data) ⇒ Boolean

Returns:

  • (Boolean)


66
67
68
69
70
71
72
73
74
# File 'lib/quandl/data/format.rb', line 66

def date_format?(data)
  value = data[0][0]
  # julian date?
  return :date          if value.is_a?(Date)
  return :jd            if value.is_a?(Integer)
  return :date_string   if value.is_a?(String) && value =~ /^[0-9]{4}\-[0-9]{2}\-[0-9]{2}$/
  return :jd_string     if value.kind_of?(String) && value.numeric?
  return :unknown
end

.date_strings_to_date(data) ⇒ Object



139
140
141
142
143
144
145
146
147
148
# File 'lib/quandl/data/format.rb', line 139

def date_strings_to_date(data)
  # skip when already formatted correctly
  return data if data_missing_rows?(data) || data[0][0].is_a?(Date)
  # otherwise cast string jds to int
  output = []
  data.each_with_index do |row, index|
    output << parse_date_string(row) rescue raise_date_format_error!( row, index, :date_strings_to_date )
  end
  output
end

.date_strings_to_jd(data) ⇒ Object



112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/quandl/data/format.rb', line 112

def date_strings_to_jd(data)
  # skip when already formatted correctly
  return data if data_missing_rows?(data) || data[0][0].is_a?(Date)
  # otherwise cast string jds to int
  output = []
  data.each_with_index do |row, index|
    row = parse_date_string(row) rescue raise_date_format_error!( row, index, :date_strings_to_jd )
    row[0] = row[0].jd
    output << row
  end
  output
end

.dates_to_jd(data) ⇒ Object



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/quandl/data/format.rb', line 76

def dates_to_jd(data)
  return data if data_missing_rows?(data) || data[0][0].is_a?(Integer)
  # dont alter by reference
  result = []
  # for each row
  data.each_with_index do |row, index|
    # copy
    row = row.dup
    # string to date
    date = row[0]
    date = Date.parse(row[0]) if row[0].is_a?(String)
    # date to julian
    row[0] = date.jd if date.respond_to?(:jd)
    # save result
    result[index] = row
  end
  # all done
  result
end

.hash_to_array(data) ⇒ Object



16
17
18
19
# File 'lib/quandl/data/format.rb', line 16

def hash_to_array(data)
  data = data.collect{|k,v| [k] + v } if data.kind_of?(Hash)
  data
end

.jd_strings_to_jd(data) ⇒ Object

DATES TO JULIAN #



101
102
103
104
105
106
107
108
109
110
# File 'lib/quandl/data/format.rb', line 101

def jd_strings_to_jd(data)
  # skip when already formatted correctly
  return data if data_missing_rows?(data) || data[0][0].is_a?(Integer)
  # otherwise cast string jds to int
  output = []
  data.each_with_index do |row, index|
    output << parse_jd_string(row) rescue raise_date_format_error!( row, index, :jd_strings_to_jd )
  end
  output
end

.jds_to_date(data) ⇒ Object

DATES TO DATE #



130
131
132
133
134
135
136
137
# File 'lib/quandl/data/format.rb', line 130

def jds_to_date(data)
  return data if data_missing_rows?(data) || data[0][0].is_a?(Date)
  output = []
  data.each_with_index do |row, index|
    output << parse_jd(row) rescue raise_date_format_error!( row, index, :jds_to_date )
  end
  output
end

.parse(data) ⇒ Object



7
8
9
10
11
12
13
14
# File 'lib/quandl/data/format.rb', line 7

def parse(data)
  return [] if data.blank?
  data = hash_to_array(data)
  data = csv_to_array(data)
  data = values_to_float(data)
  data = to_date(data)
  data.dup
end

.parse_date_string(row) ⇒ Object (protected)



198
199
200
201
202
203
204
205
206
207
208
209
# File 'lib/quandl/data/format.rb', line 198

def parse_date_string(row)
  row = row.dup
  # extract date
  date = row[0]
  # split date into parts
  date_values = date.split('-').collect(&:to_i)
  # ensure date is valid
  raise Quandl::Error::UnknownDateFormat unless date_values.count == 3
  # add to row
  row[0] = Date.new( *date_values )
  row
end

.parse_jd(row) ⇒ Object (protected)



181
182
183
184
185
186
187
188
# File 'lib/quandl/data/format.rb', line 181

def parse_jd(row)
  # parse jd_string
  row = parse_jd_string(row)
  # jd to date
  row[0] = Date.jd( row[0] )
  # onwards
  row
end

.parse_jd_string(row) ⇒ Object (protected)



190
191
192
193
194
195
196
# File 'lib/quandl/data/format.rb', line 190

def parse_jd_string(row)
  row = row.dup
  row[0] = row[0].to_i
  # dont allow dates that are before 0000
  raise Quandl::Error::UnknownDateFormat if row[0] <= 1721058
  row
end

.recognized_date?(value) ⇒ Boolean

Returns:

  • (Boolean)


60
61
62
63
64
# File 'lib/quandl/data/format.rb', line 60

def recognized_date?( value )
  return true if value.is_a?(Date)
  return true if value.is_a?(String) && value =~ /^[0-9]{4}\-[0-9]{2}\-[0-9]{2}$/
  false
end

.to_date(data) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/quandl/data/format.rb', line 29

def to_date(data)
  return data if data_missing_rows?(data)
  # guess the current date format
  format = date_format?(data)
  # convert dates to Date
  case format
  when :date            then return data
  when :date_string     then return date_strings_to_date( data )
  when :jd, :jd_string  then return jds_to_date( data )
  when :unknown         then raise_date_format_error!( data[0] )
  end
  # return data
  data
end

.to_jd(data) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/quandl/data/format.rb', line 44

def to_jd(data)
  return data if data_missing_rows?(data)
  # guess the current date format
  format = date_format?(data)
  # convert dates to Date
  case format
  when :jd          then return data
  when :jd_string   then return jd_strings_to_jd( data )
  when :date        then return dates_to_jd( data )
  when :date_string then return date_strings_to_jd( data )
  when :unknown     then raise_date_format_error!( data[0] )
  end
  # return data
  data
end

.values_to_float(data) ⇒ Object

VALUES TO FLOAT #



155
156
157
158
159
160
161
162
163
164
165
166
167
# File 'lib/quandl/data/format.rb', line 155

def values_to_float(data)
  # skip unless value is a string
  return data if data_missing_rows?(data) || data[0][1].is_a?(Float)
  # cast values to float
  data.collect do |row|
    new_row = [row[0]]
    row[1..-1].each_with_index do |value, index|
      value = value.to_f if value.is_a?(String)
      new_row[index + 1] = value
    end
    new_row
  end
end