Usando a biblioteca de série temporal
Para começar a trabalhar com a biblioteca de séries temporais, importe a biblioteca para o seu notebook ou aplicativo Python.
Use este comando para importar a biblioteca de séries temporais:
# Import the package
import tspy
Criando uma série temporal
Para criar uma série temporal e usar as funções da biblioteca, deve-se decidir sobre a origem de dados. As origens de dados suportadas incluem:
- Listas na memória
- DataFrames de pandas
- Coleções de observações na memória (usando a construção
ObservationCollection) - Leitores definidos pelo usuário (usando a construção
TimeSeriesReader)
O exemplo a seguir mostra dados de ingestão de dados de uma lista na memória:
ts = tspy.time_series([5.0, 2.0, 4.0, 6.0, 6.0, 7.0])
ts
A saída é a seguinte:
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
Também é possível operar em muitas séries temporais ao mesmo tempo usando a construção MultiTimeSeries. Um MultiTimeSeries é essencialmente um dicionário de séries temporais, onde cada série temporal tem sua própria chave única. As séries temporais não estão alinhadas no tempo.
A construção MultiTimeSeries fornece métodos semelhantes para transformação e ingestão, como a construção de série temporal única:
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])
})
A saída é a seguinte:
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
Interpretando o tempo
Por padrão, uma série temporal usa um tipo de dado long para denotar quando uma determinada observação foi criada, a qual é referida como marcação de tempo. Um sistema de referência de tempo é usado para séries temporais com registros de data e hora interpretáveis por humanos. Consulte Usando sistema de referência de tempo.
O exemplo a seguir mostra como criar uma série temporal simples em que cada índice denota um dia após o horário de início de 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
A saída é a seguinte:
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
Executando transformações simples
As transformações são funções que, quando dada uma ou mais séries temporais, retornam uma nova série temporal.
Por exemplo, para segmentar uma série temporal em janelas, em que cada janela é de size=3, deslizando por 2 registros, é possível utilizar o método a seguir:
window_ts = ts.segment(3, 2)
window_ts
A saída é a seguinte:
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)]
Este exemplo mostra a inclusão de 1 em cada valor em uma série temporal:
add_one_ts = ts.map(lambda x: x + 1)
add_one_ts
A saída é a seguinte:
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
Ou é possível deixar uma série temporal de lado temporalmente, por exemplo ts com outra série temporal ts2:
ts2 = tspy.time_series([1.0, 2.0, 3.0])
joined_ts = ts.left_join(ts2)
joined_ts
A saída é a seguinte:
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]
Usando transformadores
Uma rico conjunto de transformadores integrados é fornecido no pacote de transformadores. Importe o pacote para usar as funções de transformador fornecidas:
from tspy.builders.functions import transformers
Depois de incluir o pacote, é possível transformar dados em uma série temporal usando o método transform.
Por exemplo, para executar uma diferença em uma série temporal:
ts_diff = ts.transform(transformers.difference())
Aqui a saída é:
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
Usando redutores
Semelhante ao pacote de transformadores, é possível reduzir uma série temporal usando métodos fornecidos pelo pacote de redutores. É possível importar o pacote de redutores da seguinte forma:
from tspy.builders.functions import reducers
Depois de importar o pacote, use o método reduce para obter a média sobre uma série temporal, por exemplo:
avg = ts.reduce(reducers.average())
avg
Isso produz:
5.0
Os redutores possuem uma propriedade especial que permite que eles sejam usados junto com transformações de segmentação (soma horária, média na janela antes de ocorrer um erro e outros). Como a saída de um segmentation + reducer é uma série temporal, o método transform é usado.
Por exemplo, para segmentar em janelas do tamanho 3 e obter a média em cada janela, use:
avg_windows_ts = ts.segment(3).transform(reducers.average())
Isso resulta em:
imeStamp: 0 Value: 3.6666666666666665
TimeStamp: 1 Value: 4.0
TimeStamp: 2 Value: 5.333333333333333
TimeStamp: 3 Value: 6.333333333333333
Criando gráficos de séries temporais
A avaliação preguiçosa é usada na criação de um gráfico de série temporal. Quando você cria um gráfico de série temporal, é possível executar uma das ações a seguir:
- Coletar as observações da série temporal, que retorna um
BoundTimeSeries - Reduzir a série temporal a um valor ou a uma coleta de valores
- Executar as operações salvar ou imprimir
Por exemplo, para coletar e retornar todos os valores de uma série temporal:
observations = ts.materialize()
observations
Isso resulta em:
[(0,5.0),(1,2.0),(2,4.0),(3,6.0),(4,6.0),(5,7.0)]
Para coletar um intervalo de uma série temporal, use:
observations = ts[1:3] # same as ts.materialize(1, 3)
observations
Aqui a saída é:
[(1,2.0),(2,4.0),(3,6.0)]
Observe que uma série temporal é otimizada para consultas de intervalo se a série temporal for periódica por natureza.
O uso de describe em uma série temporal atual também cria gráficos de série temporal:
describe_obj = ts.describe()
describe_obj
A saída é:
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