Utilizando a biblioteca de séries temporais
Para começar a trabalhar com a biblioteca de séries temporais, importe-a para o seu notebook ou aplicativo do Python.
Use este comando para importar a biblioteca de séries temporais:
# Import the package
import tspy
Criação de uma série temporal
Para criar uma série temporal e utilizar as funções da biblioteca, é necessário definir a fonte de dados. As fontes de dados compatíveis incluem:
- Listas em memória
- pandas DataFrames
- Coleções de observações na memória (usando o
ObservationCollectionconstruct) - Leitores definidos pelo usuário (usando a
TimeSeriesReaderconstrução)
O exemplo a seguir mostra como importar 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
Você também pode operar em várias séries temporais ao mesmo tempo usando a MultiTimeSeries construção. A MultiTimeSeries é, essencialmente, um dicionário de séries temporais, em que cada série temporal possui sua própria chave exclusiva. As séries temporais não estão alinhadas no tempo.
A MultiTimeSeries estrutura oferece métodos semelhantes para transformação e importação, assim como a estrutura 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])
})
O resultado é o 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 utiliza um tipo long de dados para indicar quando uma determinada observação foi criada, o que é conhecido como marca temporal. Um sistema de referência temporal é utilizado para séries temporais com carimbos de data/hora que possam ser interpretados por pessoas. Consulte “Utilização do sistema de referência temporal ”.
O exemplo a seguir mostra como criar uma série temporal simples em que cada índice representa um dia após a hora 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
Realizando transformações simples
As transformações são funções que, quando recebem uma ou mais séries temporais, retornam uma nova série temporal.
Por exemplo, para segmentar uma série temporal em janelas, sendo que cada janela tem size=3, e desliza 2 registros, você pode usar o seguinte método:
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 como somar 1 a cada valor de 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 você pode realizar uma junção à esquerda temporal de uma série temporal, 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]
Utilização de transformadores
O pacote transformers oferece um amplo conjunto de transformadores integrados. Importe o pacote para usar as funções de transformação fornecidas:
from tspy.builders.functions import transformers
Depois de adicionar o pacote, você pode transformar os dados de uma série temporal usando o transform método.
Por exemplo, para calcular a diferença em uma série temporal:
ts_diff = ts.transform(transformers.difference())
Aqui, o resultado é:
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
Utilização de redutores
Da mesma forma que no pacote transformers, é possível reduzir uma série temporal utilizando os métodos fornecidos pelo pacote reducers. Você pode importar o pacote reducers da seguinte maneira:
from tspy.builders.functions import reducers
Depois de importar o pacote, use o reduce método para calcular a média de uma série temporal. Por exemplo:
avg = ts.reduce(reducers.average())
avg
Isso gera o seguinte resultado:
5.0
Os redutores possuem uma propriedade especial que permite que sejam utilizados em conjunto com transformações de segmentação (soma por hora, média na janela anterior à ocorrência de um erro e outras). Como a saída de um segmentation + reducer é uma série temporal, utiliza-se o transform método.
Por exemplo, para segmentar em janelas de tamanho 3 e calcular 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
Representação gráfica de séries temporais
A avaliação preguiçosa é utilizada ao representar graficamente uma série temporal. Ao representar graficamente uma série temporal, você pode realizar uma das seguintes ações:
- Recolha as observações da série temporal, o que retorna um
BoundTimeSeries - Reduzir a série temporal a um valor ou a um conjunto de valores
- Executar operações de 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 extrair um intervalo de uma série temporal, use:
observations = ts[1:3] # same as ts.materialize(1, 3)
observations
Aqui, o resultado é:
[(1,2.0),(2,4.0),(3,6.0)]
Observe que uma série temporal é otimizada para consultas de intervalo se for de natureza periódica.
Ao aplicar a função describe a uma série temporal atual, ela também representa graficamente a série temporal:
describe_obj = ts.describe()
describe_obj
O resultado é:
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