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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6eb784a3b6a78e557f4ff8edbab656fb6078caaf
4
- data.tar.gz: '0951b130c9ad9888019b8bdb03c584419de9fd1d'
3
+ metadata.gz: adf8514ee1c03754bf5734d85b70b0913985e0e1
4
+ data.tar.gz: 6e3bd9a1cea91bdf14cde1e996fe2370e32daaf7
5
5
  SHA512:
6
- metadata.gz: 84de89f0dbff245ee119a700b6d425acc2568dba54e2f141156b49bdff80914c5b2c12b9f6130f69004b92b3935be11b3f76c354952fccd6a7fd5e3ced8112a8
7
- data.tar.gz: bb6bf5691b1663b56f2f67574a1c9c6d27b79cabd3a11f1eb83e92e53a1999d984e28f9290d0789f1cd7b7bea4b27d1b0252f506b084e607262d8b50652cca6e
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
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- moving_avg (0.2.1)
4
+ moving_avg (0.2.2)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
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, 400.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
@@ -1,5 +1,6 @@
1
1
  require "moving_avg/version"
2
2
  require "moving_avg/base"
3
+ require "moving_avg/calculator"
3
4
  require "moving_avg/evaluator"
4
5
  require "moving_avg/helper"
5
6
 
@@ -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
@@ -1,3 +1,3 @@
1
1
  module MovingAvg
2
- VERSION = "0.2.1"
2
+ VERSION = "0.2.2"
3
3
  end
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.1
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-27 00:00:00.000000000 Z
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