Skip to content

Numpy Rolling - Calculando Média Móvel em Python

Updated on

No campo da análise de dados, especialmente ao lidar com dados de séries temporais, a habilidade de calcular estatísticas móveis é essencial. A principal ferramenta para isso em Python é a biblioteca numpy, e mais especificamente, a função numpy rolling. Essa função nos permite calcular várias estatísticas móveis, como a média móvel, em nossos dados. Mas como isso funciona e como podemos usá-lo de forma eficaz?

O numpy rolling é uma função que nos permite aplicar uma função a uma janela móvel de tamanho especificado em nossos dados. Isso é particularmente útil na análise de séries temporais, onde frequentemente queremos suavizar as flutuações de curto prazo para visualizar melhor as tendências de longo prazo. Neste artigo, iremos nos aprofundar nos detalhes do numpy rolling, abordando sua sintaxe, como usá-lo com diferentes tamanhos de janela, como aplicá-lo a matrizes 2D e como usar filtros com ele.

Quer criar rapidamente visualizações de dados a partir de um DataFrame do Pandas em Python, sem código?

PyGWalker é uma biblioteca Python para Análise Exploratória de Dados com Visualização. PyGWalker (opens in a new tab) pode simplificar seu fluxo de trabalho de análise e visualização de dados no Jupyter Notebook, transformando seu DataFrame de pandas (e DataFrame de polars) em uma Interface de Usuário no estilo Tableau para exploração visual.

PyGWalker para visualização de dados (opens in a new tab)

Compreendendo o Numpy Rolling

O numpy rolling é uma função que aplica uma janela móvel a uma matriz e executa uma função nos dados dessa janela. A janela se move ao longo da matriz e a função é aplicada à nova janela em cada etapa. O tamanho da janela é especificado pelo usuário e pode ser qualquer número inteiro menor ou igual ao tamanho da matriz.

A sintaxe da função rolling do numpy é a seguinte:

numpy.rolling(janela)

Aqui, janela é o tamanho da janela móvel. É um número inteiro que especifica o número de elementos consecutivos da matriz que serão incluídos na janela.

Por exemplo, se tivermos uma matriz unidimensional de valores e quisermos calcular a média móvel com um tamanho de janela de 3, usaríamos o seguinte código:

import numpy as np
 
# Crie uma matriz unidimensional
dados = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
 
# Calcule a média móvel com um tamanho de janela de 3
media_movel = np.rolling(3).mean(dados)
 
print(media_movel)

Isso irá gerar a seguinte matriz:

array([nan, nan, 2., 3., 4., 5., 6., 7., 8.])

Os dois primeiros valores são nan porque não há valores anteriores suficientes para preencher uma janela de tamanho 3. O terceiro valor é 2 porque a média dos primeiros três valores (1, 2, 3) é 2, e assim por diante.

Comparando Numpy Rolling e Numpy Roll

Embora o numpy rolling e o numpy roll possam parecer semelhantes, eles têm finalidades diferentes. O numpy roll é uma função que desloca os elementos de uma matriz ao longo de um eixo especificado, envolvendo os elementos do outro lado da matriz. Por outro lado, o numpy rolling aplica uma janela móvel a uma matriz e executa uma função nos dados dessa janela.

Por exemplo, se tivermos a seguinte matriz unidimensional:

import numpy as np
 
# Crie uma matriz unidimensional
dados = np.array([1, 2, 3, 4, 5])
 
# Use o numpy roll para deslocar os elementos 2 posições para a direita
dados_deslocados = np.roll
 
(dados, 2)
 
print(dados_deslocados)

Isso irá gerar a seguinte matriz:

array([4, 5, 1, 2, 3])

Como você pode ver, os elementos foram deslocados duas posições para a direita, com os elementos que foram empurrados para fora do final sendo movidos para o início da matriz.

Aplicando Numpy Rolling a Matrizes 2D

