Module: RailsPulse::Statistics

Defined in:
lib/rails_pulse/statistics.rb

Class Method Summary collapse

Class Method Details

.calculate_percentile(sorted_values, percentile) ⇒ Float?

Calculates percentile using linear interpolation

Examples:

Statistics.calculate_percentile([100, 200, 300, 400, 500], 0.95)
# => 480.0 (interpolated value between 400 and 500)

Parameters:

  • sorted_values (Array<Numeric>)

    Pre-sorted array of values

  • percentile (Float)

    Percentile to calculate (0.0 to 1.0, e.g., 0.95 for p95)

Returns:

  • (Float, nil)

    The calculated percentile or nil if array is empty



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/rails_pulse/statistics.rb', line 12

def self.calculate_percentile(sorted_values, percentile)
  return nil if sorted_values.empty?

  n = sorted_values.length
  rank = percentile * (n - 1)
  lower_index = rank.floor
  upper_index = [ rank.ceil, n - 1 ].min

  if lower_index == upper_index
    sorted_values[lower_index]
  else
    fraction = rank - lower_index
    lower_value = sorted_values[lower_index]
    upper_value = sorted_values[upper_index]
    lower_value + (fraction * (upper_value - lower_value))
  end
end

.calculate_stddev(values, mean) ⇒ Float?

Calculates standard deviation using sample standard deviation formula

Examples:

Statistics.calculate_stddev([100, 200, 300, 400, 500], 300)
# => 158.11 (approximately)

Parameters:

  • values (Array<Numeric>)

    Array of values

  • mean (Numeric)

    Pre-calculated mean of the values

Returns:

  • (Float, nil)

    The standard deviation or nil if insufficient data



39
40
41
42
43
44
# File 'lib/rails_pulse/statistics.rb', line 39

def self.calculate_stddev(values, mean)
  return nil if values.empty? || values.size == 1

  sum_of_squares = values.sum { |v| (v - mean) ** 2 }
  Math.sqrt(sum_of_squares / (values.size - 1))
end