Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/online-ml/watermill.rs
🦀 Online statistics in Rust
https://github.com/online-ml/watermill.rs
crate online-statistics rust statistics stream-processing streaming
Last synced: 2 days ago
JSON representation
🦀 Online statistics in Rust
- Host: GitHub
- URL: https://github.com/online-ml/watermill.rs
- Owner: online-ml
- License: mit
- Created: 2022-06-14T14:41:32.000Z (over 2 years ago)
- Default Branch: master
- Last Pushed: 2023-02-10T08:57:32.000Z (almost 2 years ago)
- Last Synced: 2024-11-10T06:11:36.078Z (5 days ago)
- Topics: crate, online-statistics, rust, statistics, stream-processing, streaming
- Language: Rust
- Homepage: https://docs.rs/watermill/
- Size: 106 KB
- Stars: 58
- Watchers: 6
- Forks: 1
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# 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:
```rust
use watermill::quantile::Quantile;
use watermill::stats::Univariate;
let data: Vec = vec![9., 7., 3., 2., 6., 1., 8., 5., 4.];
let mut running_median: Quantile = 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 = serde_json::from_str(&serialized).unwrap();```
Now let's compute the online sum using the iterators:
```rust
use watermill::iter::IterStatisticsExtend;
let data: Vec = vec![1., 2., 3.];
let vec_true: Vec = 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:
```rustuse watermill::rolling::Rolling;
use watermill::stats::Univariate;
use watermill::variance::Variance;
let data: Vec = vec![9., 7., 3., 2., 6., 1., 8., 5., 4.];
let mut running_var: Variance = Variance::default();
// We wrap `running_var` inside the `Rolling` struct.
let mut rolling_var: Rolling = 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`](https://github.com/online-ml/river) library in `Python` greatly inspired this crate.