Média móvel para NumPy Array em Python

Manav Narula 30 janeiro 2023
  1. Use o método numpy.convolve para calcular a média móvel para numpy arrays
  2. Use o método scipy.convolve para calcular a média móvel para numpy arrays
  3. Use o módulo bottleneck para calcular a média móvel
  4. Use o módulo pandas para calcular a média móvel
Média móvel para NumPy Array em Python

A média móvel é freqüentemente usada no estudo de dados de séries temporais, calculando a média dos dados em intervalos específicos. É usado para suavizar algumas flutuações de curto prazo e estudar tendências nos dados. As médias móveis simples são amplamente utilizadas no estudo das tendências dos preços das ações.

A média móvel ponderada coloca mais ênfase nos dados recentes do que nos dados mais antigos.

O gráfico abaixo dará uma melhor compreensão das Médias Móveis.

Média Móvel Simples

Neste tutorial, discutiremos como implementar a média móvel para numpy arrays em Python.

Use o método numpy.convolve para calcular a média móvel para numpy arrays

A função convolve() é usada no processamento de sinais e pode retornar a convolução linear de duas matrizes. O que está sendo feito em cada etapa é pegar o produto interno entre a matriz de uns e a janela atual e tirar sua soma.

O código a seguir implementa isso em uma função definida pelo usuário.

import numpy as np


def moving_average(x, w):
    return np.convolve(x, np.ones(w), "valid") / w


data = np.array([10, 5, 8, 9, 15, 22, 26, 11, 15, 16, 18, 7])

print(moving_average(data, 4))

Resultado:

[ 8.    9.25 13.5  18.   18.5  18.5  17.   15.   14.  ]

Use o método scipy.convolve para calcular a média móvel para numpy arrays

Também podemos usar a função scipy.convolve() da mesma maneira. Presume-se que seja um pouco mais rápido. Outra forma de calcular a média móvel usando o módulo numpy é com a função cumsum(). Ele calcula a soma cumulativa do array. Este é um método não ponderado muito direto para calcular a média móvel.

O código a seguir retorna a média móvel usando esta função.

def moving_average(a, n):
    ret = np.cumsum(a, dtype=float)
    ret[n:] = ret[n:] - ret[:-n]
    return ret[n - 1 :] / n


data = np.array([10, 5, 8, 9, 15, 22, 26, 11, 15, 16, 18, 7])

print(moving_average(data, 4))

Resultado:

[ 8.    9.25 13.5  18.   18.5  18.5  17.   15.   14.  ]

Use o módulo bottleneck para calcular a média móvel

O módulo bottleneck é uma compilação de métodos numpy rápidos. Este módulo possui a função move_mean(), que pode retornar a média móvel de alguns dados.

Por exemplo,

import bottleneck as bn
import numpy as np


def rollavg_bottlneck(a, n):
    return bn.move_mean(a, window=n, min_count=None)


data = np.array([10, 5, 8, 9, 15, 22, 26, 11, 15, 16, 18, 7])

print(rollavg_bottlneck(data, 4))

Resultado:

[  nan   nan   nan  8.    9.25 13.5  18.   18.5  18.5  17.   15.   14.  ]

Como o intervalo da janela de tempo é 4, há três valores nan no início porque a média móvel não pôde ser calculada para eles.

Use o módulo pandas para calcular a média móvel

Os dados da série temporal estão principalmente associados a um DataFrame pandas. Portanto, a biblioteca está bem equipada para realizar diferentes cálculos em tais dados.

Podemos calcular a média móvel dos dados de uma série temporal usando as funções rolling() e mean() conforme mostrado abaixo.

import pandas as pd
import numpy as np

data = np.array([10, 5, 8, 9, 15, 22, 26, 11, 15, 16, 18, 7])

d = pd.Series(data)

print(d.rolling(4).mean())

Resultado:

0       NaN
1       NaN
2       NaN
3      8.00
4      9.25
5     13.50
6     18.00
7     18.50
8     18.50
9     17.00
10    15.00
11    14.00
dtype: float64

Primeiro, convertemos a matriz numpy em um objeto de série temporal e, em seguida, usamos a função rolling() para realizar o cálculo na janela rolante e calcular a média móvel usando a função mean().

Também aqui, como o intervalo da janela de tempo é 4, existem três valores nan no início porque a média móvel não pôde ser calculada para eles.

Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn

Artigo relacionado - Python NumPy