diff --git a/src/primary/mod.rs b/src/primary/mod.rs index c297f39..68f5a91 100644 --- a/src/primary/mod.rs +++ b/src/primary/mod.rs @@ -1,7 +1,12 @@ pub mod mean; pub mod mode; +pub mod variance; pub mod median; pub use mean::mean; pub use mode::mode; -pub use median::median; \ No newline at end of file +pub use variance::variance; + +pub use mean::mean; +pub use mode::mode; +pub use median::median; diff --git a/src/primary/variance.rs b/src/primary/variance.rs new file mode 100644 index 0000000..a5a2b75 --- /dev/null +++ b/src/primary/variance.rs @@ -0,0 +1,36 @@ +/// Returns the arithmetic mean of a sequence of `f64` values. +/// +/// Empty input returns `None`. +/// +/// # Example +/// ``` +/// use rustats::primary::variance; +/// +/// let values = [1.0, 2.0, 3.0]; +/// let var = variance(&values); +/// assert_eq!(var, Some(0.6666666666666666)); +/// ``` +/// + +use super::mean; + + +pub fn variance(values: &[f64]) -> Option { + let mut count: u64 = 0; + let mut square_sum: f64 = 0.0; + let avg = mean(&values)?; + + for value in values { + square_sum += (*value-avg)*(*value-avg); + count += 1; + } + + if count < 2{ + None + } + + else { + Some((square_sum)/ (count - 1) as f64) + } + +}