时间序列函数
时间序列函数是可处理在时间点测量的数据值序列的聚集函数。
以下部分描述了各种时间序列包中提供的一些时间序列函数。
变换
变换是应用于一个时间序列来生成另一个时间序列的函数。 时间序列库支持各种类型的变换,包括提供的变换 (通过使用 from tspy.functions import transformers
) 以及用户定义的变换。
以下样本显示了一些系统提供的变换:
#Interpolation
>>> ts = tspy.time_series([1.0, 2.0, 3.0, 4.0, 5.0, 6.0])
>>> periodicity = 2
>>> interp = interpolators.nearest(0.0)
>>> interp_ts = ts.resample(periodicity, interp)
>>> interp_ts.print()
TimeStamp: 0 Value: 1.0
TimeStamp: 2 Value: 3.0
TimeStamp: 4 Value: 5.0
#Fillna
>>> shift_ts = ts.shift(2)
print("shifted ts to add nulls")
print(shift_ts)
print("\nfilled ts to make nulls 0s")
null_filled_ts = shift_ts.fillna(interpolators.fill(0.0))
print(null_filled_ts)
shifted ts to add nulls
TimeStamp: 0 Value: null
TimeStamp: 1 Value: null
TimeStamp: 2 Value: 1.0
TimeStamp: 3 Value: 2.0
TimeStamp: 4 Value: 3.0
TimeStamp: 5 Value: 4.0
filled ts to make nulls 0s
TimeStamp: 0 Value: 0.0
TimeStamp: 1 Value: 0.0
TimeStamp: 2 Value: 1.0
TimeStamp: 3 Value: 2.0
TimeStamp: 4 Value: 3.0
TimeStamp: 5 Value: 4.0
# Additive White Gaussian Noise (AWGN)
>>> noise_ts = ts.transform(transformers.awgn(mean=0.0,sd=.03))
>>> print(noise_ts)
TimeStamp: 0 Value: 0.9962378841388397
TimeStamp: 1 Value: 1.9681980879378596
TimeStamp: 2 Value: 3.0289374962174405
TimeStamp: 3 Value: 3.990728648807705
TimeStamp: 4 Value: 4.935338359740761
TimeStamp: 5 Value: 6.03395072999318
分段
分段或窗口是将时间序列拆分为多个分段的过程。 此时间序列库支持各种形式的分段,并且还允许创建用户定义的分段。
-
基于窗口的分段
这种类型的时间序列分段基于用户指定的分段大小。 分段可以基于记录或基于时间。 可以使用多个选项来创建基于翻转窗口的分段和基于滑动窗口的分段。
>>> import sparktspy as tspy >>> ts_orig = tspy.builder() .add(tspy.observation(1,1.0)) .add(tspy.observation(2,2.0)) .add(tspy.observation(6,6.0)) .result().to_time_series() >>> ts_orig TimeStamp: 1 Value: 1.0 TimeStamp: 2 Value: 2.0 TimeStamp: 6 Value: 6.0 >>> ts = ts_orig.segment_by_time(3,1) >>> ts TimeStamp: 1 Value: original bounds: (1,3) actual bounds: (1,2) observations: [(1,1.0),(2,2.0)] TimeStamp: 2 Value: original bounds: (2,4) actual bounds: (2,2) observations: [(2,2.0)] TimeStamp: 3 Value: this segment is empty TimeStamp: 4 Value: original bounds: (4,6) actual bounds: (6,6) observations: [(6,6.0)]
-
基于锚点的分段
基于锚点的分段是一种很重要的分段类型,它通过以特定 lambda(可以是简单值)为锚点来创建分段。 例如,查找 500 错误之前的事件,或者在观察到异常后检查值。 基于锚点的分段有很多变体,其中包括用于提供具有多个标记的范围的分段。
>>> import sparktspy as tspy >>> ts_orig = tspy.time_series([1.0, 2.0, 3.0, 4.0, 5.0]) >>> ts_orig TimeStamp: 0 Value: 1.0 TimeStamp: 1 Value: 2.0 TimeStamp: 2 Value: 3.0 TimeStamp: 3 Value: 4.0 TimeStamp: 4 Value: 5.0 >>> ts = ts_orig.segment_by_anchor(lambda x: x % 2 == 0, 1, 2) >>> ts TimeStamp: 1 Value: original bounds: (0,3) actual bounds: (0,3) observations: [(0,1.0),(1,2.0),(2,3.0),(3,4.0)] TimeStamp: 3 Value: original bounds: (2,5) actual bounds: (2,4) observations: [(2,3.0),(3,4.0),(4,5.0)]
-
分段器
通过导入
segmenters
包 (使用from tspy.functions import segmenters
) ,提供了几个开箱即用的专用分段器。 例如,使用回归对时间序列进行分段的分段器:>>> ts = tspy.time_series([1.0,2.0,3.0,4.0,5.0,2.0,1.0,-1.0,50.0,53.0,56.0]) >>> max_error = .5 >>> skip = 1 >>> reg_sts = ts.to_segments(segmenters.regression(max_error,skip,use_relative=True)) >>> reg_sts TimeStamp: 0 Value: range: (0, 4) outliers: {} TimeStamp: 5 Value: range: (5, 7) outliers: {} TimeStamp: 8 Value: range: (8, 10) outliers: {}
缩减器
缩减器是应用于一组时间序列上的多个值来生成单个值的函数。 时间序列 reducer
函数类似于 Hadoop/Spark 所使用的缩减器概念。 该单个值可以是集合,但通常是一个对象。 缩减器函数的一个示例是对时间序列中的多个值求平均值。
支持多个 reducer
函数,包括:
-
距离缩减器
距离缩减器是用于计算两个时间序列之间的距离的一类缩减器。 该库支持针对序列的数字和分类距离函数。 其中包括时间弯曲距离测量,例如,Itakura Parallelogram、Sakoe-Chiba Band、无约束的 DTW 和无时间弯曲约束的 DTW。 也可以提供分布距离(例如,Hungarian 距离和 Earth-Movers 距离)。
对于分类时间序列距离测量,可以使用 Damerau Levenshtein 和 Jaro-Winkler 距离测量算法。
>>> from tspy.functions import * >>> ts = tspy.time_series([1.0, 2.0, 3.0, 4.0, 5.0, 6.0]) >>> ts2 = ts.transform(transformers.awgn(sd=.3)) >>> dtw_distance = ts.reduce(ts2,reducers.dtw(lambda obs1, obs2: abs(obs1.value - obs2.value))) >>> print(dtw_distance) 1.8557981638880405
-
数学缩减器
提供了多个适用于数字时间序列的便利数学缩减器。 其中包括基本缩减器,例如,平均值、总和、标准差和矩。 还包括熵、峰度、FFT 及其变体、各种相关性以及直方图。 方便的基本汇总缩减器是提供有关时间序列的基本信息的
describe
函数。>>> from tspy.functions import * >>> ts = tspy.time_series([1.0, 2.0, 3.0, 4.0, 5.0, 6.0]) >>> ts2 = ts.transform(transformers.awgn(sd=.3)) >>> corr = ts.reduce(ts2, reducers.correlation()) >>> print(corr) 0.9938941942380525 >>> adf = ts.reduce(reducers.adf()) >>> print(adf) pValue: -3.45 satisfies test: false >>> ts2 = ts.transform(transformers.awgn(sd=.3)) >>> granger = ts.reduce(ts2, reducers.granger(1)) >>> print(granger) #f_stat, p_value, R2 -1.7123613937876463,-3.874412217575385,1.0
-
另一个可用于初步了解时间序列的基本缩减器是 describe 缩减器。 下面阐述了此缩减器:
>>> desc = ts.describe() >>> print(desc) min inter-arrival-time: 1 max inter-arrival-time: 1 mean inter-arrival-time: 1.0 top: null unique: 6 frequency: 1 first: TimeStamp: 0 Value: 1.0 last: TimeStamp: 5 Value: 6.0 count: 6 mean:3.5 std:1.707825127659933 min:1.0 max:6.0 25%:1.75 50%:3.5 75%:5.25
时间连接
此库包含时间连接函数或用于基于时间戳记来连接时间序列的函数。 这些连接函数类似于数据库中的连接函数,包括左连接、右连接、外连接、内连接、左外连接和右外连接等。 以下样本代码显示了其中的一些连接函数:
# Create a collection of observations (materialized TimeSeries)
observations_left = tspy.observations(tspy.observation(1, 0.0), tspy.observation(3, 1.0), tspy.observation(8, 3.0), tspy.observation(9, 2.5))
observations_right = tspy.observations(tspy.observation(2, 2.0), tspy.observation(3, 1.5), tspy.observation(7, 4.0), tspy.observation(9, 5.5), tspy.observation(10, 4.5))
# Build TimeSeries from Observations
ts_left = observations_left.to_time_series()
ts_right = observations_right.to_time_series()
# Perform full join
ts_full = ts_left.full_join(ts_right)
print(ts_full)
TimeStamp: 1 Value: [0.0, null]
TimeStamp: 2 Value: [null, 2.0]
TimeStamp: 3 Value: [1.0, 1.5]
TimeStamp: 7 Value: [null, 4.0]
TimeStamp: 8 Value: [3.0, null]
TimeStamp: 9 Value: [2.5, 5.5]
TimeStamp: 10 Value: [null, 4.5]
# Perform left align with interpolation
ts_left_aligned, ts_right_aligned = ts_left.left_align(ts_right, interpolators.nearest(0.0))
print("left ts result")
print(ts_left_aligned)
print("right ts result")
print(ts_right_aligned)
left ts result
TimeStamp: 1 Value: 0.0
TimeStamp: 3 Value: 1.0
TimeStamp: 8 Value: 3.0
TimeStamp: 9 Value: 2.5
right ts result
TimeStamp: 1 Value: 0.0
TimeStamp: 3 Value: 1.5
TimeStamp: 8 Value: 4.0
TimeStamp: 9 Value: 5.5
预测
此时间序列库提供的一个关键功能是预测。 该库包含适用于简单和复杂预测模型的函数,其中包括 ARIMA、Exponential、Holt-Winters 和 BATS。 以下示例显示了用于创建 Holt-Winters 的函数:
import random
model = tspy.forecasters.hws(samples_per_season=samples_per_season, initial_training_seasons=initial_training_seasons)
for i in range(100):
timestamp = i
value = random.randint(1,10) * 1.0
model.update_model(timestamp, value)
print(model)
Forecasting Model
Algorithm: HWSAdditive=5 (aLevel=0.001, bSlope=0.001, gSeas=0.001) level=6.087789839896166, slope=0.018901997884893912, seasonal(amp,per,avg)=(1.411203455586738,5, 0,-0.0037471500727535465)
#Is model init-ed
if model.is_initialized():
print(model.forecast_at(120))
6.334135728495107
ts = tspy.time_series([float(i) for i in range(10)])
print(ts)
TimeStamp: 0 Value: 0.0
TimeStamp: 1 Value: 1.0
TimeStamp: 2 Value: 2.0
TimeStamp: 3 Value: 3.0
TimeStamp: 4 Value: 4.0
TimeStamp: 5 Value: 5.0
TimeStamp: 6 Value: 6.0
TimeStamp: 7 Value: 7.0
TimeStamp: 8 Value: 8.0
TimeStamp: 9 Value: 9.0
num_predictions = 5
model = tspy.forecasters.auto(8)
confidence = .99
predictions = ts.forecast(num_predictions, model, confidence=confidence)
print(predictions.to_time_series())
TimeStamp: 10 Value: {value=10.0, lower_bound=10.0, upper_bound=10.0, error=0.0}
TimeStamp: 11 Value: {value=10.997862810553725, lower_bound=9.934621260488143, upper_bound=12.061104360619307, error=0.41277640121597475}
TimeStamp: 12 Value: {value=11.996821082897318, lower_bound=10.704895525154571, upper_bound=13.288746640640065, error=0.5015571318964149}
TimeStamp: 13 Value: {value=12.995779355240911, lower_bound=11.50957896664928, upper_bound=14.481979743832543, error=0.5769793776877866}
TimeStamp: 14 Value: {value=13.994737627584504, lower_bound=12.33653268707341, upper_bound=15.652942568095598, error=0.6437557559526337}
print(predictions.to_time_series().to_df())
timestamp value lower_bound upper_bound error
0 10 10.000000 10.000000 10.000000 0.000000
1 11 10.997863 9.934621 12.061104 0.412776
2 12 11.996821 10.704896 13.288747 0.501557
3 13 12.995779 11.509579 14.481980 0.576979
4 14 13.994738 12.336533 15.652943 0.643756
时间序列 SQL
此时间序列库与 Apache Spark 紧密集成。 通过使用 Spark Catalyst 中的新数据类型,您可以执行时间序列 SQL 操作以使用 Apache Spark 进行水平扩展。 这使您能够在 IBM Analytics Engine 或包含 IBM Analytics Engine 功能 (例如 Watson Studio Spark 环境) 的解决方案中轻松使用时间序列扩展。
SQL 扩展涵盖时间序列函数的大部分方面,包括分段,变换,还原器,预测和 I/O。 请参阅 分析时间序列数据。
了解更多
要使用 tspy
Python SDK ,请参阅 tspy
Python SDK 文档。