Class: Quandl::Operation::Parse

Inherits:
Object
  • Object
show all
Defined in:
lib/quandl/operation/parse.rb

Class Method Summary collapse

Class Method Details

.csv(data) ⇒ Object



20
21
22
23
24
# File 'lib/quandl/operation/parse.rb', line 20

def csv(data)
  data = CSV.parse( data ) if data.is_a?(String)
  data = values_to_float(data)
  data
end

.data_has_rows?(data) ⇒ Boolean

Returns:

  • (Boolean)


119
120
121
# File 'lib/quandl/operation/parse.rb', line 119

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)


115
116
117
# File 'lib/quandl/operation/parse.rb', line 115

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

.date_to_julian(data) ⇒ Object



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/quandl/operation/parse.rb', line 57

def date_to_julian(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
    nrow = row.dup
    # string to date
    date = nrow[0]
    date = Date.parse(nrow[0]) if nrow[0].is_a?(String)
    # date to julian
    nrow[0] = date.jd if date.respond_to?(:jd)
    # save result
    result[index] = nrow
  end
  # all done
  result
end

.julian_string_to_integer(data) ⇒ Object



94
95
96
97
98
99
# File 'lib/quandl/operation/parse.rb', line 94

def julian_string_to_integer(data)
  # skip when already formatted correctly
  return data if data_missing_rows?(data) || data[0][0].is_a?(Integer) || data[0][0].is_a?(Date)
  # otherwise cast string jds to int
  data.collect{|r| r[0] = r[0].to_i; r  }
end

.julian_to_date(data) ⇒ Object



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/quandl/operation/parse.rb', line 77

def julian_to_date(data)
  return data if data_missing_rows?(data) || data[0][0].is_a?(Date)
  # dont alter by reference
  result = []
  # for each row
  data.each_with_index do |row, index|
    # copy
    nrow = row.dup
    # parse date
    nrow[0] = Date.jd( nrow[0].to_i ) unless nrow[0].is_a?(Date)
    # save result
    result[index] = nrow
  end
  # all done
  result
end

.perform(data) ⇒ Object



10
11
12
13
14
15
16
17
18
# File 'lib/quandl/operation/parse.rb', line 10

def perform(data)
  return [] if data.blank?
  t1 = Time.now
  data = csv(data)
  data = unknown_date_format_to_julian(data)
  # data = sort(data)
  Quandl::Logger.debug "#{self.name}.perform (#{t1.elapsed.microseconds}ms)" if t1.elapsed.microseconds > 1
  data
end

.sort(data, order = :asc) ⇒ Object



26
27
28
29
30
31
32
33
# File 'lib/quandl/operation/parse.rb', line 26

def sort(data, order = :asc)
  # ascending
  case order
  when :asc   then data = sort_asc(data)
  when :desc  then data = sort_desc(data)
  end
  data
end

.sort_asc(data) ⇒ Object



40
41
42
# File 'lib/quandl/operation/parse.rb', line 40

def sort_asc(data)
  data.sort_by{|r| r[0] }
end

.sort_desc(data) ⇒ Object



44
45
46
# File 'lib/quandl/operation/parse.rb', line 44

def sort_desc(data)
  data.sort_by{|r| r[0] }.reverse
end

.sort_order?(data) ⇒ Boolean

Returns:

  • (Boolean)


35
36
37
38
# File 'lib/quandl/operation/parse.rb', line 35

def sort_order?(data)
  return :none if data.blank? || data[0].blank? || data[1].blank?
  data[0][0] > data[1][0] ? :desc : :asc
end

.unknown_date_format_to_julian(data) ⇒ Object



48
49
50
51
52
53
54
55
# File 'lib/quandl/operation/parse.rb', line 48

def unknown_date_format_to_julian(data)
  return data if data_missing_rows?(data)
  date = data[0][0]
  # formatted like: "2013-06-18"
  return date_to_julian(data) if date.is_a?(String) && date =~ /[0-9]{4}-[0-9]{2}-[0-9]{2}/
  # formatted like: "2456463"
  return julian_string_to_integer(data)
end

.values_to_float(data) ⇒ Object



101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/quandl/operation/parse.rb', line 101

def values_to_float(data)
  # skip unless value is a string
  return data if data_missing_rows?(data) || !data[0][1].is_a?(String)
  # 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