module CalculatePercentiles
# Returns the mean of all elements in array; nil if array is empty
def mean
return nil if self.length == 0
self.sum / self.length
end
# Returns the percentile value for percentile _p_; nil if array is empty.
#
# _p_ should be expressed as an integer; percentile(90) returns the 90th percentile of the array.
#
# Algorithm from NIST[http://www.itl.nist.gov/div898/handbook/prc/section2/prc252.htm]
# Implementation from https://github.com/bkoski/array_stats/pull/3
def percentile(p)
sorted_array = self.sort
rank = (p.to_f / 100) * (self.length + 1)
return nil if self.length == 0
if rank.truncate > 0 && rank.truncate < self.length
sample_0 = sorted_array[rank.truncate - 1]
sample_1 = sorted_array[rank.truncate]
# Returns the fractional part of a float. For example, (6.67).fractional_part == 0.67
fractional_part = (rank - rank.truncate).abs
(fractional_part * (sample_1 - sample_0)) + sample_0
elsif rank.truncate == 0
sorted_array.first.to_f
elsif rank.truncate == self.length
sorted_array.last.to_f
end
end
end
Array.send :include, CalculatePercentiles