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
- .call(values) ⇒ Object
- .central_tendency(values, sorted, med) ⇒ Object
- .empty ⇒ Object
-
.mad(sorted, med) ⇒ Object
Median absolute deviation: a robust spread measure, less sensitive to outliers than standard deviation.
- .mean(values) ⇒ Object
- .median(sorted) ⇒ Object
- .percentile(sorted, pct) ⇒ Object
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 |
.empty ⇒ Object
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 |