BoxSummary.fromValues constructor
Compute from raw values.
Implementation
factory BoxSummary.fromValues(List<double> values) {
final finiteValues = values.where((value) => value.isFinite).toList();
if (finiteValues.isEmpty) {
return BoxSummary(min: 0, q1: 0, median: 0, q3: 0, max: 0);
}
final s = [...finiteValues]..sort();
final n = s.length;
double q(double p) {
final i = p * (n - 1);
final lo = i.floor(), hi = i.ceil();
return lo == hi ? s[lo] : s[lo] + (s[hi] - s[lo]) * (i - lo);
}
final q1 = q(0.25), q3 = q(0.75);
final iqr = q3 - q1;
final loFence = q1 - 1.5 * iqr, hiFence = q3 + 1.5 * iqr;
final inliers = s.where((v) => v >= loFence && v <= hiFence).toList();
final outliers = s.where((v) => v < loFence || v > hiFence).toList();
final mean = finiteValues.fold(0.0, (a, b) => a + b) / n;
return BoxSummary(
min: inliers.isEmpty ? s.first : inliers.first,
q1: q1,
median: q(0.5),
q3: q3,
max: inliers.isEmpty ? s.last : inliers.last,
mean: mean,
outliers: outliers,
);
}