mathstats 0.9.1 → 0.9.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.
data/README.txt CHANGED
@@ -8,20 +8,25 @@ Mathstats is a simple statistics library.
8
8
  2. No dependencies
9
9
  3. Rails integration
10
10
  4. Usable as a mixin: [4,8,15,16,23,42].variance
11
- 5. Usable as a library: Mathstats::Lib.variance([4,8,15,16,23,42])
11
+ 5. Usable as a library: Mathstats.variance([4,8,15,16,23,42])
12
12
 
13
13
  == Installation
14
14
 
15
- $ gem sources -a http://gems.github.com
16
- $ gem install bmarini-mathstats
15
+ $ gem install mathstats
17
16
 
18
17
  == Usage
19
18
 
20
- require 'rubygems'
21
19
  require 'mathstats'
22
20
 
23
- Array.send :include, Mathstats
21
+ Mathstats.attach_to(Array) # => Array.send :include, Mathstats::Mixin
24
22
  [4,8,15,16,23,42].variance
25
23
 
26
24
  # Or if you don't want to mess with the Array class
27
- Mathstats::Lib.variance([4,8,15,16,23,42])
25
+ Mathstats.variance([4,8,15,16,23,42])
26
+
27
+ == Methods available
28
+
29
+ * mean, average
30
+ * standard_deviation
31
+ * sum
32
+ * variance
data/Rakefile CHANGED
@@ -1,9 +1,3 @@
1
- begin
2
- require 'rubygems'
3
- rescue Exception
4
- nil
5
- end
6
-
7
1
  require 'rake/clean'
8
2
  require 'rake/testtask'
9
3
 
@@ -1,42 +1,22 @@
1
- module Mathstats
2
- def mean(identity = 0, &block)
3
- Lib.average(self, identity, &block)
4
- end
5
- alias_method :average, :mean
6
-
7
- def standard_deviation(options = {}, &block)
8
- Lib.standard_deviation(self, options, &block)
9
- end
10
-
11
- def sum(identity = 0, &block)
12
- Lib.sum(self, identity, &block)
13
- end
14
-
15
- def variance(options = {}, &block)
16
- Lib.variance(self, options, &block)
17
- end
18
-
19
- class Lib
20
-
21
- def self.mean(array, identity = 0, &block)
1
+ class Mathstats
2
+ class << self
3
+ def mean(array, identity = 0, &block)
22
4
  array.size > 0 ? sum(array, identity, &block) / array.size.to_f : identity
23
5
  end
24
-
25
- # Poor man's alias_method until I figure out how to do this right
26
- def self.average(array, identity = 0, &block); mean(array, identity, &block); end
27
-
28
- def self.standard_deviation(array, options = {}, &block)
6
+ alias_method :average, :mean
7
+
8
+ def standard_deviation(array, options = {}, &block)
29
9
  options = {:default => 0}.merge(options)
30
10
  return options[:default] unless array.size > 0
31
-
11
+
32
12
  if block_given?
33
13
  return standard_deviation( array.map(&block), options )
34
14
  end
35
-
15
+
36
16
  Math.sqrt( variance(array, options) )
37
17
  end
38
-
39
- def self.sum(array, identity = 0, &block)
18
+
19
+ def sum(array, identity = 0, &block)
40
20
  return identity unless array.size > 0
41
21
 
42
22
  if block_given?
@@ -48,23 +28,44 @@ module Mathstats
48
28
 
49
29
  # Two pass algorithm is currently the only algo supported
50
30
  # http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance
51
- def self.variance(array, options = {}, &block)
31
+ def variance(array, options = {}, &block)
52
32
  options = {:default => 0, :algo => :two_pass, :population => :infinite}.merge(options)
53
33
  return options[:default] unless array.size > 0
54
-
34
+
55
35
  if block_given?
56
36
  return variance( array.map(&block), options )
57
37
  end
58
-
38
+
59
39
  variance_two_pass(array, options)
60
40
  end
61
-
62
- def self.variance_two_pass(array, options)
41
+
42
+ def variance_two_pass(array, options)
63
43
  n = array.size
64
44
  denom = options[:population] == :infinite ? n - 1 : n
65
45
  mean = mean(array)
66
46
  variance = array.inject(0) {|memo, element| memo + (element - mean)**2 } / denom
