Dados suaves em Python
-
Use o método
scipy.signal.savgol_filter()
para suavizar dados em Python -
Use o método
numpy.convolve
para suavizar dados em Python -
Use o
statsmodels.kernel_regression
para suavizar os dados em Python
Python tem uma vasta aplicação em análise e visualização de dados. Quando analisamos conjuntos de dados massivos contendo muitas observações, podemos encontrar situações em que temos que suavizar as curvas de um gráfico para estudar o gráfico final com mais cuidado. Discutiremos como fazer isso em Python usando métodos diferentes.
Use o método scipy.signal.savgol_filter()
para suavizar dados em Python
O filtro Savitzky – Golay é um filtro digital que usa pontos de dados para suavizar o gráfico. Ele usa o método dos mínimos quadrados que cria uma pequena janela e aplica um polinômio aos dados dessa janela e, em seguida, usa esse polinômio para assumir o ponto central da janela específica. Em seguida, a janela é deslocada em um ponto de dados e o processo é iterado até que todos os vizinhos estejam relativamente ajustados uns com os outros.
Podemos usar a função scipy.signal.savgol_filter()
para implementar isso em Python.
Veja o seguinte exemplo.
import numpy as np
from scipy.signal import savgol_filter
import matplotlib.pyplot as plt
x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(x) + np.random.random(100) * 0.2
yhat = savgol_filter(y, 51, 3)
plt.plot(x, y)
plt.plot(x, yhat, color="green")
plt.show()
Produção:
No exemplo acima, usamos o método de filtragem para suavizar os dados a serem plotados no eixo y. Traçamos os dados originais e suavizados para que você possa observar a diferença.
Use o método numpy.convolve
para suavizar dados em Python
O numpy.convolve()
Dá a convolução linear discreta de duas sequências unidimensionais. Usaremos isso para criar médias móveis que podem filtrar e suavizar os dados.
Este não é considerado um bom método.
Por exemplo,
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(x) + np.random.random(100) * 0.8
def smooth(y, box_pts):
box = np.ones(box_pts) / box_pts
y_smooth = np.convolve(y, box, mode="same")
return y_smooth
plt.plot(x, y)
plt.plot(x, smooth(y, 3))
plt.plot(x, smooth(y, 19))
Produção:
No exemplo acima, traçamos duas médias móveis com delta de tempo de 3 e 19. Traçamos ambas no gráfico.
Podemos usar outros métodos também para calcular médias móveis.
Use o statsmodels.kernel_regression
para suavizar os dados em Python
A regressão do kernel calcula a média condicional E[y|X]
onde y = g(X) + e
e se ajusta ao modelo. Ele pode ser usado para suavizar os dados com base na variável de controle.
Para fazer isso, temos que usar a função KernelReg()
do módulo statsmodels
.
Por exemplo,
from statsmodels.nonparametric.kernel_regression import KernelReg
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(x) + np.random.random(100) * 0.2
kr = KernelReg(y, x, "c")
plt.plot(x, y, "+")
y_pred, y_std = kr.fit(x)
plt.plot(x, y_pred)
plt.show()
Produção:
Observe que este método produz um bom resultado, mas é considerado muito lento. Também podemos usar a transformada de Fourier, mas ela funciona apenas com dados periódicos.