exonio 0.4.1 → 0.5.4

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
- SHA1:
3
- metadata.gz: d61396bb031ad61fccf7f19cc5cc1ef243bb78da
4
- data.tar.gz: 6de79892afc7edf4e19da4767e4ba5dacc2886aa
2
+ SHA256:
3
+ metadata.gz: 2177008fa8ad1fce23bd78efe356f146ab94350acb804eacc6fbdf7cf0b73756
4
+ data.tar.gz: a8a144747cec2755ae8c6739b91b8a4cc8eee4630ac6c950147c2eca260d5711
5
5
  SHA512:
6
- metadata.gz: 37e0ed4a079fe9a7089c70b31cedd3c8e7dbbbcd044945c7b70ba06eba8145e0a90f61939cb4b2292907ede374a3a6c6bb1e43a79fa8c049f9ebe059d88384eb
7
- data.tar.gz: b54e1f1ef81daff292ddfcca5d6fbdb35adae1fc3b2d7e16deca55b2122dc8535a401e313e49ebd978644c987f26294b230ab587fab7b0b90866023d4b252e6e
6
+ metadata.gz: 74c8699b45184bcee100bda0aacf58f526461a02f4904e728ab9d1c2f4c3822a30fd19ea5fdff3de8c7f325eded5428e0946e2f243d15515c008181958404052
7
+ data.tar.gz: 170be11052472cdc4ed37f11bd6821a5f3273b44fd3e8374a52502918bb6d84a67f2c6e4483d35626533851852abee7e2426d04dfc1d89dbd00331d4a16c9131
@@ -1,4 +1,6 @@
1
1
  language: ruby
2
2
  rvm:
3
3
  - 2.3.0
4
+ - 2.2
5
+ - 2.1
4
6
  before_install: gem install bundler -v 1.11.2
