使用时间序列库

要开始使用时间序列库,请将该库导入到 Python 笔记本或应用程序。

使用以下命令来导入时间序列库:

# Import the package
import tspy

创建时间序列

要创建时间序列并使用库函数,您必须先确定数据源。 支持的数据源包括:

  • 内存列表
  • pandas DataFrames
  • 内存中的观测数据集合(使用 ` ObservationCollection construct` 结构)
  • 用户自定义读取器(使用 构造 TimeSeriesReader

以下示例演示了如何从内存列表中读取数据:

ts = tspy.time_series([5.0, 2.0, 4.0, 6.0, 6.0, 7.0])
ts

输出结果如下:

TimeStamp: 0     Value: 5.0
TimeStamp: 1     Value: 2.0
TimeStamp: 2     Value: 4.0
TimeStamp: 3     Value: 6.0
TimeStamp: 4     Value: 6.0
TimeStamp: 5     Value: 7.0

您还可以使用 构造 MultiTimeSeries 同时对多个时间序列进行操作。 A 本质 MultiTimeSeries 上是一个时间序列字典,其中每个时间序列都有一个唯一的键。 这些时间序列在时间上未对齐。

MultiTimeSeries 构造体提供了与单时间序列构造体类似的转换和摄取方法:

mts = tspy.multi_time_series({
	"ts1": tspy.time_series([1.0, 2.0, 3.0]),
	"ts2": tspy.time_series([5.0, 2.0, 4.0, 5.0])
})

输出结果如下:

ts2 time series
------------------------------
TimeStamp: 0     Value: 5.0
TimeStamp: 1     Value: 2.0
TimeStamp: 2     Value: 4.0
TimeStamp: 3     Value: 5.0
ts1 time series
------------------------------
TimeStamp: 0     Value: 1.0
TimeStamp: 1     Value: 2.0
TimeStamp: 2     Value: 3.0

解读时间

默认情况下,时间序列使用一种 long 数据类型来表示特定观测值的生成时间,这被称为时间戳。 时间参考系统用于具有人类可读时间戳的时间序列。 请参阅 “使用时间参考系统 ”。

以下示例演示了如何创建一个简单的时间序列,其中每个索引表示从开始时间起 1990-01-01的一天:

import datetime
granularity = datetime.timedelta(days=1)
start_time = datetime.datetime(1990, 1, 1, 0, 0, 0, 0, tzinfo=datetime.timezone.utc)

ts = tspy.time_series([5.0, 2.0, 4.0, 6.0, 6.0, 7.0], granularity=granularity, start_time=start_time)
ts

输出结果如下:

TimeStamp: 1990-01-01T00:00Z     Value: 5.0
TimeStamp: 1990-01-02T00:00Z     Value: 2.0
TimeStamp: 1990-01-03T00:00Z     Value: 4.0
TimeStamp: 1990-01-04T00:00Z     Value: 6.0
TimeStamp: 1990-01-05T00:00Z     Value: 6.0
TimeStamp: 1990-01-06T00:00Z     Value: 7.0

执行简单的变换

变换是指一种函数,当给定一个或多个时间序列时,它会返回一个新的时间序列。

例如,若要将时间序列划分为多个时间窗,每个时间窗包含 条记录 size=3,并以每次移动 2 条记录的方式滑动,可以使用以下方法:

window_ts = ts.segment(3, 2)
window_ts

输出结果如下:

TimeStamp: 0     Value: original bounds: (0,2) actual bounds: (0,2) observations: [(0,5.0),(1,2.0),(2,4.0)]
TimeStamp: 2     Value: original bounds: (2,4) actual bounds: (2,4) observations: [(2,4.0),(3,6.0),(4,6.0)]

此示例演示了如何将 1 加到时间序列中的每个值上:

add_one_ts = ts.map(lambda x: x + 1)
add_one_ts

输出结果如下:

TimeStamp: 0     Value: 6.0
TimeStamp: 1     Value: 3.0
TimeStamp: 2     Value: 5.0
TimeStamp: 3     Value: 7.0
TimeStamp: 4     Value: 7.0
TimeStamp: 5     Value: 8.0

或者,你可以对时间序列进行临时左连接,例如 ts 与另一个时间序列进行连接 ts2

ts2 = tspy.time_series([1.0, 2.0, 3.0])
joined_ts = ts.left_join(ts2)
joined_ts

输出结果如下:

TimeStamp: 0     Value: [5.0, 1.0]
TimeStamp: 1     Value: [2.0, 2.0]
TimeStamp: 2     Value: [4.0, 3.0]
TimeStamp: 3     Value: [6.0, null]
TimeStamp: 4     Value: [6.0, null]
TimeStamp: 5     Value: [7.0, null]

使用变压器

transformers 包中提供了丰富的内置变换器。 导入该包以使用其中提供的转换函数:

from tspy.builders.functions import transformers

添加包后,您可以使用 方法 transform 对时间序列数据进行转换。

例如,对时间序列进行差分:

ts_diff = ts.transform(transformers.difference())

这里的输出是:

TimeStamp: 1     Value: -3.0
TimeStamp: 2     Value: 2.0
TimeStamp: 3     Value: 2.0
TimeStamp: 4     Value: 0.0
TimeStamp: 5     Value: 1.0

使用 reducer

与 transformers 包类似,您可以使用 reducers 包提供的方法对时间序列进行折叠处理。 您可以按以下方式导入 reducers 包:

from tspy.builders.functions import reducers

导入包后,请使用 reduce 方法获取时间序列的平均值,例如:

avg = ts.reduce(reducers.average())
avg

这将输出:

5.0

缩减器具有一项特殊属性,使其能够与分段转换(如每小时求和、在发生错误前的窗口内求平均值等)配合使用。 由于 的输出是一个 segmentation + reducer 时间序列,因此采用 transform 方法。

例如,若要按大小为 3 的窗口进行分段并计算每个窗口的平均值,请使用:

avg_windows_ts = ts.segment(3).transform(reducers.average())

这导致:

imeStamp: 0     Value: 3.6666666666666665
TimeStamp: 1     Value: 4.0
TimeStamp: 2     Value: 5.333333333333333
TimeStamp: 3     Value: 6.333333333333333

绘制时间序列图

绘制时间序列图时会使用懒惰求值。 绘制时间序列图时,您可以执行以下任一操作:

  • 收集时间序列的观测值,这将返回 BoundTimeSeries
  • 将时间序列简化为一个值或一组值
  • 执行保存或打印操作

例如,要收集并返回时间序列的所有值:

observations = ts.materialize()
observations

这导致:

[(0,5.0),(1,2.0),(2,4.0),(3,6.0),(4,6.0),(5,7.0)]

要从时间序列中提取一个区间,请使用:

observations = ts[1:3] # same as ts.materialize(1, 3)
observations

这里的输出是:

[(1,2.0),(2,4.0),(3,6.0)]

请注意,如果时间序列本身具有周期性,则其针对范围查询进行了优化。

对当前时间序列应用该函数 describe 时,也会绘制该时间序列的图表:

describe_obj = ts.describe()
describe_obj

输出结果是:

min inter-arrival-time: 1
max inter-arrival-time: 1
mean inter-arrival-time: 1.0
top: 6.0
unique: 5
frequency: 2
first: TimeStamp: 0     Value: 5.0
last: TimeStamp: 5     Value: 7.0
count: 6
mean:5.0
std:1.632993161855452
min:2.0
max:7.0
25%:3.5
50%:5.5
75%:6.25

了解更多