Como filtrar / suavizar com SciPy / Numpy?

Estou tentando filtrar / suavizar o sinal obtido de um transdutor de pressão com frequência de amostragem de 50 kHz. Um sinal de amostra é mostrado abaixo:

Gostaria de obter um sinal suave obtido por loess no MATLAB (não estou plotando os mesmos dados, os valores são diferentes).

Calculei a densidade espectral de potência usando a função psd () do matplotlib e a densidade espectral de potência também é fornecida abaixo:

Eu tentei usar o código a seguir e obtive um sinal filtrado:

import csv
import numpy as np
import matplotlib.pyplot as plt
import scipy as sp
from scipy.signal import butter, lfilter, freqz

def butter_lowpass(cutoff, fs, order=5):
    nyq = 0.5 * fs
    normal_cutoff = cutoff / nyq
    b, a = butter(order, normal_cutoff, btype='low', analog=False)
    return b, a

def butter_lowpass_filter(data, cutoff, fs, order=5):
    b, a = butter_lowpass(cutoff, fs, order=order)
    y = lfilter(b, a, data)
    return y

data = np.loadtxt('data.dat', skiprows=2, delimiter=',', unpack=True).transpose()
time = data[:,0]
pressure = data[:,1]
cutoff = 2000
fs = 50000
pressure_smooth = butter_lowpass_filter(pressure, cutoff, fs)

figure_pressure_trace = plt.figure(figsize=(5.15, 5.15))
figure_pressure_trace.clf()
plot_P_vs_t = plt.subplot(111)
plot_P_vs_t.plot(time, pressure, linewidth=1.0)
plot_P_vs_t.plot(time, pressure_smooth, linewidth=1.0)
plot_P_vs_t.set_ylabel('Pressure (bar)', labelpad=6)
plot_P_vs_t.set_xlabel('Time (ms)', labelpad=6)
plt.show()
plt.close()

A saída que recebo é:

Preciso de mais suavização, tentei alterar a frequência de corte, mas ainda não é possível obter resultados satisfatórios. Não consigo obter a mesma suavidade do MATLAB. Tenho certeza que isso pode ser feito em Python, mas como?

Você pode encontrar os dadosaqui.

Atualizar

Eu apliquei suavização lowess a partir de modelos de estatísticas, isso também não fornece resultados satisfatórios.

questionAnswers(2)

yourAnswerToTheQuestion