#平均 #生成 #昼夜 #循环

circadian_tools

用于处理昼夜数据或与一天中的时间等循环数据的数据工具

3 个版本

0.2.2 2023年2月14日
0.2.1 2023年2月14日
0.1.2 2023年2月2日

#313 in 日期和时间

每月 27 次下载

MIT 许可证

10KB
120

昼夜工具

昼夜数据是循环数据,如一天中的时间、一周中的某一天等。也可以想象其他方式循环的数据,如月亮的相位、季节或销售周期等。

平均值

可能出现的一个问题是平均值。想象一下每晚的数据交付。你想要知道交付通常发生在什么时候,你的时间看起来像 [23:00, 01:00, 23:30, 00:30]。如果你简单地将交付时间相加,你会得到中午,这显然是错误的。相反,我们首先将时间投影到单位圆上,得到笛卡尔 X/Y 坐标。然后我们平均这些点,生成圆内的一个新点。然后,如果我们从原点画一条直线通过这个点到圆的边缘,我们得到一个新的时间,即交付的平均时间。

此外,我们得到一个置信度测量值,即平均点与原点的距离。距离为 1 表示所有点都相同。距离为 0 表示点均匀分布,因此实际上没有有意义的平均值。这可以用来了解你的平均在未来的预测能力。一个用例是动态调整警报阈值。它使用 f64,因此有一些精度问题,但经过一些输出清理后足够用于大多数目的。

use circadian_tools;

fn main() {
    let data = vec![23.0, 1.0];
    let (avg, conf) = circadian_tools::circadian_average(24.0, data.into_iter());
    println!("Average of 23 and 1 on a 24 hour cycle is {}, with {} confidence", avg, conf);
    // prints "Average of 23 and 1 on a 24 hour cycle is 0.0000..., with 0.9659... confidence"
}

还有一个用于平均 Timelike 对象向量的函数。如果你有一组时间并且想要知道一天中的平均时间,这将很有用。

use chrono::NaiveTime;
use circadian_tools;

fn main() {
    let data = vec![
        NaiveTime::from_hms_opt(1, 0, 0).unwrap(),
        NaiveTime::from_hms_opt(23, 0, 0).unwrap(),
    ];
    let avg_time = circadian_tools::avg_time_of_day(data.into_iter());
    println!("Average of 1100 and 0100 is {}", avg_time);
    // prints "Average of 1100 and 0100 is 0000"
}

如果你有任何建议,请告诉我!

这是一个小型库,从平均值计算开始,仍在开发中。我会继续添加更多工具。如果您有任何建议,请告诉我。

依赖项

~1MB
~18K SLoC