Class: Quandl::Operation::Collapse

Inherits:
Object
  • Object
show all
Defined in:
lib/quandl/operation/collapse.rb,
lib/quandl/operation/collapse/guess.rb

Defined Under Namespace

Classes: Guess

Class Method Summary collapse

Class Method Details

.collapse(data, frequency) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/quandl/operation/collapse.rb', line 36

def collapse(data, frequency)
  return data unless valid_collapse?( frequency )
  # store the new collapsed data
  collapsed_data = {}
  range = find_end_of_range( data[0][0], frequency )
  # iterate over the data
  data.each do |row|
    # grab date and value
    date, value = row[0], row[1..-1]
    value = value.first if value.count == 1
    # bump to the next range if it exceeds the current one
    range = find_end_of_range(date, frequency) unless inside_range?(date, range)
    # consider the value for the next range
    collapsed_data[range] = value if inside_range?(date, range) && value.present?
  end
  to_table(collapsed_data)
end

.collapse_and_log(data, frequency) ⇒ Object



17
18
19
20
21
22
# File 'lib/quandl/operation/collapse.rb', line 17

def collapse_and_log(data, frequency)
  t1 = Time.now
  r = collapse(data, frequency)
  Quandl::Logger.debug "#{self.name}.perform(#{data.try(:count)} rows, #{frequency}) (#{t1.elapsed.microseconds}ms)" if t1.elapsed.microseconds > 1
  r
end

.collapses_greater_than(freq) ⇒ Object



64
65
66
67
# File 'lib/quandl/operation/collapse.rb', line 64

def collapses_greater_than(freq)
  index = valid_collapses.index(freq.to_sym)
  index.present? ? valid_collapses.slice( index + 1, valid_collapses.count ) : []
end

.collapses_greater_than_or_equal_to(freq) ⇒ Object



69
70
71
# File 'lib/quandl/operation/collapse.rb', line 69

def collapses_greater_than_or_equal_to(freq)
  valid_collapses.slice( valid_collapses.index(freq.to_sym), valid_collapses.count )
end

.find_end_of_range(date, frequency) ⇒ Object



81
82
83
# File 'lib/quandl/operation/collapse.rb', line 81

def find_end_of_range(date, frequency)
  Date.jd(date).end_of_frequency(frequency).jd
end

.frequency?(data) ⇒ Boolean

Returns:

  • (Boolean)


73
74
75
# File 'lib/quandl/operation/collapse.rb', line 73

def frequency?(data)
  Guess.frequency(data)
end

.inside_range?(date, range) ⇒ Boolean

Returns:

  • (Boolean)


77
78
79
# File 'lib/quandl/operation/collapse.rb', line 77

def inside_range?(date, range)
  date <= range
end

.perform(data, frequency) ⇒ Object



11
12
13
14
15
# File 'lib/quandl/operation/collapse.rb', line 11

def perform(data, frequency)
  data = Parse.sort( data )
  data = collapse_and_log(data, frequency)
  data
end

.to_table(data) ⇒ Object



54
55
56
57
58
59
60
61
62
# File 'lib/quandl/operation/collapse.rb', line 54

def to_table(data)
  data.collect do |date, values|
    if values.is_a?(Array)
      values.unshift(date)
    else
      [date, values]
    end
  end
end

.valid?(type) ⇒ Boolean

Returns:

  • (Boolean)


28
29
30
# File 'lib/quandl/operation/collapse.rb', line 28

def valid?(type)
  valid_collapses.include?( type.try(:to_sym) )
end

.valid_collapse?(type) ⇒ Boolean

Returns:

  • (Boolean)


24
25
26
# File 'lib/quandl/operation/collapse.rb', line 24

def valid_collapse?(type)
  valid?(type)
end

.valid_collapsesObject



32
33
34
# File 'lib/quandl/operation/collapse.rb', line 32

def valid_collapses
  [ :daily, :weekly, :monthly, :quarterly, :annual ]
end