1pub fn standard_deviation(data: &[f64]) -> Result<f64, String> {
5 if data.is_empty() {
6 return Err("Empty data".to_string());
7 }
8
9 let mean = data.iter().sum::<f64>() / data.len() as f64;
10 let variance = data.iter().map(|&x| (x - mean).powi(2)).sum::<f64>() / data.len() as f64;
11
12 Ok(variance.sqrt())
13}
14
15pub fn interquartile_range(data: &[f64]) -> Result<f64, String> {
17 let mut sorted = data.to_vec();
18 sorted.sort_by(|a, b| a.partial_cmp(b).unwrap_or(std::cmp::Ordering::Equal));
19
20 let n = sorted.len();
21 if n < 4 {
22 return Ok(sorted[n - 1] - sorted[0]);
23 }
24
25 let q1_idx = n / 4;
26 let q3_idx = 3 * n / 4;
27
28 Ok(sorted[q3_idx] - sorted[q1_idx])
29}
30
31#[inline]
33pub fn gaussian_kernel(u: f64) -> f64 {
34 const INV_SQRT_2PI: f64 = 0.3989422804014327; INV_SQRT_2PI * (-0.5 * u * u).exp()
36}