Dados suaves em Python

Shivam Arora 30 janeiro 2023
  1. Use o método scipy.signal.savgol_filter() para suavizar dados em Python
  2. Use o método numpy.convolve para suavizar dados em Python
  3. Use o statsmodels.kernel_regression para suavizar os dados em Python
Dados suaves 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:

python smooth data 1

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:

python smooth data 2

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:

python smooth data 3

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.

Artigo relacionado - Python Graph