| Crates.io | dataseries |
| lib.rs | dataseries |
| version | 0.1.6 |
| created_at | 2023-07-26 10:01:51.408583+00 |
| updated_at | 2023-09-07 11:33:08.061483+00 |
| description | dataseries support for rust |
| homepage | |
| repository | https://github.com/cboudereau/dataseries/tree/main/rust |
| max_upload_size | |
| id | 926323 |
| size | 67,844 |
data-series functions support for data-series and time-series.
Continuous time series union between 2 series. Left and right data can be absent (left and right only cases).
1 3 10 20
Left: |-----|-----|------------------|-
130 120 95 160
12 15
Right: |------|--------
105 110
1 3 10 12 15 20
Expected: |-----|-----|----|------|------|-
130,∅ 120,∅ 95,∅ 95,105 95,110 160,110
A simple example of union between 2 timeseries
An intersection implementation using the union function.
The crdt example provides an example of the conflict-free replicated data type resolution based on data-series union.
The VersionedValue defines the version (here a timestamp) to solve the conflict by taking the maximum version. The maximum is defined through the trait Ord and used inside the given function used by union.
The below example uses TimestampMicros to version the data and solve conflict by taking the highest version of a value.
fn datapoint<T>(timestamp_micros: TimestampMicros, date: Date, data: T) -> DataPoint<Date, Option<VersionedValue<TimestampMicros, T>>>
where
T: std::marker::Copy,
{
DataPoint::new(date, Some(VersionedValue::new(timestamp_micros, data)))
}
/// Interval can be encoded by using 2 Datapoints with a [`None`] last datapoint value to mark the end of each interval
fn end<T>(date: Date) -> DataPoint<Date, Option<VersionedValue<TimestampMicros, T>>> {
DataPoint::new(date, None)
}
let s1 = dataseries::of_iter(vec![
datapoint(TimestampMicros::new(1), date(2023, 1, 3), 50),
end(date(2023, 1, 10)),
]);
let s2 = dataseries::of_iter(vec![
datapoint(TimestampMicros::new(2), date(2023, 1, 4), 100),
end(date(2023, 1, 5)),
datapoint(TimestampMicros::new(2), date(2023, 1, 7), 110),
end(date(2023, 1, 9)),
]);
// Solves conflict by taking always the maximum version
let actual = s1
.union(s2, |x| match x {
dataseries::UnionResult::LeftOnly(x) | dataseries::UnionResult::RightOnly(x) => x,
dataseries::UnionResult::Union { left, right } => std::cmp::max(left, right),
})
.collect::<Vec<_>>();
let expected = vec![
datapoint(TimestampMicros::new(1), date(2023, 1, 3), 50),
datapoint(TimestampMicros::new(2), date(2023, 1, 4), 100),
datapoint(TimestampMicros::new(1), date(2023, 1, 5), 50),
datapoint(TimestampMicros::new(2), date(2023, 1, 7), 110),
datapoint(TimestampMicros::new(1), date(2023, 1, 9), 50),
end(date(2023, 1, 10)),
];