O numpy rolling também pode ser aplicado a matrizes 2D. Nesse caso, a janela móvel é aplicada a cada linha ou coluna da matriz (dependendo do eixo especificado) e a função é aplicada aos dados na janela.

Por exemplo, se tivermos uma matriz 2D de valores e quisermos calcular a média móvel com um tamanho de janela de 3 ao longo das linhas, usaríamos o seguinte código:

import numpy as np
 
# Crie uma matriz 2D
dados = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]])
 
# Calcule a média móvel com um tamanho de janela de 3 ao longo das linhas
media_movel = np.rolling(3, axis=1).mean(dados)
 
print(media_movel)

Isso irá gerar a seguinte matriz 2D:

array([[nan, nan,  2.,  3.,  4.],
       [nan, nan,  7.,  8.,  9.],
       [nan, nan, 12., 13., 14.]])

Os dois primeiros valores em cada linha são nan porque não há valores anteriores suficientes na linha para preencher uma janela de tamanho 3. O terceiro valor na primeira linha é 2 porque a média dos primeiros três valores na linha (1, 2, 3) é 2, e assim por diante.

Usando Filtros com Numpy Rolling

O numpy rolling também nos permite aplicar filtros aos dados na janela móvel. Isso pode ser útil para suavizar os dados ou remover valores atípicos.

Por exemplo, se quisermos calcular a mediana móvel (que é menos sensível a valores atípicos do que a média) com um tamanho de janela de 3, usaríamos o seguinte código:

import numpy as np
 
# Crie uma matriz unidimensional
dados = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
 
# Calcule a mediana móvel com um tamanho de janela de 3
mediana_movel = np.rolling(3).median(dados)
 
print(mediana_movel)

Isso irá gerar a seguinte matriz:

array([nan, nan, 2., 3., 4., 5., 6., 7., 8.])

Os dois primeiros valores são nan porque não existem valores anteriores suficientes para preencher uma janela de tamanho 3. O terceiro valor é 2 porque a mediana dos três primeiros valores (1, 2, 3) é 2, e assim por diante.

Aplicando o Numpy Rolling a Dados de Séries Temporais

Um dos casos de uso mais comuns para o numpy rolling é a análise de dados de séries temporais. Dados de séries temporais são uma sequência de pontos de dados coletados ao longo do tempo, normalmente em intervalos regulares. O numpy rolling nos permite calcular estatísticas móveis nos dados de séries temporais, fornecendo insights sobre tendências e padrões.

Para aplicar o numpy rolling a dados de séries temporais, primeiro precisamos garantir que nossos dados estejam devidamente formatados. Normalmente, os dados de séries temporais são representados como um array unidimensional ou uma coluna em um array bidimensional, onde cada elemento representa um ponto de dados em um momento específico. Depois de ter os dados de séries temporais no formato desejado, podemos usar o numpy rolling para calcular as estatísticas móveis.

Por exemplo, vamos supor que temos um conjunto de dados de séries temporais que registra a temperatura diária em uma cidade nos últimos 365 dias. Queremos calcular a média móvel de 7 dias da temperatura para suavizar as flutuações diárias e identificar tendências de longo prazo da temperatura. Veja como podemos fazer isso:

import numpy as np
 
# Suponha que temos um array unidimensional 'temperature' com os valores de temperatura diária
# Calcula a média móvel de 7 dias da temperatura
rolling_avg = np.rolling(7).mean(temperature)
 
print(rolling_avg)

O array rolling_avg conterá os valores da média móvel de 7 dias da temperatura. Cada valor representa a temperatura média em uma janela de 7 dias, permitindo observar a tendência geral da temperatura ao longo do tempo.

Ao aplicar o numpy rolling a dados de séries temporais, podemos descobrir insights valiosos, como identificar sazonalidade, detectar anomalias ou prever tendências futuras. Ele fornece uma ferramenta poderosa para analisar e entender padrões dependentes do tempo em várias áreas, incluindo finanças, clima, análise de mercado de ações e muito mais.

Manipulando Eixos com o Numpy Rolling