@@ -1,5 +1,30 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 0.5.4
4
+
5
+ * Fix zero interest rate (#18)
6
+ * Remove BigDecimal.new deprecation warning (#17)
7
+
8
+ ## 0.5.3
9
+
10
+ * Fix error on IRR function
11
+
12
+ ## 0.5.2
13
+
14
+ * Fix the IRR method
15
+
16
+ ## 0.5.1
17
+
18
+ * Fix the FloatDomainError exception
19
+
20
+ ## 0.5.0
21
+
22
+ * Implements `irr` and `npv` method
23
+
24
+ ## 0.4.1
25
+
26
+ * Fix infinite loop with big scale on `rate` method
27
+
3
28
  ## 0.4.0
4
29
 
5
30
  * Implements `rate` method
@@ -1,37 +1,35 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- exonio (0.4.1)
4
+ exonio (0.5.4)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
- byebug (8.2.1)
10
- coderay (1.1.0)
11
- diff-lcs (1.2.5)
12
- method_source (0.8.2)
13
- pry (0.10.3)
14
- coderay (~> 1.1.0)
15
- method_source (~> 0.8.1)
16
- slop (~> 3.4)
9
+ byebug (8.2.5)
10
+ coderay (1.1.2)
11
+ diff-lcs (1.3)
12
+ method_source (1.0.0)
13
+ pry (0.13.1)
14
+ coderay (~> 1.1)
15
+ method_source (~> 1.0)
17
16
  pry-byebug (3.3.0)
18
17
  byebug (~> 8.0)
19
18
  pry (~> 0.10)
20
- rake (10.5.0)
21
- rspec (3.4.0)
22
- rspec-core (~> 3.4.0)
23
- rspec-expectations (~> 3.4.0)
24
- rspec-mocks (~> 3.4.0)
25
- rspec-core (3.4.1)
26
- rspec-support (~> 3.4.0)
27
- rspec-expectations (3.4.0)
19
+ rake (13.0.1)
20
+ rspec (3.9.0)
21
+ rspec-core (~> 3.9.0)
22
+ rspec-expectations (~> 3.9.0)
23
+ rspec-mocks (~> 3.9.0)
24
+ rspec-core (3.9.2)
25
+ rspec-support (~> 3.9.3)
26
+ rspec-expectations (3.9.2)
28
27
  diff-lcs (>= 1.2.0, < 2.0)
29
- rspec-support (~> 3.4.0)
30
- rspec-mocks (3.4.1)
28
+ rspec-support (~> 3.9.0)
29
+ rspec-mocks (3.9.1)
31
30
  diff-lcs (>= 1.2.0, < 2.0)
32
- rspec-support (~> 3.4.0)
33
- rspec-support (3.4.1)
34
- slop (3.6.0)
31
+ rspec-support (~> 3.9.0)
32
+ rspec-support (3.9.3)
35
33
 
36
34
  PLATFORMS
37
35
  ruby
@@ -40,8 +38,8 @@ DEPENDENCIES
40
38
  bundler (~> 1.11)
41
39
  exonio!
42
40
  pry-byebug (~> 3.3.0)
43
- rake (~> 10.0)
41
+ rake (~> 13.0)
44
42
  rspec (~> 3.0)
45
43
 
46
44
  BUNDLED WITH
47
- 1.11.2
45
+ 1.17.2
data/README.md CHANGED
@@ -3,6 +3,9 @@
3
3
  This gem brings some useful Excel formulas to Ruby. For now, it just has
4
4
  financial formulas, but could have more (like statistical formulas) in the future.
5
5
 
6
+ [![Gem Version](https://badge.fury.io/rb/exonio.svg)](https://badge.fury.io/rb/exonio)
7
+ [![Build Status](https://travis-ci.org/Noverde/exonio.svg?branch=master)](https://travis-ci.org/Noverde/exonio)
8
+
6
9
  ## Installation
7
10
 
8
11
  Add this line to your application's Gemfile:
@@ -43,6 +46,19 @@ By convention, the negative sign represents cash flow out (i.e. money not
43
46
  available today). Thus, saving $100 a month at 5% annual interest leads
44
47
  to $15,692.93 available to spend in 10 years.
45
48
 
49
+ ### IRR
50
+
51
+ Suppose one invests 100 units and then makes the following withdrawals at regular (fixed)
52
+ intervals: 39, 59, 55, 20. Assuming the ending value is 0, one's 100 unit investment
53
+ yields 173 units; however, due to the combination of compounding and the periodic
54
+ withdrawals, the "average" rate of return is neither simply 0.73/4 nor (1.73)^0.25-1.
55
+
56
+ ```ruby
57
+ Exonio.irr([-100, 39, 59, 55, 20]) # ==> 0.28095
58
+ ```
59
+
60
+ So, the internal rate of return is 28.09%
61
+
46
62
  ### IPMT
47
63
 
48
64
  What is the interest part of a payment in the 8th period (i.e., 8th month),
@@ -65,6 +81,14 @@ Exonio.nper(0.07 / 12, -150, 8000) # ==> 64.07334877066185
65
81
 
66
82
  So, over 64 months would be required to pay off the loan.
67
83
 
84
+ ### NPV
85
+
86
+ Calculates the Net Present Value of an investment
87
+
88
+ ```ruby
89
+ Exonio.npv(0.281, [-100, 39, 59, 55, 29]) # ==> -0.00661872883563408
90
+ ```
91
+
68
92
  ### PMT
69
93
 
70
94
  What is the monthly payment needed to pay off a $200,000 loan in 15
@@ -103,6 +127,20 @@ Exonio.rate(12 * 3, 2_500, -50_000) # ==> 0.036006853458478955
103
127
 
104
128
  So, the rate applied is 3.60%.
105
129
 
130
+ ## Statistical formulas
131
+
132
+ ### Sum
133
+ ```ruby
134
+ Exonio.sum([1, 2, 3, 4, 5]) # ==> 15
135
+ ```
136
+ ### Mean
137
+ ```ruby
138
+ Exonio.mean([1, 2, 3, 4, 5]) # ==> 3.0
139
+ ```
140
+ ### Median
141
+ ```ruby
142
+ Exonio.median([1, 2, 3, 6, 5, 4]) # ==> 3.5
143
+ ```
106
144
  ## TODO
107
145
 
108
146
  There's a lot of formulas to be implemented, including:
@@ -113,9 +151,7 @@ There's a lot of formulas to be implemented, including:
113
151
  * AMORLINC
114
152
  * DB
115
153
  * DDB
116
- * IRR
117
154
  * MIRR
118
- * NPV
119
155
  * PPMT
120
156
  * SLN
121
157
  * SYD
@@ -139,3 +175,4 @@ Exonio is released under the MIT License.
139
175
  A special thanks goes to the python [NumPy project](http://www.numpy.org/), which was the source for most
140
176
  of the formulas.
141
177
 
178
+
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_development_dependency "bundler", "~> 1.11"
22
- spec.add_development_dependency "rake", "~> 10.0"
22
+ spec.add_development_dependency "rake", "~> 13.0"
23
23
  spec.add_development_dependency "rspec", "~> 3.0"
24
24
  spec.add_development_dependency "pry-byebug", "~> 3.3.0"
25
25
  end
@@ -1,6 +1,14 @@
1
- require "exonio/version"
2
- require "exonio/financial"
1
+ require 'bigdecimal'
2
+ require 'bigdecimal/newton'
3
+ require "bigdecimal/util"
4
+
5
+ require 'exonio/version'
6
+ require 'exonio/financial'
7
+ require 'exonio/statistical'
8
+ require 'exonio/helpers/irr_helper'
3
9
 
4
10
  module Exonio
11
+ extend Newton
5
12
  extend Financial
13
+ extend Statistical
6
14
  end
@@ -50,8 +50,8 @@ module Exonio
50
50
  # constant-amount periodic payments and a constant interest rate.
51
51
  #
52
52
  # @param rate [Float] The interest rate as decimal (not per cent) per period
53
- # @param pmt [Float] The number of payments to be made
54
- # @param pv [Float] The present value
53
+ # @param pmt [Float] The payment amount made each period
54
+ # @param pv [Float] The present value of the payments
55
55
  # @param fv [Float] The future value remaining after the final payment has been made
56
56
  # @param end_or_begining [Integer] Whether payments are due at the end (0) or
57
57
  # beggining (1) of each period
@@ -62,6 +62,8 @@ module Exonio
62
62
  # Exonio.nper(0.07 / 12, -150, 8000) # ==> 64.07334877066185
63
63
  #
64
64
  def nper(rate, pmt, pv, fv = 0, end_or_beginning = 0)
65
+ return (-pv - fv) / pmt if rate.zero?
66
+
65
67
  z = pmt * (1 + rate * end_or_beginning) / rate
66
68
  temp = Math.log((-fv + z) / (pv + z))
67
69
 
@@ -144,6 +146,45 @@ module Exonio
144
146
  next_guess
145
147
  end
146
148
 
149
+ # Calculates the net present value of an investment based on a
150
+ # series of periodic cash flows and a discount rate.
151
+ #
152
+ # @param discount [Float] The discount rate of the investment over one period
153
+ # @param cashflows [Array] The first future cash flow + additional future cash flows
154
+ #
155
+ # @return [Float]
156
+ #
157
+ # @example
158
+ # Exonio.npv(0.281, [-100, 39, 59, 55, 20]) # ==> -0.00661872883563408
159
+ #
160
+ def npv(discount, cashflows)
161
+ total = 0
162
+
163
+ cashflows.each_with_index do |cashflow, index|
164
+ total += (cashflow.to_f / (1 + discount.to_f) ** (index + 1))
165
+ end
166
+
167
+ total
168
+ end
169
+
170
+ # Calculates the internal rate of return on an investment based on a
171
+ # series of periodic cash flows.
172
+ #
173
+ # @param cashflows [Array] An array containing the income or payments
174
+ # associated with the investment
175
+ #
176
+ # @return [Float]
177
+ #
178
+ # @example
179
+ # Exonio.irr([-100, 39, 59, 55, 20]) # ==> 0.28094842116...
180
+ #
181
+ def irr(values)
182
+ func = Helpers::IrrHelper.new(values)
183
+ guess = [ func.eps ]
184
+ nlsolve( func, guess)
185
+ guess[0]
186
+ end
187
+
147
188
  private
148
189
 
149
190
  # This method was borrowed from the NumPy rate formula
@@ -0,0 +1,28 @@
1
+ module Exonio
2
+ module Helpers
3
+ class IrrHelper
4
+ values = {
5
+ eps: '1.0e-16',
6
+ one: '1.0',
7
+ two: '2.0',
8
+ ten: '10.0',
9
+ zero: '0.0'
10
+ }
11
+
12
+ values.each do |key, value|
13
+ define_method key do
14
+ BigDecimal(value)
15
+ end
16
+ end
17
+
18
+ def initialize(transactions)
19
+ @transactions = transactions
20
+ end
21
+
22
+ def values(x)
23
+ value = Exonio.npv(x[0].to_f, @transactions)
24
+ [ value.to_d ]
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,41 @@
1
+ module Exonio
2
+ module Statistical
3
+
4
+ # Sum of all numbers
5
+ #
6
+ # @param numbers_ary [array] and array of numbers to sum all elements
7
+ #
8
+ # @return [float]
9
+ #
10
+ # @example
11
+ # Exonio.sum([1,2,3,4,5]) # => 15
12
+ def sum(numbers_ary)
13
+ numbers_ary.inject(0, :+)
14
+ end
15
+
16
+ # Simple mean formula: sum elements and / by length
17
+ #
18
+ # @param numbers_ary [array] an array of numbers to calculate the mean
19
+ #
20
+ # @return [float]
21
+ #
22
+ # @example
23
+ # Exonio.mean([1,2,3,4,5]) # => 3.0
24
+ def mean(numbers_ary)
25
+ numbers_ary.inject(0) { |sum, i| sum + i }.to_f / numbers_ary.size
26
+ end
27
+
28
+ # Median formula
29
+ # @param numbers_ary [array] an array of numbers
30
+ #
31
+ # @return [float]
32
+ #
33
+ # @example
34
+ # Exonio.median([1,2,3,4,5]) # => 3.0
35
+ def median(numbers_ary)
36
+ numbers_ary.sort!
37
+ len = numbers_ary.length
38
+ (numbers_ary[(len - 1) / 2] + numbers_ary[len / 2]) / 2.0
39
+ end
40
+ end
41
+ end
@@ -1,3 +1,3 @@
1
1
  module Exonio
2
- VERSION = "0.4.1"
2
+ VERSION = "0.5.4"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: exonio
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.5.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rafael Izidoro
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-02-11 00:00:00.000000000 Z
11
+ date: 2020-05-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: '13.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: '13.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -88,6 +88,8 @@ files:
88
88
  - exonio.gemspec
89
89
  - lib/exonio.rb
90
90
  - lib/exonio/financial.rb
91
+ - lib/exonio/helpers/irr_helper.rb
92
+ - lib/exonio/statistical.rb
91
93
  - lib/exonio/version.rb
92
94
  homepage: http://github.com/noverde/exonio
93
95
  licenses: []
@@ -107,8 +109,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
107
109
  - !ruby/object:Gem::Version
108
110
  version: '0'
109
111
  requirements: []
110
- rubyforge_project:
111
- rubygems_version: 2.5.1
112
+ rubygems_version: 3.0.3
112
113
  signing_key:
113
114
  specification_version: 4
114
115
  summary: Excel usefull formulas written in Ruby