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

Saiba mais