1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
|
# frozen_string_literal: true
module DDMetrics
class Stats
class EmptyError < StandardError
def message
'Not enough data to perform calculation'
end
end
def initialize(values)
@values = values
end
def inspect
"<#{self.class} count=#{count}>"
end
def count
@values.size
end
def sum
raise EmptyError if @values.empty?
@values.reduce(:+)
end
def avg
sum.to_f / count
end
def min
quantile(0.0)
end
def max
quantile(1.0)
end
def quantile(fraction)
raise EmptyError if @values.empty?
target = (@values.size - 1) * fraction.to_f
interp = target % 1.0
sorted_values[target.floor] * (1.0 - interp) + sorted_values[target.ceil] * interp
end
private
def sorted_values
@sorted_values ||= @values.sort
end
end
end
|