moving_avg 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +17 -0
- data/Gemfile.lock +1 -1
- data/README.md +24 -1
- data/lib/moving_avg.rb +1 -0
- data/lib/moving_avg/base.rb +18 -0
- data/lib/moving_avg/calculator.rb +14 -0
- data/lib/moving_avg/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: adf8514ee1c03754bf5734d85b70b0913985e0e1
|
4
|
+
data.tar.gz: 6e3bd9a1cea91bdf14cde1e996fe2370e32daaf7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7705e47e999f35c1afbda368b7da1ecbb5c166ebe2a58231e0a1aec107d0598225b1ec0b702fc22dbae83fee64e957c3137af4ae8b8b1d2d6adeffb2e558f2ce
|
7
|
+
data.tar.gz: b23f4c4d35581244bced91058111766c80f376815867d514f05bce0222efe40e5a38b43891fc0861cff48154b6873560520bccb7bc8f9b8cd9b879f478460f34
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
## v0.2.2
|
2
|
+
- add MovingAvg::Calculator for strategy facade class
|
3
|
+
- add Simple Moving Mean
|
4
|
+
|
5
|
+
## v0.2.1
|
6
|
+
- ignore NaN for Evaluator.error_sum
|
7
|
+
|
8
|
+
## v0.2.0
|
9
|
+
- add basic moving average strategies
|
10
|
+
- Simple Moving Average
|
11
|
+
- Weighted Moving Average
|
12
|
+
- Exponentially Weighted Moving Average
|
13
|
+
- Modified Moving Average
|
14
|
+
|
15
|
+
## v0.1.0
|
16
|
+
|
17
|
+
- Hello, world!
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -22,12 +22,27 @@ Or install it yourself as:
|
|
22
22
|
|
23
23
|
```ruby
|
24
24
|
data = [100, 200, 200, 500]
|
25
|
+
|
26
|
+
# Basic Usage
|
27
|
+
calculator = MovingAvg::Calculator.new(strategy: :sma)
|
28
|
+
p calculator.moving_avg(data) #=> 250.0
|
29
|
+
|
30
|
+
# You can call MovingAvg::Base class methods
|
25
31
|
p MovingAvg::Base.sma(data) #=> 250.0
|
26
32
|
p MovingAvg::Base.wma(data) #=> 190.0
|
27
33
|
p MovingAvg::Base.ewma(data) #=> 298.4
|
28
34
|
p MovingAvg::Base.mma(data) #=> 232.8125
|
29
35
|
```
|
30
36
|
|
37
|
+
## `MovingAvg::Calculator`
|
38
|
+
|
39
|
+
```ruby
|
40
|
+
data = [100, 200, 200, 500]
|
41
|
+
|
42
|
+
calculator = MovingAvg::Calculator.new(strategy: :sma)
|
43
|
+
p calculator.moving_avg(data) #=> 250.0
|
44
|
+
```
|
45
|
+
|
31
46
|
## `MovingAvg::Base`
|
32
47
|
|
33
48
|
### Simple Moving Average
|
@@ -52,6 +67,10 @@ p MovingAvg::Base.mma(data) #=> 232.8125
|
|
52
67
|
- `MovingAvg::Base.modified_moving_average()`
|
53
68
|
- `MovingAvg::Base.mma()`
|
54
69
|
|
70
|
+
### Simple Moving Mean
|
71
|
+
- aliases
|
72
|
+
- `MovingAvg::Base.simple_moving_mean()`
|
73
|
+
- `MovingAvg::Base.smm()`
|
55
74
|
|
56
75
|
## `MovingAvg::Evaluator`
|
57
76
|
|
@@ -61,7 +80,7 @@ Helper method for calculating the sum of errors.
|
|
61
80
|
|
62
81
|
```ruby
|
63
82
|
training_items = [100, 300, 350, 280, 500]
|
64
|
-
teacher_items = [110.0, 200.0, 300.0
|
83
|
+
teacher_items = [110.0, 200.0, 300.0]
|
65
84
|
%i(sma wma ewma mma).each { |strategy|
|
66
85
|
error = MovingAvg::Evaluator.error_sum(
|
67
86
|
training_items: training_items,
|
@@ -70,6 +89,10 @@ teacher_items = [110.0, 200.0, 300.0, 400.0]
|
|
70
89
|
strategy: strategy,
|
71
90
|
)
|
72
91
|
puts "#{strategy.to_s.ljust(4).rjust(10)} = #{error}"
|
92
|
+
# sma = 326.6666666666667
|
93
|
+
# wma = 263.33333333333337
|
94
|
+
# ewma = 375.0
|
95
|
+
# mma = 306.66666666666674
|
73
96
|
}
|
74
97
|
```
|
75
98
|
|
data/lib/moving_avg.rb
CHANGED
data/lib/moving_avg/base.rb
CHANGED
@@ -4,12 +4,16 @@ module MovingAvg
|
|
4
4
|
class Base
|
5
5
|
class << self
|
6
6
|
# SMA - Simple Moving Average
|
7
|
+
#
|
8
|
+
# https://en.wikipedia.org/wiki/Moving_average#Simple_moving_average
|
7
9
|
def simple_moving_average(u)
|
8
10
|
sum_vector(u).to_f / u.size
|
9
11
|
end
|
10
12
|
alias_method :sma, :simple_moving_average
|
11
13
|
|
12
14
|
# WMA - Weighted Moving Average
|
15
|
+
#
|
16
|
+
# https://en.wikipedia.org/wiki/Moving_average#Weighted_moving_average
|
13
17
|
def weighted_moving_average(u)
|
14
18
|
weights = (1..u.size).to_a.reverse # [n, n-1, n-2 ... 2, 1]
|
15
19
|
weighted = weights.zip(u).map { |w, x| w * x }
|
@@ -19,6 +23,8 @@ module MovingAvg
|
|
19
23
|
alias_method :lwma, :weighted_moving_average
|
20
24
|
|
21
25
|
# EWMA - Exponentially Weighted Moving Average
|
26
|
+
#
|
27
|
+
# https://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average
|
22
28
|
def exponentially_weighted_moving_average(u)
|
23
29
|
factor = 2.0 / (u.size + 1) # 2 / (N + 1) a.k.a. smoothing factor
|
24
30
|
weighted = exponentially_weighting(u, factor)
|
@@ -27,6 +33,8 @@ module MovingAvg
|
|
27
33
|
alias_method :ewma, :exponentially_weighted_moving_average
|
28
34
|
|
29
35
|
# MMA - Modified Moving Average
|
36
|
+
#
|
37
|
+
# https://en.wikipedia.org/wiki/Moving_average#Modified_moving_average
|
30
38
|
def modified_moving_average(u)
|
31
39
|
factor = 1.0 / u.size # 1 / N
|
32
40
|
weighted = exponentially_weighting(u, factor)
|
@@ -34,6 +42,16 @@ module MovingAvg
|
|
34
42
|
end
|
35
43
|
alias_method :mma, :modified_moving_average
|
36
44
|
|
45
|
+
# SMM - Simple Moving Median
|
46
|
+
#
|
47
|
+
# https://en.wikipedia.org/wiki/Moving_average#Moving_median
|
48
|
+
def simple_moving_median(u)
|
49
|
+
sorted = u.sort
|
50
|
+
len = sorted.length
|
51
|
+
(sorted[(len - 1) / 2] + sorted[len / 2]) / 2
|
52
|
+
end
|
53
|
+
alias_method :smm, :simple_moving_median
|
54
|
+
|
37
55
|
private
|
38
56
|
|
39
57
|
def exponentially_weighting(u, factor)
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module MovingAvg
|
2
|
+
class Calculator
|
3
|
+
attr_reader :strategy, :options
|
4
|
+
|
5
|
+
def initialize(strategy:, options: {})
|
6
|
+
@strategy = strategy
|
7
|
+
@options = options
|
8
|
+
end
|
9
|
+
|
10
|
+
def moving_avg(items)
|
11
|
+
MovingAvg::Base.public_send(strategy, items)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/moving_avg/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: moving_avg
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kenju
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-12-
|
11
|
+
date: 2017-12-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -90,6 +90,7 @@ files:
|
|
90
90
|
- ".gitignore"
|
91
91
|
- ".rspec"
|
92
92
|
- ".travis.yml"
|
93
|
+
- CHANGELOG.md
|
93
94
|
- Gemfile
|
94
95
|
- Gemfile.lock
|
95
96
|
- LICENSE
|
@@ -99,6 +100,7 @@ files:
|
|
99
100
|
- bin/setup
|
100
101
|
- lib/moving_avg.rb
|
101
102
|
- lib/moving_avg/base.rb
|
103
|
+
- lib/moving_avg/calculator.rb
|
102
104
|
- lib/moving_avg/evaluator.rb
|
103
105
|
- lib/moving_avg/helper.rb
|
104
106
|
- lib/moving_avg/version.rb
|