#time-series #union

dataseries

dataseries 对 Rust 的支持

6 个版本

0.1.6 2023年9月7日
0.1.5 2023年9月1日
0.1.4 2023年8月31日
0.1.2 2023年7月29日

6#union

每月 44 次下载

MIT 许可证

35KB
818

dataseries

License:MIT build codecov docs.rs crates.io crates.io (recent)

data-series 和时间序列的函数支持

函数

union

两个序列之间的连续时间序列联合。左右数据可以不存在(只有左右的情况)。

          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

示例

简单

两个时序之间 union 的简单示例

交集

使用 union 函数实现的交集实现。

最终一致性和冲突解决

crdt 示例提供了一个基于数据序列 union 的无冲突复杂数据类型解决示例。

VersionedValue 定义了版本(这里是一个时间戳),通过取最大版本来解决冲突。最大值通过 Ord 特性定义,并在 union 使用的给定函数中使用。

以下示例使用 TimestampMicros 对数据进行版本控制,并通过取值的最高版本来解决冲突。

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)),
];

无运行时依赖