O numpy rolling não apenas nos permite aplicar uma janela móvel ao longo das linhas ou colunas de um array bidimensional, mas também fornece flexibilidade na manipulação dos eixos. Esse recurso é particularmente útil ao trabalhar com arrays multidimensionais e realizar cálculos em dimensões específicas.

Por exemplo, suponha que temos um array tridimensional que representa medições de temperatura mensais em diferentes locais e períodos de tempo. Queremos calcular a média móvel da temperatura para cada local ao longo do eixo de tempo. Veja como podemos fazer isso usando o numpy rolling:

import numpy as np
 
# Suponha que temos um array tridimensional 'temperature' com formato (num_locations, num_time_periods, num_months)
# Calcula a média móvel da temperatura ao longo do eixo de tempo
rolling_avg = np.rolling(3, axis=1).mean(temperature)
 
print(rolling_avg)

Nesse exemplo, especificamos axis=1 para indicar que queremos aplicar a janela móvel ao longo do eixo de tempo. O array resultante rolling_avg conterá os valores da média móvel da temperatura para cada local, preservando o formato original do array.

Ao manipular os eixos com o numpy rolling, podemos realizar cálculos móveis em dimensões específicas, permitindo analisar e extrair informações significativas de dados multidimensionais.

Otimizando o Numpy Rolling para Análise de Dados

Ao trabalhar com conjuntos de dados grandes ou realizar cálculos complexos usando o numpy rolling, a otimização se torna crucial para garantir uma computação eficiente e reduzir o tempo de processamento. Aqui estão algumas dicas para otimizar o numpy rolling para análise de dados:

  1. Especifique o dtype: Ao criar arrays ou carregar dados no numpy, especifique o tipo de dados apropriado (dtype). Usar o tipo de dados correto não apenas economiza memória, mas também melhora a velocidade de computação.

  2. Use o tamanho da janela com sabedoria: Ajuste o tamanho da janela de acordo com seus dados e requisitos de análise. Um tamanho de janela menor fornece insights mais granulares, mas pode ser sensível ao ruído, enquanto um tamanho de janela maior suaviza as flutuações, mas pode ignorar padrões de curto prazo.

  3. Aproveite as operações vetorizadas: O numpy é projetado para operações vetorizadas, que podem melhorar significativamente o desempenho. Em vez de usar loops ou cálculos iterativos, tente formular seus cálculos usando as funções e operações integradas do numpy.

  4. Considere a paralelização: Se o seu sistema suportar computação paralela, explore opções para paralelizar seus cálculos do numpy rolling. A paralelização pode distribuir a computação em vários núcleos ou processadores, reduzindo o tempo de processamento para conjuntos de dados grandes.

Ao seguir essas técnicas de otimização, você pode aprimorar o desempenho dos seus cálculos do numpy rolling e desbloquear todo o potencial da análise de dados.


Perguntas Frequentes

Aqui estão algumas perguntas frequentes sobre o numpy rolling:

  1. O que é o numpy rolling? O numpy rolling é uma função na biblioteca numpy que nos permite calcular estatísticas móveis em arrays. Ele aplica uma janela móvel aos dados e executa uma função especificada nos dados da janela. Isso é particularmente útil para análise de séries temporais e suavização de flutuações nos dados.

  2. Como calcular estatísticas móveis usando o numpy? Para calcular estatísticas móveis usando o numpy, você pode usar a função numpy.rolling() e especificar o tamanho da janela e a função desejada (por exemplo, média, mediana) a ser aplicada aos dados da janela. A função itera sobre o array, aplicando a função especificada a cada janela de dados.

  3. Qual é a sintaxe da função rolling do numpy? A sintaxe da função rolling do numpy é numpy.rolling(window, axis=0), onde window é o tamanho da janela móvel e axis (opcional) especifica o eixo ao longo do qual a operação rolling deve ser realizada. A função retorna um objeto de janela móvel que pode ser usado para aplicar várias funções como média, mediana, etc.