utilities 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/lib/utilities.rb +102 -18
  2. data/lib/version.rb +1 -1
  3. metadata +4 -4
data/lib/utilities.rb CHANGED
@@ -56,6 +56,16 @@ class Numeric
56
56
  self * Math::PI / 180
57
57
  end
58
58
 
59
+ # Return the square of self
60
+ def square
61
+ self * self
62
+ end
63
+
64
+ # Return the square root of self
65
+ def sqrt
66
+ Math.sqrt(self)
67
+ end
68
+
59
69
  # Calculate the rank of self based on provided min and max
60
70
  def rank min, max
61
71
  s, min, max = self.to_f, min.to_f, max.to_f
@@ -71,6 +81,7 @@ class Numeric
71
81
  def percentage_of n, t = 100
72
82
  n == 0 ? 0.0 : self / n.to_f * t
73
83
  end
84
+ alias_method :percent_of, :percentage_of
74
85
  end
75
86
 
76
87
  module Utilities
@@ -80,6 +91,16 @@ module Utilities
80
91
  inject( :+ )
81
92
  end
82
93
 
94
+ # Calculate squares of each item
95
+ def squares
96
+ map{ |i| i**2 }
97
+ end
98
+
99
+ # Calculate square roots of each item
100
+ def sqrts
101
+ map{ |i| i.sqrt }
102
+ end
103
+
83
104
  # Calculate the mean of the array, as long as all objects respond to / operator
84
105
  def mean
85
106
  (size > 0) ? sum.to_f / size : 0.0
@@ -91,24 +112,56 @@ module Utilities
91
112
  inject(Hash.new(0)) { |h, v| h[v] += 1; h }
92
113
  end
93
114
 
94
- # Return the variance of the array
115
+ # Return the variance of self
95
116
  def variance
96
117
  m = mean
97
118
  inject(0) { |v, x| v += (x - m) ** 2 }
98
119
  end
99
120
 
100
- # Return the standard deviation of the array
101
- def standard_deviation
102
- size > 1 ? Math.sqrt( variance / ( size - 1 ) ) : 0.0
121
+ # Return the (sample|population) standard deviation of self
122
+ # If population is set to true, then we consider the dataset as the complete population
123
+ # Else, we consider the dataset as a sample, so we use the sample standard deviation (size - 1)
124
+ def standard_deviation( population = false )
125
+ size > 1 ? Math.sqrt( variance / ( size - ( population ? 0 : 1 ) ) ) : 0.0
103
126
  end
104
127
  alias_method :std_dev, :standard_deviation
105
128
 
106
- # Return the median of the array
107
- def median(already_sorted=false)
129
+ # Return the median of sorted self
130
+ def median( already_sorted = false )
108
131
  return nil if empty?
109
- a = sort unless already_sorted
132
+ a = sort_and_extend( already_sorted )
110
133
  m_pos = size / 2
111
- size % 2 == 1 ? a[m_pos] : a[m_pos-1..m_pos].extend(Utilities::Statistics).mean
134
+ size % 2 == 1 ? a[m_pos] : (a[m_pos-1] + a[m_pos]).to_f / 2
135
+ end
136
+ alias_method :second_quartile, :median
137
+
138
+ # Return the first quartile of self
139
+ def first_quartile( already_sorted = false )
140
+ return nil if empty?
141
+ a = already_sorted ? self : sort
142
+ a[0..((size / 2) - 1)].extend(Utilities::Statistics).median( true )
143
+ end
144
+ alias_method :lower_quartile, :first_quartile
145
+
146
+ # Return the last quartile of self
147
+ def last_quartile( already_sorted = false )
148
+ return nil if empty?
149
+ a = already_sorted ? self : sort
150
+ a[((size / 2) + 1)..-1].extend(Utilities::Statistics).median( true )
151
+ end
152
+ alias_method :upper_quartile, :last_quartile
153
+
154
+ # Return an array containing the first, the second and the last quartile of self
155
+ def quartiles( already_sorted = false )
156
+ a = sort_and_extend( already_sorted )
157
+ [a.first_quartile( true ), a.median( true ), a.last_quartile( true )]
158
+ end
159
+
160
+ # Calculate the interquartile range of self
161
+ def interquartile_range( already_sorted = false )
162
+ return nil if empty?
163
+ a = sort_and_extend( already_sorted )
164
+ a.last_quartile - a.first_quartile
112
165
  end
113
166
 
114
167
  # Return an array of modes with their corresponding occurences
@@ -118,19 +171,50 @@ module Utilities
118
171
  freq.select { |k, f| f == max }
119
172
  end
120
173
 
121
- # Return all statistics from the array in a simple hash
122
- def statistics
174
+ # Return the midrange of sorted self
175
+ def midrange( already_sorted = false )
176
+ return nil if empty?
177
+ a = sort_and_extend( already_sorted )
178
+ (a.first + a.last) / 2.0
179
+ end
180
+
181
+ # Return the statistical range of sorted self
182
+ def statistical_range( already_sorted = false )
183
+ return nil if empty?
184
+ a = sort_and_extend( already_sorted )
185
+ (a.last - a.first)
186
+ end
187
+
188
+ # Return all statistics from self in a simple hash
189
+ def statistics( already_sorted = false )
190
+ sorted = sort_and_extend( already_sorted )
191
+
123
192
  {
124
- :size => size,
125
- :sum => sum,
126
- :min => min,
127
- :max => max,
128
- :mean => mean,
129
- :standard_deviation => standard_deviation,
130
- :median => median,
131
- :modes => modes
193
+ :first => self.first,
194
+ :last => self.last,
195
+ :size => self.size,
196
+ :sum => self.sum,
197
+ :min => self.min,
198
+ :max => self.max,
199
+ :mean => self.mean,
200
+ :frequences => self.frequences,
201
+ :variance => self.variance,
202
+ :standard_deviation => self.standard_deviation,
203
+ :modes => self.modes,
204
+
205
+ # Need to be sorted...
206
+ :median => sorted.median( true ),
207
+ :midrange => sorted.midrange( true ),
208
+ :statistical_range => sorted.statistical_range( true ),
209
+ :quartiles => sorted.quartiles( true ),
210
+ :interquartile_range => sorted.interquartile_range( true )
132
211
  }
133
212
  end
134
213
  alias_method :stats, :statistics
214
+
215
+ protected
216
+ def sort_and_extend( already_sorted = false )
217
+ already_sorted ? self : sort.extend(Utilities::Statistics)
218
+ end
135
219
  end
136
220
  end
data/lib/version.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  class Utilities
2
2
  MAJOR = 0
3
3
  MINOR = 0
4
- BUILD = 5
4
+ BUILD = 6
5
5
 
6
6
  VERSION = "#{MAJOR}.#{MINOR}.#{BUILD}"
7
7
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: utilities
3
3
  version: !ruby/object:Gem::Version
4
- hash: 21
4
+ hash: 19
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 5
10
- version: 0.0.5
9
+ - 6
10
+ version: 0.0.6
11
11
  platform: ruby
12
12
  authors:
13
13
  - Christian Blais
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-02-15 00:00:00 -05:00
18
+ date: 2011-02-18 00:00:00 -05:00
19
19
  default_executable:
20
20
  dependencies: []
21
21