1use json::{JsonValue, object};
2
3pub fn new(array: Vec<f64>, lower_value: f64, upper_value: f64, mut group_count: usize) -> JsonValue {
5 if group_count == 0 {
6 group_count = array.len().to_string().parse::<f64>().unwrap().sqrt() as usize;
7 }
8
9 let max_value = array.iter().cloned().fold(f64::NEG_INFINITY, f64::max);
11 let min_value = array.iter().cloned().fold(f64::INFINITY, f64::min);
13
14 let sum: f64 = array.iter().sum(); let count = array.len() as f64; let mean_value = sum / count; let group_width = (max_value - min_value) / group_count as f64;
20
21
22 let mut lower_bounds = vec![min_value - group_width / 2.0];
24 let mut upper_bounds = vec![];
25 for _ in 1..group_count {
26 let prev_upper_bound = *lower_bounds.last().unwrap();
27 let upper_bound = prev_upper_bound + group_width;
28 lower_bounds.push(upper_bound);
29 upper_bounds.push(prev_upper_bound + group_width);
30 }
31 upper_bounds.push(lower_bounds.last().unwrap() + group_width);
32
33
34 let mut frequencies = vec![0; group_count];
36 for &value in &array {
37 for (i, &lower_bound) in lower_bounds.iter().enumerate() {
38 let upper_bound = lower_bound + group_width;
39 if value >= lower_bound && value < upper_bound {
40 frequencies[i] += 1;
41 break;
42 }
43 }
44 }
45 let mut list = vec![];
46 for i in 0..group_count {
47 let pjz = (upper_bounds[i] - lower_bounds[i]) / 2.0 + lower_bounds[i];
48 list.push(pjz);
49 }
50 object! {
51 data:array,
52 max_value:max_value,
53 min_value:min_value,
54 frequencies:frequencies,
55 upper_bounds:upper_bounds,
56 lower_bounds:lower_bounds,
57 group_count:group_count,
58 group_width:group_width,
59 mean_value:mean_value,
60 lower_value:lower_value,
61 upper_value:upper_value,
62 list:list
63 }
64}