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 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