67
47
  end
68
48
 
49
+ def attach_to(klass)
50
+ klass.send :include, Mixin
51
+ end
52
+ end
53
+
54
+ # All the class methods from Mathstats above are available in the Mixin
55
+ # module, via delegation. This module can be included in any class that
56
+ # has a method `#to_a` like Array
57
+
58
+ module Mixin
59
+ def self.delegate_to_mathstats(*symbols)
60
+ Array(symbols).each do |symbol|
61
+ class_eval <<-EOS, __FILE__, __LINE__ + 1
62
+ def #{symbol}(*args, &block)
63
+ Mathstats.#{symbol}(self.to_a, *args, &block)
64
+ end
65
+ EOS
66
+ end
67
+ end
68
+
69
+ delegate_to_mathstats :mean, :average, :standard_deviation, :sum, :variance
69
70
  end
70
- end
71
+ end
@@ -1,20 +1,22 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "mathstats"
3
- s.version = "0.9.1"
4
- s.date = "2008-11-07"
5
- s.summary = "Basic statistics methods for ruby available as a mixin or standalone class"
3
+ s.version = "0.9.2"
4
+ s.date = "2010-03-20"
5
+ s.summary = "Basic statistics methods for ruby available as a \
6
+ mixin or standalone class"
6
7
  s.email = "bmarini@gmail.com"
7
8
  s.homepage = "http://github.com/bmarini/mathstats"
8
- s.description = "Mathstats is a basic statistics library. It is meant to be mixed into Array, but you can also use it as a standalone class."
9
+ s.description = "Mathstats is a basic statistics library. It is meant \
10
+ to be mixed into Array, but you can also use it as a standalone class."
9
11
  s.has_rdoc = true
10
12
  s.rdoc_options = ["--main", "README.txt"]
11
13
  s.authors = ["Ben Marini"]
12
14
  s.files = [
13
- "README.txt",
14
- "Rakefile",
15
- "mathstats.gemspec",
16
- "lib/mathstats.rb"
17
- ]
15
+ "README.txt",
16
+ "Rakefile",
17
+ "mathstats.gemspec",
18
+ "lib/mathstats.rb"
19
+ ]
18
20
  s.test_files = ["test/mathstats_test.rb"]
19
21
  s.extra_rdoc_files = ["README.txt"]
20
22
  end
@@ -1,30 +1,28 @@
1
1
  require 'test/unit'
2
2
  require 'mathstats'
3
3
 
4
- class TC_MyTest < Test::Unit::TestCase
5
- def setup
6
- Array.send :include, Mathstats
7
- end
8
-
4
+ class MathStatsTest < Test::Unit::TestCase
9
5
  def test_average_as_module
6
+ Mathstats.attach_to(Array)
10
7
  assert_equal 3, [1,2,3,4,5].average
11
8
  assert_equal(6, [1,2,3,4,5].average {|n| n * 2 })
12
9
  assert_equal(0, [].average(0))
13
10
  assert_equal('empty', [].average('empty'))
14
-
11
+
15
12
  assert_equal(1.5, [1,2].average)
16
13
  end
17
-
14
+
18
15
  def test_average_as_class
19
- assert_equal 3, Mathstats::Lib.average([1,2,3,4,5])
20
- assert_equal(6, Mathstats::Lib.average([1,2,3,4,5]) {|n| n * 2 })
21
- assert_equal(0, Mathstats::Lib.average([], 0))
22
- assert_equal('empty', Mathstats::Lib.average([], 'empty'))
23
-
24
- assert_equal(1.5, Mathstats::Lib.average([1,2]))
16
+ assert_equal 3, Mathstats.average([1,2,3,4,5])
17
+ assert_equal(6, Mathstats.average([1,2,3,4,5]) {|n| n * 2 })
18
+ assert_equal(0, Mathstats.average([], 0))
19
+ assert_equal('empty', Mathstats.average([], 'empty'))
20
+
21
+ assert_equal(1.5, Mathstats.average([1,2]))
25
22
  end
26
23
 
27
24
  def test_sum_as_module
25
+ Mathstats.attach_to(Array)
28
26
  assert_equal 10, [1,2,3,4].sum
29
27
  assert_equal(20, [1,2,3,4].sum {|n| n * 2 })
