Como calcular médias móveis em python
Uma média móvel é uma técnica que pode ser usada para suavizar dados de séries temporais para reduzir o “ruído” nos dados e identificar mais facilmente padrões e tendências.
A ideia por trás de uma média móvel é calcular a média de vários períodos anteriores para chegar a uma “média móvel” para um determinado período.
Este tutorial explica como calcular médias móveis em Python.
Exemplo: médias móveis em Python
Suponha que temos a seguinte tabela que mostra o total de vendas de uma determinada empresa em 10 períodos:
x = [50, 55, 36, 49, 84, 75, 101, 86, 80, 104]
Método 1: Use a função cumsum().
Uma maneira de calcular a média móvel é usar a função cumsum():
import numpy as np #define moving average function def moving_avg(x, n): cumsum = np.cumsum(np.insert(x, 0, 0)) return (cumsum[n:] - cumsum[:-n]) / float(n) #calculate moving average using previous 3 time periods n = 3 moving_avg(x, n): array([47, 46.67, 56.33, 69.33, 86.67, 87.33, 89, 90])
Veja como interpretar o resultado:
- A média móvel do terceiro período é 47. É calculada como a média dos três primeiros períodos: (50+55+36)/3 = 47 .
- A média móvel do quarto período é de 46,67. Isto é calculado como a média dos três períodos anteriores: (55+36+49)/3 = 46,67 .
E assim por diante.
Método 2: Use pandas.
Outra forma de calcular a média móvel é escrever uma função baseada em pandas:
import pandas as pd #define array to use and number of previous periods to use in calculation x = [50, 55, 36, 49, 84, 75, 101, 86, 80, 104] n=3 #calculate moving average pd.Series(x).rolling(window=n).mean().iloc[n-1:].values array([47, 46.67, 56.33, 69.33, 86.67, 87.33, 89, 90])
Este método produz exatamente os mesmos resultados do método anterior, mas tende a ser executado mais rapidamente em arrays maiores.
Observe que você também pode especificar qualquer número de períodos anteriores para usar no cálculo da média móvel. Por exemplo, você pode preferir usar n=5:
#use 5 previous periods to calculate moving average n=5 #calculate moving average pd.Series(x).rolling(window=n).mean().iloc[n-1:].values array([54.8, 59.8, 69., 79., 85.2, 89.2])
Quanto mais períodos você usar para calcular a média móvel, mais “suavizada” será a linha da média móvel.