Watermill.rs
🦀 Online statistics in Rust
Install / Use
/learn @online-ml/Watermill.rsREADME
Online statistics in Rust 🦀
watermill is crate 🦀 for Blazingly fast, generic and serializable online statistics.
Quickstart
Let's compute the online median and then serialize it:
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();
Now let's compute the online sum using the iterators:
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); // ^^^^^^^^^^
}
You can also compute rolling statistics; in the following example let's compute the rolling sum on 2 previous data:
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);
Installation
Add the following line to your cargo.toml:
[dependencies]
watermill = "0.1.0"
Statistics available
| Statistics | Rollable ?| |--------------------------------- |---------- | | Mean | ✅ | | Variance | ✅ | | Sum | ✅ | | Min | ✅ | | Max | ✅ | | Count | ❌ | | Quantile | ✅ | | Peak to peak | ✅ | | Exponentially weighted mean | ❌ | | Exponentially weighted variance | ❌ | | Interquartile range | ✅ | | Kurtosis | ❌ | | Skewness | ❌ | | Covariance | ❌ |
Inspiration
The stats module of the river library in Python greatly inspired this crate.
Related Skills
himalaya
352.0kCLI to manage emails via IMAP/SMTP. Use `himalaya` to list, read, write, reply, forward, search, and organize emails from the terminal. Supports multiple accounts and message composition with MML (MIME Meta Language).
node-connect
352.0kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
taskflow
352.0kname: taskflow description: Use when work should span one or more detached tasks but still behave like one job with a single owner context. TaskFlow is the durable flow substrate under authoring layer
frontend-design
111.1kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
