tindi/moving_averages/
simple_moving_average.rs1pub fn simple_moving_average(data: &[f32]) -> f32 {
21 let mut sum = 0.0;
22 let length = data.len();
23
24 if length < 1 {
25 return 0.0;
26 }
27
28 for number in data {
29 sum += number
30 }
31
32 sum / data.len() as f32
33}
34
35#[cfg(test)]
36mod tests {
37 use super::*;
38
39 #[test]
40 fn test_sma_wholes() {
41 let data = vec![
42 71.9, 72.51, 70.38, 71.63, 71.5, 71.11, 71.56, 70.34, 70.32, 70.05, 67.72, 66.45,
43 67.12, 66.86, 66.7, 67.26, 67.52, 68.0, 67.43, 67.68, 68.86, 68.62, 67.27, 67.9, 67.74,
44 66.45, 65.78, 66.88, 67.13, 66.65, 66.77, 65.86, 66.63, 65.55, 65.24, 64.74, 64.56,
45 64.37, 63.06, 62.32, 63.67, 64.81, 65.23, 64.33, 64.73, 64.55, 63.94, 65.15, 66.18,
46 67.65, 68.12, 67.9, 68.55, 67.13, 66.71, 66.34, 68.59, 68.24, 68.39, 69.34, 69.06,
47 ];
48 let result = simple_moving_average(&data);
49 let expected = 67.29558;
50 assert_eq!(result, expected);
51 }
52
53 #[test]
54 fn test_sma_decimals() {
55 let data = vec![0.21, 0.40, 0.60, 0.15, 0.21];
56 let result = simple_moving_average(&data);
57 let expected = 0.314;
58 assert_eq!(result, expected);
59 }
60
61 #[test]
62 fn test_sma_short() {
63 let data = vec![0.21];
64 let result = simple_moving_average(&data);
65 let expected = 0.21;
66 assert_eq!(result, expected);
67 }
68}