// from https://gist.github.com/Daniel-Hug/7273430 var smallstat = { max: function(array) { return Math.max.apply(null, array); }, min: function(array) { return Math.min.apply(null, array); }, range: function(array) { return smallstat.max(array) - smallstat.min(array); }, midrange: function(array) { return smallstat.range(array) / 2; }, sum: function(array) { var num = 0; for (var i = 0, l = array.length; i < l; i++) num += array[i]; return num; }, mean: function(array) { return smallstat.sum(array) / array.length; }, median: function(array) { array.sort(function(a, b) { return a - b; }); var mid = array.length / 2; return mid % 1 ? array[mid - 0.5] : (array[mid - 1] + array[mid]) / 2; }, modes: function(array) { if (!array.length) return []; var modeMap = {}, maxCount = 0, modes = []; array.forEach(function(val) { if (!modeMap[val]) modeMap[val] = 1; else modeMap[val]++; if (modeMap[val] > maxCount) { modes = [val]; maxCount = modeMap[val]; } else if (modeMap[val] === maxCount) { modes.push(val); maxCount = modeMap[val]; } }); return modes; }, variance: function(array) { var mean = smallstat.mean(array); return smallstat.mean(array.map(function(num) { return Math.pow(num - mean, 2); })); }, standardDeviation: function(array) { return Math.sqrt(smallstat.variance(array)); }, meanAbsoluteDeviation: function(array) { var mean = smallstat.mean(array); return smallstat.mean(array.map(function(num) { return Math.abs(num - mean); })); }, zScores: function(array) { var mean = smallstat.mean(array); var standardDeviation = smallstat.standardDeviation(array); return array.map(function(num) { return (num - mean) / standardDeviation; }); } }; // Function aliases: smallstat.average = smallstat.mean; export default smallstat