Class: Quandl::Operation::Collapse
- Inherits:
-
Object
- Object
- Quandl::Operation::Collapse
- Defined in:
- lib/quandl/operation/collapse.rb,
lib/quandl/operation/collapse/guess.rb
Defined Under Namespace
Classes: Guess
Class Method Summary collapse
- .collapse(data, frequency) ⇒ Object
- .collapse_and_log(data, frequency) ⇒ Object
- .collapses_greater_than(freq) ⇒ Object
- .collapses_greater_than_or_equal_to(freq) ⇒ Object
- .find_end_of_range(date, frequency) ⇒ Object
- .frequency?(data) ⇒ Boolean
- .inside_range?(date, range) ⇒ Boolean
- .perform(data, frequency) ⇒ Object
- .to_table(data) ⇒ Object
- .valid?(type) ⇒ Boolean
- .valid_collapse?(type) ⇒ Boolean
- .valid_collapses ⇒ Object
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
73 74 75 |
# File 'lib/quandl/operation/collapse.rb', line 73 def frequency?(data) Guess.frequency(data) end |
.inside_range?(date, range) ⇒ 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
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
24 25 26 |
# File 'lib/quandl/operation/collapse.rb', line 24 def valid_collapse?(type) valid?(type) end |
.valid_collapses ⇒ Object
32 33 34 |
# File 'lib/quandl/operation/collapse.rb', line 32 def valid_collapses [ :daily, :weekly, :monthly, :quarterly, :annual ] end |