quandl_operation 0.1.11 → 0.1.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/UPGRADE.md +5 -0
- data/lib/quandl/operation/collapse.rb +38 -3
- data/lib/quandl/operation/version.rb +1 -1
- data/quandl_operation.gemspec +2 -0
- data/spec/lib/quandl/operation/collapse_spec.rb +64 -0
- data/spec/spec_helper.rb +2 -1
- metadata +34 -2
data/UPGRADE.md
CHANGED
@@ -9,8 +9,15 @@ class Collapse
|
|
9
9
|
class << self
|
10
10
|
|
11
11
|
def perform(data, frequency)
|
12
|
-
|
12
|
+
# source order
|
13
|
+
order = Parse.sort_order?(data)
|
14
|
+
# operations expect data in ascending order
|
15
|
+
data = Parse.sort( data, :asc )
|
16
|
+
# collapse
|
13
17
|
data = collapse_and_log(data, frequency)
|
18
|
+
# return to original order
|
19
|
+
data = Parse.sort( data, :desc ) if order == :desc
|
20
|
+
# onwards
|
14
21
|
data
|
15
22
|
end
|
16
23
|
|
@@ -40,13 +47,18 @@ class Collapse
|
|
40
47
|
range = find_end_of_range( data[0][0], frequency )
|
41
48
|
# iterate over the data
|
42
49
|
data.each do |row|
|
43
|
-
# grab date and
|
50
|
+
# grab date and values
|
44
51
|
date, value = row[0], row[1..-1]
|
45
52
|
value = value.first if value.count == 1
|
46
53
|
# bump to the next range if it exceeds the current one
|
47
54
|
range = find_end_of_range(date, frequency) unless inside_range?(date, range)
|
48
55
|
# consider the value for the next range
|
49
|
-
|
56
|
+
if inside_range?(date, range) && value.present?
|
57
|
+
# merge this and previous row if nils are present
|
58
|
+
value = merge_row_values( value, collapsed_data[range] ) unless collapsed_data[range].nil?
|
59
|
+
# assign value
|
60
|
+
collapsed_data[range] = value
|
61
|
+
end
|
50
62
|
end
|
51
63
|
to_table(collapsed_data)
|
52
64
|
end
|
@@ -61,6 +73,17 @@ class Collapse
|
|
61
73
|
end
|
62
74
|
end
|
63
75
|
|
76
|
+
def merge_row_values(top_row, bottom_row)
|
77
|
+
# merge previous values when nils are present
|
78
|
+
if top_row.is_a?(Array) && top_row.include?(nil)
|
79
|
+
# find nil indexes
|
80
|
+
indexes = find_each_index(top_row, nil)
|
81
|
+
# merge nils with previous values
|
82
|
+
indexes.each{|index| top_row[index] = bottom_row[index] }
|
83
|
+
end
|
84
|
+
top_row
|
85
|
+
end
|
86
|
+
|
64
87
|
def collapses_greater_than(freq)
|
65
88
|
index = valid_collapses.index(freq.to_sym)
|
66
89
|
index.present? ? valid_collapses.slice( index + 1, valid_collapses.count ) : []
|
@@ -82,6 +105,18 @@ class Collapse
|
|
82
105
|
Date.jd(date).end_of_frequency(frequency).jd
|
83
106
|
end
|
84
107
|
|
108
|
+
def find_each_index(array, find)
|
109
|
+
found, index, q = -1, -1, []
|
110
|
+
while found
|
111
|
+
found = array[index+1..-1].index(find)
|
112
|
+
if found
|
113
|
+
index = index + found + 1
|
114
|
+
q << index
|
115
|
+
end
|
116
|
+
end
|
117
|
+
q
|
118
|
+
end
|
119
|
+
|
85
120
|
end
|
86
121
|
|
87
122
|
end
|
data/quandl_operation.gemspec
CHANGED
@@ -20,6 +20,8 @@ Gem::Specification.new do |s|
|
|
20
20
|
s.add_development_dependency "rake", "~> 10.0"
|
21
21
|
s.add_development_dependency "rspec", "~> 2.13"
|
22
22
|
s.add_development_dependency "fivemat", "~> 1.2"
|
23
|
+
s.add_development_dependency "pry"
|
24
|
+
s.add_development_dependency "quandl_data"
|
23
25
|
|
24
26
|
s.add_runtime_dependency "activesupport", ">= 3.0.0"
|
25
27
|
|
@@ -35,4 +35,68 @@ describe Quandl::Operation::Collapse do
|
|
35
35
|
subject.collapses_greater_than_or_equal_to(:annual).should eq [:annual]
|
36
36
|
end
|
37
37
|
|
38
|
+
def table_range(from, to, columns = 1)
|
39
|
+
days = to - from
|
40
|
+
r = days.times.collect do |i|
|
41
|
+
[ from + i ] + columns.times.collect{(rand(1000) * 0.7) + i}
|
42
|
+
end
|
43
|
+
r
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "#perform" do
|
47
|
+
|
48
|
+
let(:data){
|
49
|
+
[[2456537, 56.2, nil, nil],
|
50
|
+
[2456518, 55.7, nil, nil], [2456506, nil, 136133.0, nil],
|
51
|
+
[2456487, 55.4, nil, nil], [2456475, nil, 135964.0, nil],
|
52
|
+
[2456457, 50.9, nil, nil], [2456445, nil, 135860.0, nil]]
|
53
|
+
}
|
54
|
+
|
55
|
+
it "should collapse data with nils" do
|
56
|
+
subject.perform(data, :monthly).should eq [
|
57
|
+
[2456566, 56.2, nil, nil],
|
58
|
+
[2456536, 55.7, 136133.0, nil],
|
59
|
+
[2456505, 55.4, 135964.0, nil],
|
60
|
+
[2456474, 50.9, 135860.0, nil]]
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "#collapse" do
|
66
|
+
|
67
|
+
it 'should handle data sets with one data point only' do
|
68
|
+
|
69
|
+
data = [[ 2455875, 42 ]]
|
70
|
+
subject.collapse( data, :daily).should eq [[2455875, 42]]
|
71
|
+
subject.collapse( data, :weekly).should eq [[2455879, 42]]
|
72
|
+
subject.collapse( data, :monthly).should eq [[2455896, 42]]
|
73
|
+
subject.collapse( data, :quarterly).should eq [[2455927, 42]]
|
74
|
+
subject.collapse( data, :annual).should eq [[2455927, 42]]
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'should handle data sets with only two data points, 1 day apart' do
|
79
|
+
|
80
|
+
data = [[ Date.parse('2011-11-09').jd, 20111109 ],[ Date.parse('2011-11-10').jd, 20111110 ]]
|
81
|
+
|
82
|
+
subject.collapse(data, :daily).should eq data
|
83
|
+
subject.collapse(data, :weekly).should eq [[ 2455879, 20111110 ]]
|
84
|
+
subject.collapse(data, :monthly).should eq [[ 2455896, 20111110 ]]
|
85
|
+
subject.collapse(data, :quarterly).should eq [[ 2455927, 20111110 ]]
|
86
|
+
subject.collapse(data, :annual).should eq [[ 2455927, 20111110 ]]
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'should handle data sets one year of daily data' do
|
91
|
+
data = table_range Date.parse('Jan 1, 2011').jd, Date.parse('Dec 31, 2011').jd, 2
|
92
|
+
data.count.should eq 364
|
93
|
+
subject.collapse( data, :daily ).count.should eq 364
|
94
|
+
subject.collapse( data, :weekly ).count.should eq 53
|
95
|
+
subject.collapse( data, :monthly ).count.should eq 12
|
96
|
+
subject.collapse( data, :quarterly ).count.should eq 4
|
97
|
+
subject.collapse( data, :annual ).count.should eq 1
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
|
38
102
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: quandl_operation
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.12
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-10-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -59,6 +59,38 @@ dependencies:
|
|
59
59
|
- - ~>
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '1.2'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: pry
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: quandl_data
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
62
94
|
- !ruby/object:Gem::Dependency
|
63
95
|
name: activesupport
|
64
96
|
requirement: !ruby/object:Gem::Requirement
|