Module: Perfgate::Statistics::Summary

Defined in:
lib/perfgate/statistics/summary.rb

Overview

Basic summary statistics for a set of raw sample values, used to populate the summary block of a run result (spec sections 14.1 and 16.2).

Class Method Summary collapse

Class Method Details

.call(values) ⇒ Object



11
12
13
14
15
16
17
18
# File 'lib/perfgate/statistics/summary.rb', line 11

def call(values)
  return empty if values.empty?

  sorted = values.sort
  med = median(sorted)

  central_tendency(values, sorted, med).merge("count" => values.size)
end

.central_tendency(values, sorted, med) ⇒ Object



20
21
22
23
24
25
26
27
28
29
# File 'lib/perfgate/statistics/summary.rb', line 20

def central_tendency(values, sorted, med)
  {
    "mean" => mean(values).round,
    "median" => med.round,
    "min" => sorted.first.round,
    "max" => sorted.last.round,
    "mad" => mad(sorted, med).round,
    "p90" => percentile(sorted, 90).round
  }
end

.emptyObject



55
56
57
# File 'lib/perfgate/statistics/summary.rb', line 55

def empty
  { "mean" => 0, "median" => 0, "min" => 0, "max" => 0, "mad" => 0, "p90" => 0, "count" => 0 }
end

.mad(sorted, med) ⇒ Object

Median absolute deviation: a robust spread measure, less sensitive to outliers than standard deviation.



41
42
43
44
# File 'lib/perfgate/statistics/summary.rb', line 41

def mad(sorted, med)
  deviations = sorted.map { |v| (v - med).abs }.sort
  percentile(deviations, 50)
end

.mean(values) ⇒ Object



31
32
33
# File 'lib/perfgate/statistics/summary.rb', line 31

def mean(values)
  values.sum / values.size.to_f
end

.median(sorted) ⇒ Object



35
36
37
# File 'lib/perfgate/statistics/summary.rb', line 35

def median(sorted)
  percentile(sorted, 50)
end

.percentile(sorted, pct) ⇒ Object



46
47
48
49
50
51
52
53
# File 'lib/perfgate/statistics/summary.rb', line 46

def percentile(sorted, pct)
  return sorted.first.to_f if sorted.size == 1

  rank = (pct / 100.0) * (sorted.size - 1)
  lower = sorted[rank.floor]
  upper = sorted[rank.ceil]
  lower + ((upper - lower) * (rank - rank.floor))
end