TimeSeries 是一个简单的 Swift 包,可以非常容易地处理采样的实时数据(例如 IoT、天气、家庭、健身数据)。样本被高效地捕获和存储,一旦捕获,就可以仅仅作为时间点被引用。该软件包有完整的文档和非常高的测试覆盖率。非常欢迎贡献。
TimeSeries
可以基于两种不同的 DataSeries
构建,它们在捕获新数据点时表现出不同的行为。第一种也是最简单的是 EventSeries
,它被设计用于朴素地捕获代表事件的数据(可以是任何类型)。第二种是 SampleSeries
,旨在捕获随时间变化的数值。它具有更复杂的行为,并且能够使用可定制的方法在不同的捕获之间进行插值。
EventSeries
捕获离散事件,例如安全系统记录检测到的人、宠物和汽车进入其视野。可以在同一时间捕获多个事件。与 TimeSeries
一起使用时,目前的汇总器包括 Count
和 CountIf
。
import TimeSeries
enum SecurityEvents {
case personDetected, petDetected, vehicleDetected
}
var drivewayCameraEvents = EventSeries<SecurityEvents>()
drivewayCameraEvents.capture(.personDetected, at: Date.now)
drivewayCameraEvents.capture(.petDetected, at: Date.now)
SampleSeries
捕获值类型,并且可以在它们之间进行插值。对于 Double
、Float
和 Int
,有一组标准的 Interpolator
。
RoundingInterpolator
假定该值从上一个值到下一个值的变化发生在它们之间时间的一半时。StepInterpolator
假定该值仅在捕获新值时才发生变化(类似于事件)。LinearInterpolator
从一个值线性变化到下一个值。与事件不同,被采样的值在同一时间只能有一个值,因此在完全相同的时间捕获两个值意味着最后一次调用捕获会覆盖前一次。最后,与 TimeSeries
一起使用时,可以使用更丰富的 Summarizer
。
Count
计算一段时间内的样本数量。CountIf
计算期间内满足提供的条件的样本数量。Average
生成该期间内值的平均值。MeasureValue
测量该期间内指定点(开始、中间或结束)的值。MinimumValue
返回该期间的最小值。MaximumValue
返回该期间的最大值。SumSamples
返回该期间内所有值的总和。import TimeSeries
var temps = SampleSeries<Double>()
temps.capture(currentTemp, at: Date.now)
要随后检索温度,您不再通过样本点引用,而是可以纯粹地按时间索引。
print(temps[Date.now.addingTimeInterval(-2.hours)])
TimeSeries
由其输入 DataSeries
使用的类型专门化,并基于其自身的 TimeSeriesDataType
提供固定间隔的数据点集。它通过使用适合 DataSeries
类型的 Summarizer
来实现这一点(见上文)。例如,如果您连续采样温度,您可能希望拥有一个涵盖过去 24 小时的时间序列,报告每小时的平均温度。
这对于生成图表(例如用于 Swift Charts)非常有用。
let last24Hours = TimeSeries<Double,Double>(from: Date.now, for: -24.hours, every: 1.hours, using: SampleSeries<Double>())
// Print the temperature halfway through
print(last24Hours[11])