BoxSummary.fromValues constructor

BoxSummary.fromValues(
  1. List<double> values
)

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,
  );
}