30
28
  assert_equal(0, [].sum(0))
@@ -32,37 +30,31 @@ class TC_MyTest < Test::Unit::TestCase
32
30
  end
33
31
 
34
32
  def test_sum_as_class
35
- assert_equal 15, Mathstats::Lib.sum([1,2,3,4,5])
36
- assert_equal(30, Mathstats::Lib.sum([1,2,3,4,5]) {|n| n * 2 })
37
- assert_equal(0, Mathstats::Lib.sum([], 0))
38
- assert_equal('empty', Mathstats::Lib.sum([], 'empty'))
39
-
40
- assert_equal(3, Mathstats::Lib.sum([1,2]))
33
+ assert_equal 15, Mathstats.sum([1,2,3,4,5])
34
+ assert_equal(30, Mathstats.sum([1,2,3,4,5]) {|n| n * 2 })
35
+ assert_equal(0, Mathstats.sum([], 0))
36
+ assert_equal('empty', Mathstats.sum([], 'empty'))
37
+
38
+ assert_equal(3, Mathstats.sum([1,2]))
41
39
  end
42
-
40
+
43
41
  def test_variance_as_module
42
+ Mathstats.attach_to(Array)
44
43
  assert_equal 30, [4, 7, 13, 16].variance
45
44
  assert_equal 30, [4, 7, 13, 16].map {|n| 10**8 + n }.variance
46
45
  assert_equal 30, [4, 7, 13, 16].map {|n| 10**9 + n }.variance
47
46
  end
48
47
 
49
48
  def test_variance_as_class
50
- assert_equal 30, Mathstats::Lib.variance([4, 7, 13, 16])
51
- assert_equal 30, Mathstats::Lib.variance([4, 7, 13, 16].map {|n| 10**8 + n })
52
- assert_equal 30, Mathstats::Lib.variance([4, 7, 13, 16].map {|n| 10**9 + n })
49
+ assert_equal 30, Mathstats.variance([4, 7, 13, 16])
50
+ assert_equal 30, Mathstats.variance([4, 7, 13, 16].map {|n| 10**8 + n })
51
+ assert_equal 30, Mathstats.variance([4, 7, 13, 16].map {|n| 10**9 + n })
53
52
  end
54
-
53
+
55
54
  def test_standard_deviation_as_module
55
+ Mathstats.attach_to(Array)
56
56
  assert_equal 6, [3,7,7,19].standard_deviation({:population => :finite})
57
57
  assert_equal 6.93, ([3,7,7,19].standard_deviation * 100).round / 100.0
58
58
  end
59
59
 
60
- def test_standard_deviation_as_class
61
- assert_equal 6, Mathstats::Lib.standard_deviation([3,7,7,19], {:population => :finite})
62
- assert_equal 6.93, ( Mathstats::Lib.standard_deviation([3,7,7,19]) * 100 ).round / 100.0
63
- end
64
-
65
- # def teardown
66
- # end
67
-
68
60
  end
metadata CHANGED
@@ -1,7 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mathstats
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 9
8
+ - 2
9
+ version: 0.9.2
5
10
  platform: ruby
6
11
  authors:
7
12
  - Ben Marini
@@ -9,7 +14,7 @@ autorequire:
9
14
  bindir: bin
10
15
  cert_chain: []
11
16
 
12
- date: 2008-11-07 00:00:00 -08:00
17
+ date: 2010-03-20 00:00:00 -07:00
13
18
  default_executable:
14
19
  dependencies: []
15
20
 
@@ -40,18 +45,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
40
45
  requirements:
41
46
  - - ">="
42
47
  - !ruby/object:Gem::Version
48
+ segments:
49
+ - 0
43
50
  version: "0"
44
- version:
45
51
  required_rubygems_version: !ruby/object:Gem::Requirement
46
52
  requirements:
47
53
  - - ">="
48
54
  - !ruby/object:Gem::Version
55
+ segments:
56
+ - 0
49
57
  version: "0"
50
- version:
51
58
  requirements: []
52
59
 
53
60
  rubyforge_project:
54
- rubygems_version: 1.3.5
61
+ rubygems_version: 1.3.6
55
62
  signing_key:
56
63
  specification_version: 3
57
64
  summary: Basic statistics methods for ruby available as a mixin or standalone class