1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
use super::mean::Mean;
use crate::sql::number::Number;

pub trait Variance {
	/// Population Variance of Data
	/// O(n) time complex
	fn variance(self, sample: bool) -> f64;
}

impl Variance for Vec<Number> {
	fn variance(self, sample: bool) -> f64 {
		variance(&self, self.mean(), sample)
	}
}

pub(super) fn variance(v: &[Number], mean: f64, sample: bool) -> f64 {
	match v.len() {
		0 => f64::NAN,
		1 => 0.0,
		len => {
			let len = (len - sample as usize) as f64;
			let out = v.iter().map(|x| (x.to_float() - mean).powi(2)).sum::<f64>() / len;
			out
		}
	}
}