@@ -223,6 +223,31 @@ where
223223 }
224224}
225225
226+ /// Calculate sample variance of the given data
227+ pub fn variance ( data : & [ f64 ] ) -> Option < f64 > {
228+ match data. len ( ) {
229+ 0 => None ,
230+ _ => {
231+ let mean = mean ( data) ;
232+ let mut v: f64 = 0.0 ;
233+ for s in data {
234+ let x = s - mean. unwrap ( ) ;
235+ v = v + x * x;
236+ }
237+ let denom = ( data. len ( ) - 1 ) as f64 ;
238+ Some ( v / denom)
239+ }
240+ }
241+ }
242+
243+ /// Calculate standard deviation of the given data
244+ pub fn std_deviation ( data : & [ f64 ] ) -> Option < f64 > {
245+ match data. len ( ) {
246+ 0 => None ,
247+ _ => Some ( variance ( data) . unwrap ( ) . sqrt ( ) ) ,
248+ }
249+ }
250+
226251#[ cfg( test) ]
227252mod tests {
228253 use super :: * ;
@@ -343,5 +368,21 @@ mod tests {
343368 let numbers = [ 10 , -21 , 15 , 20 , 18 , 14 , 18 ] ;
344369 let err = "Slice is empty." ;
345370 assert_eq ! ( 10.571428571428571 , mean( & numbers) . expect( err) ) ;
371+ let numbers2 = [ 727.7 , 1086.5 , 1091.0 , 1361.3 , 1490.5 , 1956.1 ] ;
372+ assert_eq ! ( 1285.5166666666667 , mean( & numbers2) . expect( err) ) ;
373+ }
374+
375+ #[ test]
376+ fn test_variance ( ) {
377+ let numbers = [ 727.7 , 1086.5 , 1091.0 , 1361.3 , 1490.5 , 1956.1 ] ;
378+ let err = "Slice is empty." ;
379+ assert_eq ! ( 177209.41766666662 , variance( & numbers) . expect( err) ) ;
380+ }
381+
382+ #[ test]
383+ fn test_std_deviation ( ) {
384+ let numbers = [ 727.7 , 1086.5 , 1091.0 , 1361.3 , 1490.5 , 1956.1 ] ;
385+ let err = "Slice is empty." ;
386+ assert_eq ! ( 420.96248961952256 , std_deviation( & numbers) . expect( err) ) ;
346387 }
347388}
0 commit comments