Por Ranieri Castelar
Série temporal é um tipo de conjunto de dados bastante útil e que tem sido gerado em um volume cada vez maior atualmente. Ele surge ao se indexar um conjunto de dados em relação ao tempo, tipicamente espaçando os pontos pertencentes a este conjunto de forma homogênea.
Como exemplo, poderíamos citar um equipamento que mede a temperatura de um motor uma vez a cada segundo e armazena essas informações em relação ao horário em que a medição foi feita.
O aumento do volume desse tipo de dado, que é gerado em intervalos cada vez menores e por um número cada vez maior de equipamentos, fez com que técnicas específicas se tornassem necessárias para seu armazenamento e manipulação. O surgimento de soluções de armazenamento especializadas é um dos fatores que representam essa necessidade.
Neste artigo, discutiremos algumas de suas peculiaridades e também algumas técnicas para seu armazenamento e processamento posterior.
Em próximos artigos, meus colegas, aqui da Daitan, explicarão como estão utilizando séries temporais, por exemplo, para fazer previsões via técnicas de aprendizado de máquina.
Esse tipo de análise pode revelar tendências, padrões sazonais, ou o impacto das mudanças efetuadas em um produto. Com um volume suficientemente grande de dados, também é possível perceber que alguns eventos ocorrem após o surgimento de padrões específicos na série temporal. Essa informação pode ser utilizada para prever ou para prevenir a ocorrência destes eventos.
Investidores, por exemplo, costumam utilizar esse tipo de informação durante o processo de tomada de decisões sobre em que e quando investir seus recursos.
Uma das formas de análise é feita por meio do uso de gráficos. A análise visual permite que o analista identifique padrões e absorva informações relevantes rapidamente. Nesse caso, a clareza com que os dados são exibidos se torna importante, já que a existência de ruído pode dificultar ou impedir a identificação de uma estrutura interna.
O impacto causado pelo ruído é normalmente diminuído por meio de técnicas como Médias Móveis ou Suavização Exponencial. A utilização desse tipo de técnica impede que mudanças bruscas – porém de curta duração – tenham um impacto significativo na série temporal, pois o valor do próximo ponto a ser adicionado à série leva em conta o valor dos pontos anteriores.
No caso da técnica de Suavização Exponencial, os valores antigos são considerados com um peso cada vez menor, de forma que pontos atuais tenham maior impacto sobre os próximos valores adicionados. Se relevante, o uso de SVMs (support vector machines, uma técnica de aprendizado de máquina) e modelos similares também permite que regressões não lineares possam ser aplicadas de forma relativamente simples.
O modo com que as séries são dispostas também pode impactar a clareza da análise. Os gráficos devem ir direto ao ponto, sem apresentar informação desnecessária, e devem ser pensados de forma que a informação buscada obtenha posição de destaque.
Mapas de calor, gráficos de barra e outros tipos de visualização devem ser considerados, mesmo que exista uma tendência a se utilizar um conjunto de gráficos de linha ao se lidar com séries temporais.
Redes Neurais Recorrentes (e outros tipos de modelos de aprendizado de máquina) também podem ser utilizados quando se existe um desejo de se realizar previsões ou detectar anomalias sem intervenção humana.
Disparar um alarme quando um valor X ultrapassa um limiar predeterminado é simples e útil em diversas situações, porém muitas vezes a detecção de anomalias requer um processo um pouco mais sofisticado.
Em uma série temporal, informações já coletadas não costumam ser modificadas, e novos dados são inseridos no final da série. Além disso, consultas são feitas sobre um intervalo contínuo da mesma.
Ferramentas de armazenamento como o TimescaleDB ou InfluxDB são projetadas para tirar vantagem dessas propriedades, evitando que o desempenho de armazenamento e consulta se degrade com um aumento no volume de dados.
Para que a análise dos dados seja executada de forma responsiva, este tipo de ferramenta deve prover consultas baseadas em tempo rápidas e de simples utilização, mesmo que a quantidade de linhas armazenadas aumente consideravelmente. Se possível, a capacidade de se executar consultas multidimensionais deve ser preservada.
Bancos de dados tradicionais costumam utilizar uma estrutura conhecida como Árvore B para indexar o conteúdo de suas tabelas, permitindo inserções em “complexidade computacional logarítmica” – o que significa que a complexidade cresce proporcionalmente ao logaritmo do número de linhas.
Soluções otimizadas para séries temporais evitam esse tipo de indexação, dando preferência para o uso de tabelas Hash, com inserções de custo computacional constante (ou seja, independente do número de linhas).
Além disso, como consultas às séries temporais são normalmente executadas sob um intervalo contínuo de tempo, estas soluções podem fazer uso do conceito de chunks. Basicamente, ao invés de armazenar todos os dados de uma série em uma única tabela, esta série é dividida em períodos específicos de tempo, e os dados de cada período são armazenados em tabelas separadas. Isso é transparente para o usuário, já que a complexidade adicional é abstraída. O TimeScaleDB, por exemplo, executa essa abstração por meio de “HyperTables”.
Indexar a posição das tabelas e não a posição dos dados, mantendo índices internos a cada tabela, permite que consultas a qualquer período de tempo sejam feitas rapidamente, e evita degradação de performance.
Como novas entradas são sempre adicionadas à tabela mais recente, já que normalmente não há inserções em uma data passada, os custos de se manter esse tipo de estrutura são minimizados.
Remoções também podem se tornar mais rápidas, pois é possível remover tabelas inteiras ao invés dos dados contidos nessas tabelas. Paralelização pode ser obtida ao se recuperar dados de vários chunks simultaneamente, principalmente se estes chunks estiverem distribuídos entre diferentes discos.
Mesmo com as peculiaridades das séries temporais, esse tipo de estrutura ainda apresenta um custo. O aumento da complexidade implica que consultas a entidades específicas serão mais lentas, e possíveis ganhos em relação ao desempenho podem não aparecer até que os dados atinjam um volume considerável. Além disso, outras considerações devem ser feitas: O tamanho dos chunks deve se manter suficientemente pequeno para que eles possam ser carregados inteiramente para a memória RAM, por exemplo.
Outro ponto diz respeito à filtragem e suavização da série. Enquanto a filtragem de ondas sonoras ou sinais elétricos (que podem ser descritos como séries temporais) visa a completa remoção do ruído, isso pode não ser aconselhado ao trabalharmos com dados. O uso desse tipo de técnica pode fazer com que informações que poderiam auxiliar no processo de análise também sejam removidas. Devido a isso, métodos como Transformada Rápida de Fourier devem ser aplicados com cuidado.
Séries temporais são conjuntos de dados cujo volume e importância vêm aumentando consistentemente. Um dos principais motivos é o surgimento da internet das coisas (IoT), porém o aumento do volume de equipamentos automatizados e aplicações cuja “saúde” interna queremos monitorar – como computadores e celulares – também contribuem para isso. Neste artigo discutimos algumas das particularidades de séries temporais e técnicas para melhor coletar, armazenar e processar esse tipo de dado. Continuaremos a tratar desse assunto em próximos posts. Fique atento!
Ranieri é estagiário do time de Innovation na Daitan e estuda informática na Unicamp.