要开始使用时间序列库,请将该库导入到 Python 笔记本或应用程序。
使用以下命令来导入时间序列库:
# Import the package
import tspy
创建时间序列
要创建时间序列并使用库函数,您必须确定数据源。 支持的数据源包括:
- 内存中的列表
- pandas 数据框
- 内存中的观测值集合(使用
ObservationCollection
构造) - 用户定义的阅读器(使用
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
构造来同时处理多个时间序列。 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
使用缩减器
与 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
了解更多信息
父主题: 时间序列分析