Las funciones de series temporales son funciones de agregación que funcionan en las secuencias de valores de datos medidos en puntos específicos en el tiempo.
Las secciones siguientes describen algunas de las funciones de series temporales disponibles en paquetes de series temporales diferentes.
Transformaciones
Las transformaciones son funciones que se aplican en una serie temporal que da como resultadootra serie temporal. La biblioteca de series de temporales admite varios tipos de transformaciones, como transformaciones proporcionadas (mediante from tspy.functions import transformers
) y transformaciones definidas por el usuario.
En el ejemplo siguiente se muestran transformaciones suministradas:
#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
Segmentación
La segmentación o el sistema de ventanas es el proceso de dividir una serie temporal en varios segmentos. La biblioteca de series temporales da soporte a varias formas de segmentación y permite también la creación de segmentos definidos por usuario.
Segmentación basada en ventanas
Este tipo de segmentación de una serie temporal se basa en tamaños de segmentos especificados por el usuario. Los segmentos se pueden basar en registros o en tiempo. Existen opciones para permitir la creación de segmentos basados en ventanas con saltos de tamaño o deslizantes.
>>> 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)]
Segmentación basada en anclaje
La segmentación basada en ancla es un tipo de segmentación importante que crea un segmento anclándose en un lambda específico, que puede ser un valor simple. Un ejemplo es la búsqueda de los sucesos que precedieron a un error 500 o el examen de los valores después de observar una anomalía. Las variantes de una segmentación basada en ancla incluye suministrar un rango de varios marcadores.
>>> 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)]
Segmentadores
Hay varios segmentadores especializados que se proporcionan listos para utilizar importando el paquete de
segmenters
(mediantefrom tspy.functions import segmenters
). Un ejemplo de segmentador es uno que utiliza la regresión para segmentar una serie temporal:>>> 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: {}
Reductores
Un reductor es una función que se aplica a los valores en un conjunto de series temporales para producir un único valor. Las funciones reducer
de series temporales son similares al concepto de reductor utilizado por Hadoop/Spark. Este único valor puede ser una colección, pero en general se trata más de un único objeto. Un ejemplo de una función de reductor es el promedio de los valores de una serie temporal.
Se da soporte a varias funciones de reducer
, incluidos:
Reductores de distancia
Los reductores de distancia son una clase de reductores que calculan la distancia entre dos series temporales. La biblioteca da soporte a funciones de distancia numérica así como categórica en secuencias. Estas incluyen medidas de distancia de deformación tales como paralelogramo de Itakura, Banda de Sakoe-Chiba, restricciones deformadas DTW sin restricciones y DTW no temporales. También están disponibles las distancias de distribución tales como la distancia húngara y la distancia del motor de la tierra o Earth Mover.
Para medidas de distancia de serie temporal categórica puede utilizar las medidas de distancia Damerau Levenshtein y 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
Reductores matemáticos
Se suministran varios reductores matemáticos adecuados para series temporales numéricas. Incluyen algunos básicos como promedio, suma, desviación estándar y momentos. También se incluyen la entropía, la curtosis, FFT y sus variantes, diversas correlaciones y el histograma. Un reductor de resumen básico conveniente es la función
describe
que proporciona información básica sobre la serie temporal.>>> 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
Otro reductor básico que es muyy útil para obtener una comprensión de primer orden de las series temporales es el reductor describe. A continuación se ilustra este reductor:
>>> 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
Uniones temporales
La biblioteca incluye funciones para uniones temporales o uniones de series temporales basadas en sus indicaciones de fecha y hora. Las funciones de unión son similares a las de una base de datos, incluidos las uniones izquierda, derecha, exterior, interior, exterior izquierda y exterior derecha, etc. Los códigos de ejemplo siguientes muestran algunas de estas funciones de unión:
# 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
Previsiones
Una funcionalidad clave que proporciona la biblioteca de series temporales son las previsiones: La biblioteca incluye funciones para modelos de previsión simples, incluidos ARIMA, Exponencial, Holt-Winters y BATS En el ejemplo siguiente se muestra la función para crear un 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 de series temporales
La biblioteca de series temporales está estrechamente integrada con Apache Spark. Utilizando nuevos tipos de datos en Spark Catalyst, puede realizar operaciones SQL de serie temporal que se escalan horizontalmente utilizando Apache Spark. Esto le permite utilizar fácilmente extensiones de series temporales en IBM Analytics Engine o en soluciones que incluyen la funcionalidad IBM Analytics Engine como los entornos watsonx.ai Studio Spark.
Las extensiones SQL cubren la mayoría de los aspectos de las funciones de las series temporales, incluidas la segmentación, las transformaciones, los reductores, la previsión y la E/S. Consulte Análisis de datos de series temporales.
Más información
Para utilizar el SDK tspy
de Python, consulte la Documentación del SDK tspy
de Python.