daru 0.1.5 → 0.3
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.
- checksums.yaml +5 -5
- data/.github/ISSUE_TEMPLATE.md +18 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +21 -7
- data/.travis.yml +10 -5
- data/CONTRIBUTING.md +15 -10
- data/History.md +124 -2
- data/README.md +37 -9
- data/ReleasePolicy.md +20 -0
- data/benchmarks/db_loading.rb +34 -0
- data/benchmarks/statistics.rb +6 -6
- data/benchmarks/where_clause.rb +1 -1
- data/benchmarks/where_vs_filter.rb +1 -1
- data/daru.gemspec +17 -41
- data/lib/daru.rb +10 -13
- data/lib/daru/accessors/gsl_wrapper.rb +1 -1
- data/lib/daru/accessors/nmatrix_wrapper.rb +2 -0
- data/lib/daru/category.rb +29 -15
- data/lib/daru/configuration.rb +34 -0
- data/lib/daru/core/group_by.rb +158 -77
- data/lib/daru/core/merge.rb +12 -3
- data/lib/daru/core/query.rb +20 -4
- data/lib/daru/dataframe.rb +692 -118
- data/lib/daru/date_time/index.rb +14 -11
- data/lib/daru/date_time/offsets.rb +9 -1
- data/lib/daru/extensions/which_dsl.rb +55 -0
- data/lib/daru/formatters/table.rb +3 -5
- data/lib/daru/index/categorical_index.rb +4 -4
- data/lib/daru/index/index.rb +131 -42
- data/lib/daru/index/multi_index.rb +118 -10
- data/lib/daru/io/csv/converters.rb +21 -0
- data/lib/daru/io/io.rb +105 -33
- data/lib/daru/io/sql_data_source.rb +10 -0
- data/lib/daru/iruby/templates/dataframe.html.erb +4 -51
- data/lib/daru/iruby/templates/dataframe_mi.html.erb +3 -56
- data/lib/daru/iruby/templates/dataframe_mi_tbody.html.erb +35 -0
- data/lib/daru/iruby/templates/dataframe_mi_thead.html.erb +21 -0
- data/lib/daru/iruby/templates/dataframe_tbody.html.erb +28 -0
- data/lib/daru/iruby/templates/dataframe_thead.html.erb +21 -0
- data/lib/daru/iruby/templates/vector.html.erb +3 -25
- data/lib/daru/iruby/templates/vector_mi.html.erb +3 -34
- data/lib/daru/iruby/templates/vector_mi_tbody.html.erb +26 -0
- data/lib/daru/iruby/templates/vector_mi_thead.html.erb +8 -0
- data/lib/daru/iruby/templates/vector_tbody.html.erb +17 -0
- data/lib/daru/iruby/templates/vector_thead.html.erb +8 -0
- data/lib/daru/maths/arithmetic/vector.rb +38 -2
- data/lib/daru/maths/statistics/dataframe.rb +28 -30
- data/lib/daru/maths/statistics/vector.rb +295 -41
- data/lib/daru/plotting/gruff/dataframe.rb +13 -15
- data/lib/daru/plotting/nyaplot/category.rb +1 -1
- data/lib/daru/plotting/nyaplot/dataframe.rb +15 -4
- data/lib/daru/plotting/nyaplot/vector.rb +1 -2
- data/lib/daru/vector.rb +308 -96
- data/lib/daru/version.rb +1 -1
- data/profile/vector_new.rb +9 -0
- data/spec/accessors/gsl_wrapper_spec.rb +38 -35
- data/spec/accessors/nmatrix_wrapper_spec.rb +25 -22
- data/spec/category_spec.rb +24 -20
- data/spec/core/group_by_spec.rb +238 -4
- data/spec/core/merge_spec.rb +1 -1
- data/spec/core/query_spec.rb +65 -50
- data/spec/daru_spec.rb +22 -0
- data/spec/dataframe_spec.rb +473 -16
- data/spec/date_time/date_time_index_helper_spec.rb +72 -0
- data/spec/date_time/index_spec.rb +34 -16
- data/spec/date_time/offsets_spec.rb +14 -0
- data/spec/extensions/rserve_spec.rb +1 -1
- data/spec/extensions/which_dsl_spec.rb +38 -0
- data/spec/fixtures/boolean_converter_test.csv +5 -0
- data/spec/fixtures/duplicates.csv +32 -0
- data/spec/fixtures/eciresults.html +394 -0
- data/spec/fixtures/empty_rows_test.csv +17 -0
- data/spec/fixtures/macau.html +3691 -0
- data/spec/fixtures/macd_data.csv +150 -0
- data/spec/fixtures/matrix_test.csv +55 -55
- data/spec/fixtures/moneycontrol.html +6812 -0
- data/spec/fixtures/string_converter_test.csv +5 -0
- data/spec/fixtures/test_xls.xls +0 -0
- data/spec/fixtures/test_xls_2.xls +0 -0
- data/spec/fixtures/url_test.txt~ +0 -0
- data/spec/fixtures/valid_markup.html +62 -0
- data/spec/fixtures/wiki_climate.html +1243 -0
- data/spec/fixtures/wiki_table_info.html +631 -0
- data/spec/formatters/table_formatter_spec.rb +29 -0
- data/spec/index/categorical_index_spec.rb +33 -33
- data/spec/index/index_spec.rb +160 -41
- data/spec/index/multi_index_spec.rb +143 -33
- data/spec/io/io_spec.rb +246 -2
- data/spec/io/sql_data_source_spec.rb +31 -41
- data/spec/iruby/dataframe_spec.rb +17 -19
- data/spec/iruby/vector_spec.rb +26 -28
- data/spec/maths/arithmetic/dataframe_spec.rb +1 -1
- data/spec/maths/arithmetic/vector_spec.rb +18 -0
- data/spec/maths/statistics/vector_spec.rb +153 -15
- data/spec/plotting/gruff/category_spec.rb +3 -3
- data/spec/plotting/gruff/dataframe_spec.rb +14 -4
- data/spec/plotting/gruff/vector_spec.rb +9 -9
- data/spec/plotting/nyaplot/category_spec.rb +5 -9
- data/spec/plotting/nyaplot/dataframe_spec.rb +95 -47
- data/spec/plotting/nyaplot/vector_spec.rb +5 -11
- data/spec/shared/vector_display_spec.rb +12 -14
- data/spec/spec_helper.rb +30 -7
- data/spec/support/matchers.rb +5 -0
- data/spec/vector_spec.rb +306 -72
- metadata +96 -55
- data/spec/fixtures/stock_data.csv +0 -500
|
@@ -22,7 +22,7 @@ module Daru
|
|
|
22
22
|
# Calculate the minimum value of each numeric vector
|
|
23
23
|
# @!method product
|
|
24
24
|
# Compute the product of each numeric vector
|
|
25
|
-
[
|
|
25
|
+
%i[mean variance_sample range median mode std sum count min product].each do |meth|
|
|
26
26
|
define_method(meth) do
|
|
27
27
|
compute_stats meth
|
|
28
28
|
end
|
|
@@ -41,38 +41,38 @@ module Daru
|
|
|
41
41
|
# Calculate cumulative sum of each numeric Vector
|
|
42
42
|
# @!method standardize
|
|
43
43
|
# Standardize each Vector
|
|
44
|
-
# @!method acf
|
|
44
|
+
# @!method acf(max_lags)
|
|
45
45
|
# Calculate Autocorrelation coefficient
|
|
46
|
-
# @param [Integer]
|
|
47
|
-
# @!method ema
|
|
46
|
+
# @param max_lags [Integer] (nil) Number of initial lags
|
|
47
|
+
# @!method ema(n,wilder)
|
|
48
48
|
# Calculate exponential moving average.
|
|
49
|
-
# @param [Integer]
|
|
50
|
-
# @param [TrueClass, FalseClass, NilClass]
|
|
49
|
+
# @param n [Integer] (10) Loopback length.
|
|
50
|
+
# @param wilder [TrueClass, FalseClass, NilClass] (false) If true,
|
|
51
51
|
# 1/n value is used for smoothing; if false, uses 2/(n+1) value.
|
|
52
|
-
# @!method rolling_mean
|
|
52
|
+
# @!method rolling_mean(n)
|
|
53
53
|
# Calculate moving averages
|
|
54
|
-
# @param [Integer]
|
|
55
|
-
# @!method rolling_median
|
|
54
|
+
# @param n [Integer] (10) Loopback length. Default to 10.
|
|
55
|
+
# @!method rolling_median(n)
|
|
56
56
|
# Calculate moving median
|
|
57
|
-
# @param [Integer]
|
|
58
|
-
# @!method rolling_max
|
|
57
|
+
# @param n [Integer] (10) Loopback length. Default to 10.
|
|
58
|
+
# @!method rolling_max(n)
|
|
59
59
|
# Calculate moving max
|
|
60
|
-
# @param [Integer]
|
|
61
|
-
# @!method rolling_min
|
|
60
|
+
# @param n [Integer] (10) Loopback length. Default to 10.
|
|
61
|
+
# @!method rolling_min(n)
|
|
62
62
|
# Calculate moving min
|
|
63
|
-
# @param [Integer]
|
|
64
|
-
# @!method rolling_count
|
|
63
|
+
# @param n [Integer] (10) Loopback length. Default to 10.
|
|
64
|
+
# @!method rolling_count(n)
|
|
65
65
|
# Calculate moving non-missing count
|
|
66
|
-
# @param [Integer]
|
|
67
|
-
# @!method rolling_std
|
|
66
|
+
# @param n [Integer] (10) Loopback length. Default to 10.
|
|
67
|
+
# @!method rolling_std(n)
|
|
68
68
|
# Calculate moving standard deviation
|
|
69
|
-
# @param [Integer]
|
|
70
|
-
# @!method rolling_variance
|
|
69
|
+
# @param n [Integer] (10) Loopback length. Default to 10.
|
|
70
|
+
# @!method rolling_variance(n)
|
|
71
71
|
# Calculate moving variance
|
|
72
|
-
# @param [Integer]
|
|
73
|
-
[
|
|
74
|
-
|
|
75
|
-
|
|
72
|
+
# @param n [Integer] (10) Loopback length. Default to 10.
|
|
73
|
+
%i[
|
|
74
|
+
cumsum standardize acf ema rolling_mean rolling_median rolling_max
|
|
75
|
+
rolling_min rolling_count rolling_std rolling_variance rolling_sum
|
|
76
76
|
].each do |meth|
|
|
77
77
|
define_method(meth) do |*args|
|
|
78
78
|
apply_method_to_numerics meth, *args
|
|
@@ -88,7 +88,7 @@ module Daru
|
|
|
88
88
|
# be applied to numeric vectors. Default is [:count, :mean, :std, :max,
|
|
89
89
|
# :min]. Methods will be applied in the specified order.
|
|
90
90
|
def describe methods=nil
|
|
91
|
-
methods ||= [
|
|
91
|
+
methods ||= %i[count mean std min max]
|
|
92
92
|
|
|
93
93
|
description_hash = {}
|
|
94
94
|
numeric_vectors.each do |vec|
|
|
@@ -133,17 +133,15 @@ module Daru
|
|
|
133
133
|
# Calculate sample variance-covariance between the numeric vectors.
|
|
134
134
|
def covariance
|
|
135
135
|
cache = Hash.new do |h, (col, row)|
|
|
136
|
-
|
|
136
|
+
value = vector_cov(self[row],self[col])
|
|
137
|
+
h[[col, row]] = value
|
|
138
|
+
h[[row, col]] = value
|
|
137
139
|
end
|
|
138
140
|
vectors = numeric_vectors
|
|
139
141
|
|
|
140
142
|
mat_rows = vectors.collect do |row|
|
|
141
143
|
vectors.collect do |col|
|
|
142
|
-
|
|
143
|
-
self[row].variance
|
|
144
|
-
else
|
|
145
|
-
cache[[col,row]]
|
|
146
|
-
end
|
|
144
|
+
row == col ? self[row].variance : cache[[col,row]]
|
|
147
145
|
end
|
|
148
146
|
end
|
|
149
147
|
|
|
@@ -19,10 +19,6 @@ module Daru
|
|
|
19
19
|
@data.product
|
|
20
20
|
end
|
|
21
21
|
|
|
22
|
-
def min
|
|
23
|
-
@data.min
|
|
24
|
-
end
|
|
25
|
-
|
|
26
22
|
def range
|
|
27
23
|
max - min
|
|
28
24
|
end
|
|
@@ -45,7 +41,7 @@ module Daru
|
|
|
45
41
|
# be applied to vectors. Default is [:count, :mean, :std, :max,
|
|
46
42
|
# :min]. Methods will be applied in the specified order.
|
|
47
43
|
def describe methods=nil
|
|
48
|
-
methods ||= [
|
|
44
|
+
methods ||= %i[count mean std min max]
|
|
49
45
|
description = methods.map { |m| send(m) }
|
|
50
46
|
Daru::Vector.new(description, index: methods, name: :statistics)
|
|
51
47
|
end
|
|
@@ -70,24 +66,280 @@ module Daru
|
|
|
70
66
|
reject_values(*Daru::MISSING_VALUES).uniq.reset_index!
|
|
71
67
|
end
|
|
72
68
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
69
|
+
if RUBY_VERSION >= '2.2'
|
|
70
|
+
# Returns the maximum value(s) present in the vector, with an optional comparator block.
|
|
71
|
+
#
|
|
72
|
+
# @param size [Integer] Number of maximum values to return. Defaults to nil.
|
|
73
|
+
#
|
|
74
|
+
# @example
|
|
75
|
+
#
|
|
76
|
+
# dv = Daru::Vector.new (["Tyrion", "Daenerys", "Jon Starkgaryen"]), index: Daru::Index.new([:t, :d, :j])
|
|
77
|
+
# #=>
|
|
78
|
+
# # #<Daru::Vector(3)>
|
|
79
|
+
# # t Tyrion
|
|
80
|
+
# # d Daenerys
|
|
81
|
+
# # j Jon Starkgaryen
|
|
82
|
+
#
|
|
83
|
+
# dv.max
|
|
84
|
+
# #=> "Tyrion"
|
|
85
|
+
#
|
|
86
|
+
# dv.max(2) { |a,b| a.size <=> b.size }
|
|
87
|
+
# #=> ["Jon Starkgaryen","Daenerys"]
|
|
88
|
+
def max(size=nil, &block)
|
|
89
|
+
reject_values(*Daru::MISSING_VALUES).to_a.max(size, &block)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# Returns the maximum value(s) present in the vector, with a compulsory object block.
|
|
93
|
+
#
|
|
94
|
+
# @param size [Integer] Number of maximum values to return. Defaults to nil.
|
|
95
|
+
#
|
|
96
|
+
# @example
|
|
97
|
+
#
|
|
98
|
+
# dv = Daru::Vector.new (["Tyrion", "Daenerys", "Jon Starkgaryen"]), index: Daru::Index.new([:t, :d, :j])
|
|
99
|
+
# #=>
|
|
100
|
+
# # #<Daru::Vector(3)>
|
|
101
|
+
# # t Tyrion
|
|
102
|
+
# # d Daenerys
|
|
103
|
+
# # j Jon Starkgaryen
|
|
104
|
+
#
|
|
105
|
+
# dv.max_by(2) { |i| i.size }
|
|
106
|
+
# #=> ["Jon Starkgaryen","Daenerys"]
|
|
107
|
+
def max_by(size=nil, &block)
|
|
108
|
+
raise ArgumentError, 'Expected compulsory object block in max_by method' unless block_given?
|
|
109
|
+
reject_values(*Daru::MISSING_VALUES).to_a.max_by(size, &block)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Returns the minimum value(s) present in the vector, with an optional comparator block.
|
|
113
|
+
#
|
|
114
|
+
# @param size [Integer] Number of minimum values to return. Defaults to nil.
|
|
115
|
+
#
|
|
116
|
+
# @example
|
|
117
|
+
#
|
|
118
|
+
# dv = Daru::Vector.new (["Tyrion", "Daenerys", "Jon Starkgaryen"]), index: Daru::Index.new([:t, :d, :j])
|
|
119
|
+
# #=>
|
|
120
|
+
# # #<Daru::Vector(3)>
|
|
121
|
+
# # t Tyrion
|
|
122
|
+
# # d Daenerys
|
|
123
|
+
# # j Jon Starkgaryen
|
|
124
|
+
#
|
|
125
|
+
# dv.min
|
|
126
|
+
# #=> "Daenerys"
|
|
127
|
+
#
|
|
128
|
+
# dv.min(2) { |a,b| a.size <=> b.size }
|
|
129
|
+
# #=> ["Tyrion","Daenerys"]
|
|
130
|
+
def min(size=nil, &block)
|
|
131
|
+
reject_values(*Daru::MISSING_VALUES).to_a.min(size, &block)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# Returns the minimum value(s) present in the vector, with a compulsory object block.
|
|
135
|
+
#
|
|
136
|
+
# @param size [Integer] Number of minimum values to return. Defaults to nil.
|
|
137
|
+
#
|
|
138
|
+
# @example
|
|
139
|
+
#
|
|
140
|
+
# dv = Daru::Vector.new (["Tyrion", "Daenerys", "Jon Starkgaryen"]), index: Daru::Index.new([:t, :d, :j])
|
|
141
|
+
# #=>
|
|
142
|
+
# # #<Daru::Vector(3)>
|
|
143
|
+
# # t Tyrion
|
|
144
|
+
# # d Daenerys
|
|
145
|
+
# # j Jon Starkgaryen
|
|
146
|
+
#
|
|
147
|
+
# dv.min_by(2) { |i| i.size }
|
|
148
|
+
# #=> ["Tyrion","Daenerys"]
|
|
149
|
+
def min_by(size=nil, &block)
|
|
150
|
+
raise ArgumentError, 'Expected compulsory object block in min_by method' unless block_given?
|
|
151
|
+
reject_values(*Daru::MISSING_VALUES).to_a.min_by(size, &block)
|
|
152
|
+
end
|
|
153
|
+
else
|
|
154
|
+
# Returns the maximum value(s) present in the vector, with an optional comparator block.
|
|
155
|
+
#
|
|
156
|
+
# @param size [Integer] Number of maximum values to return. Defaults to nil.
|
|
157
|
+
#
|
|
158
|
+
# @example
|
|
159
|
+
#
|
|
160
|
+
# dv = Daru::Vector.new (["Tyrion", "Daenerys", "Jon Starkgaryen"]), index: Daru::Index.new([:t, :d, :j])
|
|
161
|
+
# #=>
|
|
162
|
+
# # #<Daru::Vector(3)>
|
|
163
|
+
# # t Tyrion
|
|
164
|
+
# # d Daenerys
|
|
165
|
+
# # j Jon Starkgaryen
|
|
166
|
+
#
|
|
167
|
+
# dv.max
|
|
168
|
+
# #=> "Tyrion"
|
|
169
|
+
#
|
|
170
|
+
# dv.max(2) { |a,b| a.size <=> b.size }
|
|
171
|
+
# #=> ["Jon Starkgaryen","Daenerys"]
|
|
172
|
+
def max(size=nil, &block)
|
|
173
|
+
range = size.nil? ? 0 : (0..size-1)
|
|
174
|
+
reject_values(*Daru::MISSING_VALUES).to_a.sort(&block).reverse[range]
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
# Returns the maximum value(s) present in the vector, with a compulsory object block.
|
|
178
|
+
#
|
|
179
|
+
# @param size [Integer] Number of maximum values to return. Defaults to nil.
|
|
180
|
+
#
|
|
181
|
+
# @example
|
|
182
|
+
#
|
|
183
|
+
# dv = Daru::Vector.new (["Tyrion", "Daenerys", "Jon Starkgaryen"]), index: Daru::Index.new([:t, :d, :j])
|
|
184
|
+
# #=>
|
|
185
|
+
# # #<Daru::Vector(3)>
|
|
186
|
+
# # t Tyrion
|
|
187
|
+
# # d Daenerys
|
|
188
|
+
# # j Jon Starkgaryen
|
|
189
|
+
#
|
|
190
|
+
# dv.max_by(2) { |i| i.size }
|
|
191
|
+
# #=> ["Jon Starkgaryen","Daenerys"]
|
|
192
|
+
def max_by(size=nil, &block)
|
|
193
|
+
raise ArgumentError, 'Expected compulsory object block in max_by method' unless block_given?
|
|
194
|
+
reject_values(*Daru::MISSING_VALUES).to_a.sort_by(&block).reverse[size.nil? ? 0 : (0..size-1)]
|
|
84
195
|
end
|
|
196
|
+
|
|
197
|
+
# Returns the minimum value(s) present in the vector, with an optional comparator block.
|
|
198
|
+
#
|
|
199
|
+
# @param size [Integer] Number of minimum values to return. Defaults to nil.
|
|
200
|
+
#
|
|
201
|
+
# @example
|
|
202
|
+
#
|
|
203
|
+
# dv = Daru::Vector.new (["Tyrion", "Daenerys", "Jon Starkgaryen"]), index: Daru::Index.new([:t, :d, :j])
|
|
204
|
+
# #=>
|
|
205
|
+
# # #<Daru::Vector(3)>
|
|
206
|
+
# # t Tyrion
|
|
207
|
+
# # d Daenerys
|
|
208
|
+
# # j Jon Starkgaryen
|
|
209
|
+
#
|
|
210
|
+
# dv.min
|
|
211
|
+
# #=> "Daenerys"
|
|
212
|
+
#
|
|
213
|
+
# dv.min(2) { |a,b| a.size <=> b.size }
|
|
214
|
+
# #=> ["Tyrion","Daenerys"]
|
|
215
|
+
def min(size=nil, &block)
|
|
216
|
+
range = size.nil? ? 0 : (0..size-1)
|
|
217
|
+
reject_values(*Daru::MISSING_VALUES).to_a.sort(&block)[range]
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
# Returns the minimum value(s) present in the vector, with a compulsory object block.
|
|
221
|
+
#
|
|
222
|
+
# @param size [Integer] Number of minimum values to return. Defaults to nil.
|
|
223
|
+
#
|
|
224
|
+
# @example
|
|
225
|
+
#
|
|
226
|
+
# dv = Daru::Vector.new (["Tyrion", "Daenerys", "Jon Starkgaryen"]), index: Daru::Index.new([:t, :d, :j])
|
|
227
|
+
# #=>
|
|
228
|
+
# # #<Daru::Vector(3)>
|
|
229
|
+
# # t Tyrion
|
|
230
|
+
# # d Daenerys
|
|
231
|
+
# # j Jon Starkgaryen
|
|
232
|
+
#
|
|
233
|
+
# dv.min_by
|
|
234
|
+
# #=> "Daenerys"
|
|
235
|
+
#
|
|
236
|
+
# dv.min_by(2) { |i| i.size }
|
|
237
|
+
# #=> ["Tyrion","Daenerys"]
|
|
238
|
+
def min_by(size=nil, &block)
|
|
239
|
+
raise ArgumentError, 'Expected compulsory object block in min_by method' unless block_given?
|
|
240
|
+
reject_values(*Daru::MISSING_VALUES).to_a.sort_by(&block)[size.nil? ? 0 : (0..size-1)]
|
|
241
|
+
end
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
# Returns the index of the maximum value(s) present in the vector, with an optional
|
|
245
|
+
# comparator block.
|
|
246
|
+
#
|
|
247
|
+
# @param size [Integer] Number of maximum indices to return. Defaults to nil.
|
|
248
|
+
#
|
|
249
|
+
# @example
|
|
250
|
+
#
|
|
251
|
+
# dv = Daru::Vector.new (["Tyrion", "Daenerys", "Jon Starkgaryen"]), index: Daru::Index.new([:t, :d, :j])
|
|
252
|
+
# #=>
|
|
253
|
+
# # #<Daru::Vector(3)>
|
|
254
|
+
# # t Tyrion
|
|
255
|
+
# # d Daenerys
|
|
256
|
+
# # j Jon Starkgaryen
|
|
257
|
+
#
|
|
258
|
+
# dv.index_of_max
|
|
259
|
+
# #=> :t
|
|
260
|
+
#
|
|
261
|
+
# dv.index_of_max(2) { |a,b| a.size <=> b.size }
|
|
262
|
+
# #=> [:j, :d]
|
|
263
|
+
def index_of_max(size=nil,&block)
|
|
264
|
+
vals = max(size, &block)
|
|
265
|
+
dv = reject_values(*Daru::MISSING_VALUES)
|
|
266
|
+
vals.is_a?(Array) ? (vals.map { |x| dv.index_of(x) }) : dv.index_of(vals)
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
# Returns the index of the maximum value(s) present in the vector, with a compulsory
|
|
270
|
+
# object block.
|
|
271
|
+
#
|
|
272
|
+
# @param size [Integer] Number of maximum indices to return. Defaults to nil.
|
|
273
|
+
#
|
|
274
|
+
# @example
|
|
275
|
+
#
|
|
276
|
+
# dv = Daru::Vector.new (["Tyrion", "Daenerys", "Jon Starkgaryen"]), index: Daru::Index.new([:t, :d, :j])
|
|
277
|
+
# #=>
|
|
278
|
+
# # #<Daru::Vector(3)>
|
|
279
|
+
# # t Tyrion
|
|
280
|
+
# # d Daenerys
|
|
281
|
+
# # j Jon Starkgaryen
|
|
282
|
+
#
|
|
283
|
+
# dv.index_of_max_by(2) { |i| i.size }
|
|
284
|
+
# #=> [:j, :d]
|
|
285
|
+
def index_of_max_by(size=nil,&block)
|
|
286
|
+
vals = max_by(size, &block)
|
|
287
|
+
dv = reject_values(*Daru::MISSING_VALUES)
|
|
288
|
+
vals.is_a?(Array) ? (vals.map { |x| dv.index_of(x) }) : dv.index_of(vals)
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
# Returns the index of the minimum value(s) present in the vector, with an optional
|
|
292
|
+
# comparator block.
|
|
293
|
+
#
|
|
294
|
+
# @param size [Integer] Number of minimum indices to return. Defaults to nil.
|
|
295
|
+
#
|
|
296
|
+
# @example
|
|
297
|
+
#
|
|
298
|
+
# dv = Daru::Vector.new (["Tyrion", "Daenerys", "Jon Starkgaryen"]), index: Daru::Index.new([:t, :d, :j])
|
|
299
|
+
# #=>
|
|
300
|
+
# # #<Daru::Vector(3)>
|
|
301
|
+
# # t Tyrion
|
|
302
|
+
# # d Daenerys
|
|
303
|
+
# # j Jon Starkgaryen
|
|
304
|
+
#
|
|
305
|
+
# dv.index_of_min
|
|
306
|
+
# #=> :d
|
|
307
|
+
#
|
|
308
|
+
# dv.index_of_min(2) { |a,b| a.size <=> b.size }
|
|
309
|
+
# #=> [:t, :d]
|
|
310
|
+
def index_of_min(size=nil,&block)
|
|
311
|
+
vals = min(size, &block)
|
|
312
|
+
dv = reject_values(*Daru::MISSING_VALUES)
|
|
313
|
+
vals.is_a?(Array) ? (vals.map { |x| dv.index_of(x) }) : dv.index_of(vals)
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
# Returns the index of the minimum value(s) present in the vector, with a compulsory
|
|
317
|
+
# object block.
|
|
318
|
+
#
|
|
319
|
+
# @param size [Integer] Number of minimum indices to return. Defaults to nil.
|
|
320
|
+
#
|
|
321
|
+
# @example
|
|
322
|
+
#
|
|
323
|
+
# dv = Daru::Vector.new (["Tyrion", "Daenerys", "Jon Starkgaryen"]), index: Daru::Index.new([:t, :d, :j])
|
|
324
|
+
# #=>
|
|
325
|
+
# # #<Daru::Vector(3)>
|
|
326
|
+
# # t Tyrion
|
|
327
|
+
# # d Daenerys
|
|
328
|
+
# # j Jon Starkgaryen
|
|
329
|
+
#
|
|
330
|
+
# dv.index_of_min(2) { |i| i.size }
|
|
331
|
+
# #=> [:t, :d]
|
|
332
|
+
def index_of_min_by(size=nil,&block)
|
|
333
|
+
vals = min_by(size, &block)
|
|
334
|
+
dv = reject_values(*Daru::MISSING_VALUES)
|
|
335
|
+
vals.is_a?(Array) ? (vals.map { |x| dv.index_of(x) }) : dv.index_of(vals)
|
|
85
336
|
end
|
|
86
337
|
|
|
87
|
-
# Return
|
|
338
|
+
# Return the maximum element present in the Vector, as a Vector.
|
|
88
339
|
# @return [Daru::Vector]
|
|
89
340
|
def max_index
|
|
90
|
-
max
|
|
341
|
+
max_value = @data.max
|
|
342
|
+
Daru::Vector.new({index_of(max_value) => max_value}, name: @name, dtype: @dtype)
|
|
91
343
|
end
|
|
92
344
|
|
|
93
345
|
def frequencies
|
|
@@ -104,7 +356,7 @@ module Daru
|
|
|
104
356
|
def proportions
|
|
105
357
|
len = size - count_values(*Daru::MISSING_VALUES)
|
|
106
358
|
frequencies.to_h.each_with_object({}) do |(el, count), hash|
|
|
107
|
-
hash[el] = count / len
|
|
359
|
+
hash[el] = count / len.to_f
|
|
108
360
|
end
|
|
109
361
|
end
|
|
110
362
|
|
|
@@ -448,29 +700,29 @@ module Daru
|
|
|
448
700
|
|
|
449
701
|
# @!method rolling_mean
|
|
450
702
|
# Calculate rolling average
|
|
451
|
-
# @
|
|
703
|
+
# @yieldparam [Integer] n (10) Loopback length
|
|
452
704
|
# @!method rolling_median
|
|
453
705
|
# Calculate rolling median
|
|
454
|
-
# @
|
|
706
|
+
# @yieldparam [Integer] n (10) Loopback length
|
|
455
707
|
# @!method rolling_count
|
|
456
708
|
# Calculate rolling non-missing count
|
|
457
|
-
# @
|
|
709
|
+
# @yieldparam [Integer] n (10) Loopback length
|
|
458
710
|
# @!method rolling_max
|
|
459
711
|
# Calculate rolling max value
|
|
460
|
-
# @
|
|
712
|
+
# @yieldparam [Integer] n (10) Loopback length
|
|
461
713
|
# @!method rolling_min
|
|
462
714
|
# Calculate rolling min value
|
|
463
|
-
# @
|
|
715
|
+
# @yieldparam [Integer] n (10) Loopback length
|
|
464
716
|
# @!method rolling_sum
|
|
465
717
|
# Calculate rolling sum
|
|
466
|
-
# @
|
|
718
|
+
# @yieldparam [Integer] n (10) Loopback length
|
|
467
719
|
# @!method rolling_std
|
|
468
720
|
# Calculate rolling standard deviation
|
|
469
|
-
# @
|
|
721
|
+
# @yieldparam [Integer] n (10) Loopback length
|
|
470
722
|
# @!method rolling_variance
|
|
471
723
|
# Calculate rolling variance
|
|
472
|
-
# @
|
|
473
|
-
[
|
|
724
|
+
# @yieldparam [Integer] n (10) Loopback length
|
|
725
|
+
%i[count mean median max min sum std variance].each do |meth|
|
|
474
726
|
define_method("rolling_#{meth}".to_sym) do |n=10|
|
|
475
727
|
rolling(meth, n)
|
|
476
728
|
end
|
|
@@ -581,26 +833,28 @@ module Daru
|
|
|
581
833
|
|
|
582
834
|
# Moving Average Convergence-Divergence.
|
|
583
835
|
# Calculates the MACD (moving average convergence-divergence) of the time
|
|
584
|
-
# series
|
|
836
|
+
# series.
|
|
837
|
+
# @see https://en.wikipedia.org/wiki/MACD
|
|
585
838
|
#
|
|
586
|
-
#
|
|
587
|
-
#
|
|
588
|
-
#
|
|
589
|
-
# * *signal*: integer, (default = 9) - signal component of MACD
|
|
590
|
-
#
|
|
591
|
-
# == Usage
|
|
839
|
+
# @param fast [Integer] fast period of MACD (default 12)
|
|
840
|
+
# @param slow [Integer] slow period of MACD (default 26)
|
|
841
|
+
# @param signal [Integer] signal period of MACD (default 9)
|
|
592
842
|
#
|
|
843
|
+
# @example Create a series and calculate MACD values
|
|
593
844
|
# ts = Daru::Vector.new((1..100).map { rand })
|
|
594
845
|
# # => [0.69, 0.23, 0.44, 0.71, ...]
|
|
595
|
-
# ts.macd
|
|
846
|
+
# macdseries, macdsignal, macdhist = ts.macd
|
|
847
|
+
# macdseries, macdsignal, macdhist = ts.macd(13)
|
|
848
|
+
# macdseries, macdsignal, macdhist = ts.macd(signal=5)
|
|
596
849
|
#
|
|
597
|
-
#
|
|
850
|
+
# @return [Array<Daru::Vector>] macdseries, macdsignal and macdhist are
|
|
851
|
+
# returned as an array of three Daru::Vectors
|
|
598
852
|
#
|
|
599
|
-
# Array of two Daru::Vectors - comparison of fast EMA with slow and EMA with
|
|
600
|
-
# signal value
|
|
601
853
|
def macd(fast=12, slow=26, signal=9)
|
|
602
|
-
|
|
603
|
-
|
|
854
|
+
macdseries = ema(fast) - ema(slow)
|
|
855
|
+
macdsignal = macdseries.ema(signal)
|
|
856
|
+
macdhist = macdseries - macdsignal
|
|
857
|
+
[macdseries, macdsignal, macdhist]
|
|
604
858
|
end
|
|
605
859
|
|
|
606
860
|
# Calculates the autocorrelation coefficients of the series.
|