2 个版本
0.1.1 | 2023 年 2 月 6 日 |
---|---|
0.1.0 | 2022 年 9 月 12 日 |
#1116 在 算法
548 每月下载量
在 simple_accumulator 中使用
74KB
1.5K SLoC
Rust 的在线统计 🦀
watermill
是一个用于实现极其快速、通用且可序列化的在线统计的 crate 🦀。
快速入门
让我们计算在线中位数并将其序列化
use watermill::quantile::Quantile;
use watermill::stats::Univariate;
let data: Vec<f64> = vec![9., 7., 3., 2., 6., 1., 8., 5., 4.];
let mut running_median: Quantile<f64> = Quantile::new(0.5_f64).unwrap();
for x in data.into_iter() {
running_median.update(x); // update the current statistics
println!("The actual median value is: {}", running_median.get());
}
assert_eq!(running_median.get(), 5.0);
// Convert the statistic to a JSON string.
let serialized = serde_json::to_string(&running_median).unwrap();
// Convert the JSON string back to a statistic.
let deserialized: Quantile<f64> = serde_json::from_str(&serialized).unwrap();
现在让我们使用迭代器计算在线总和
use watermill::iter::IterStatisticsExtend;
let data: Vec<f64> = vec![1., 2., 3.];
let vec_true: Vec<f64> = vec![1., 3., 6.];
for (d, t) in data.into_iter().online_sum().zip(vec_true.into_iter()) {
assert_eq!(d, t); // ^^^^^^^^^^
}
您还可以计算滚动统计;以下示例中,我们将计算前两个数据的滚动总和
use watermill::rolling::Rolling;
use watermill::stats::Univariate;
use watermill::variance::Variance;
let data: Vec<f64> = vec![9., 7., 3., 2., 6., 1., 8., 5., 4.];
let mut running_var: Variance<f64> = Variance::default();
// We wrap `running_var` inside the `Rolling` struct.
let mut rolling_var: Rolling<f64> = Rolling::new(&mut running_var, 2).unwrap();
for x in data.into_iter() {
rolling_var.update(x);
}
assert_eq!(rolling_var.get(), 0.5);
安装
将以下行添加到您的 cargo.toml
[dependencies]
watermill = "0.1.0"
可用的统计信息
统计信息 | 可滚动? |
---|---|
平均值 | ✅ |
方差 | ✅ |
总和 | ✅ |
最小值 | ✅ |
最大值 | ✅ |
计数 | ❌ |
分位数 | ✅ |
峰值到峰值 | ✅ |
指数加权平均值 | ❌ |
指数加权方差 | ❌ |
四分位距 | ✅ |
峰度 | ❌ |
偏度 | ❌ |
协方差 | ❌ |
灵感来源
Python 中的 river
库的 stats
模块极大地启发了这个 crate。
依赖关系
~1.4–2.3MB
~49K SLoC