时间序列函数
时间序列函数是一类聚合函数,它们作用于在特定时间点测得的数据值序列。
以下各节介绍了不同时间序列包中提供的一些时间序列函数。
转换
变换是指作用于时间序列并产生另一个时间序列的函数。 该时间序列库支持多种类型的转换,包括内置转换(通过使用 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 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 上(该 lambda 可以是一个简单的值)来创建一个分段。 例如,分析导致 500 错误发生前的相关事件,或在发现异常后检查相关数值。 锚点分割的变体包括提供包含多个标记的范围。
>>> import 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概念类似。 该单一值可以是一个集合,但通常是一个单一对象。 缩减函数的一个示例是计算时间序列中各值的平均值。
支持多种 reducer 功能,包括:
距离缩减器
距离缩减器是一类用于计算两条时间序列之间距离的缩减器。 该库支持对序列应用数值型和分类型距离函数。 其中包括基于时间扭曲的距离测量方法,例如板仓平行四边形、佐古江-千叶带、无约束DTW以及无时间扭曲约束DTW。 此外,还提供了匈牙利距离和土方工程距离等分布距离。
对于分类时间序列的距离测量,您可以使用达默罗-莱文斯坦(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另一个非常有用的基本 reducer 是 describe reducer,它有助于对时间序列建立初步的理解。 以下示例演示了该 reducer:
>>> 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、指数、霍尔特-温特斯和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 中的新数据类型,您可以利用 Apache Spark 执行能够横向扩展的时间序列 SQL 操作。 这使您能够轻松地在 IBM Analytics Engine 中,或在包含 IBM Analytics Engine 功能的解决方案(如 Watson Studio Spark环境)中使用时间序列扩展。
SQL 扩展涵盖了时间序列函数的大部分方面,包括分段、转换、归约器、预测和 I/O。请参阅 “分析时间序列数据”。
了解更多
要使用 tspy Python SDK ,请参阅 tspy Python SDK 文档。