Stats<T extends num>.fromData constructor
Stats<T extends num>.fromData (
- Iterable<
T> source
Implementation
factory Stats.fromData(Iterable<T> source) {
final list = source.toList()..sort();
if (list.isEmpty) {
throw ArgumentError.value(list, 'list', 'Cannot be empty.');
}
var map = Map();
list.forEach((element) {
if (!map.containsKey(element)) {
map[element] = 1;
} else {
map[element] += 1;
}
});
var highestCount = 0;
for (var key in map.keys) {
var val = map[key];
if (val > highestCount) highestCount = val;
}
List<dynamic> mode = [];
for (var key in map.keys) {
var val = map[key];
if (val == highestCount) mode.add(key);
}
final count = list.length;
final max = list.last;
final min = list.first;
num sum = 0;
for (var value in list) {
sum += value;
}
final mean = sum / count;
// variance
// The average of the squared difference from the Mean
/*
num sumOfSquaredDiffFromMean = 0;
for (var value in list) {
final squareDiffFromMean = math.pow(value - mean, 2);
sumOfSquaredDiffFromMean += squareDiffFromMean;
}
*/
// final variance = sumOfSquaredDiffFromMean / count;
// standardDeviation: sqrt of the variance
// final standardDeviation = math.sqrt(variance);
final middleIndex = count ~/ 2;
num median = list[middleIndex];
// if length is even, average the "middle" values
if (count.isEven) {
median = (list[middleIndex - 1] + median) / 2.0;
}
if (count == 0) {
throw ArgumentError.value(source, 'source', 'Cannot be empty.');
}
return Stats(count, max, min, sum, mean, median, mode, list);
}