br_maths/
histogram.rs

1use json::{JsonValue, object};
2
3/// 直方图
4pub 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    // 最大值
10    let max_value = array.iter().cloned().fold(f64::NEG_INFINITY, f64::max);
11    // 最小值
12    let min_value = array.iter().cloned().fold(f64::INFINITY, f64::min);
13
14    let sum: f64 = array.iter().sum(); // 计算数据的总和
15    let count = array.len() as f64; // 获取数据的数量,并转换为浮点数
16    let mean_value = sum / count; // 计算平均值
17
18    // 组距
19    let group_width = (max_value - min_value) / group_count as f64;
20
21
22    // 计算各组的界限位
23    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    // 步骤⑤:统计各组数据出现频数,作频数分布表
35    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}