moving_avg 0.2.1 → 0.2.2
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 +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
|