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, {col_sep: guess_csv_delimiter(data) } )
  end
  data
end

.data_has_rows?(data) ⇒ Boolean

Returns:

  • (Boolean)


182
183
184
# File 'lib/quandl/data/format.rb', line 182

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)


178
179
180
# File 'lib/quandl/data/format.rb', line 178

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

.date_format?(data) ⇒ Boolean

Returns:

  • (Boolean)


74
75
76
77
78
79
80
81
82
# File 'lib/quandl/data/format.rb', line 74

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



147
148
149
150
151
152
153
154
155
156
# File 'lib/quandl/data/format.rb', line 147

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, index)
  end
  output
end

.date_strings_to_jd(data) ⇒ Object



120
121
122
123
124
125
126
127
128
129
130
131
# File 'lib/quandl/data/format.rb', line 120

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, index)
    row[0] = row[0].jd
    output << row
  end
  output
end

.dates_to_jd(data) ⇒ Object



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/quandl/data/format.rb', line 84

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

.guess_csv_delimiter(data) ⇒ Object



29
30
31
32
33
34
35
# File 'lib/quandl/data/format.rb', line 29

def guess_csv_delimiter(data)
  data = data.to_s
  line_end = data.to_s.index("\n")
  first_line = line_end.nil? ? data : data[0..line_end].to_s
  return "\t" unless first_line.index("\t").nil?
  ","
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 #



109
110
111
112
113
114
115
116
117
118
# File 'lib/quandl/data/format.rb', line 109

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, index)
  end
  output
end

.jds_to_date(data) ⇒ Object

DATES TO DATE #



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

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, index)
  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, index = nil) ⇒ Object (protected)



211
212
213
214
215
216
217
218
219
220
221
222
223
224
# File 'lib/quandl/data/format.rb', line 211

def parse_date_string(row, index=nil)
  row = row.dup
  # extract date
  date = row[0]
  # split date into parts
  date_values = date.split('-').collect(&:to_i)
  # ensure valid
  raise unless date_values.count == 3
  # add to row
  row[0] = Date.new( *date_values )
  row
rescue => e
  raise_date_string_error!(row, index, e)
end

.parse_jd(row, index = nil) ⇒ Object (protected)



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

def parse_jd(row, index=nil)
  # parse jd_string
  row = parse_jd_string(row, index)
  # jd to date
  row[0] = Date.jd( row[0] )
  # onwards
  row
rescue => e
  raise_jd_error!(row, index, e)
end

.parse_jd_string(row, index = nil) ⇒ Object (protected)



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

def parse_jd_string(row, index=nil)
  row = row.dup
  row[0] = row[0].to_i
  # dont allow dates that are before 0000
  raise if row[0] <= 1721058
  # onwards
  row
rescue => e
  raise_jd_string_error!(row, index, e)
end

.recognized_date?(value) ⇒ Boolean

Returns:

  • (Boolean)


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

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



37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/quandl/data/format.rb', line 37

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_parse_error!( data[0] )
  end
  # return data
  data
end

.to_jd(data) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/quandl/data/format.rb', line 52

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_parse_error!( data[0] )
  end
  # return data
  data
end

.values_to_float(data) ⇒ Object

VALUES TO FLOAT #



163
164
165
166
167
168
169
170
171
172
173
174
175
# File 'lib/quandl/data/format.rb', line 163

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