d3trax
2/27/2015 - 9:11 AM

functions.js

function map() {
	emit(1, {
		sum: this.value, // the field you want stats for
		min: this.value,
		max: this.value,
		count: 1,
		diff: 0
	});
}

function reduce(key, values) {
	return values.reduce(function reduce(previous, current, index, array) {
		var delta = previous.sum/previous.count - current.sum/current.count;
		var weight = (previous.count * current.count)/(previous.count + current.count);

		return {
			sum: previous.sum + current.sum,
			min: Math.min(previous.min, current.min),
			max: Math.max(previous.max, current.max),
			count: previous.count + current.count,
			diff: previous.diff + current.diff + delta*delta*weight
		};
	})
}

function finalize(key, value) { 
	value.average = value.sum / value.count;
	value.population_variance = value.diff / value.count;
	value.population_standard_deviation = Math.sqrt(value.population_variance);
	value.sample_variance = value.diff / (value.count - 1);
	value.sample_standard_deviation = Math.sqrt(value.sample_variance);
	delete value.diff;
	return value;
}