Не могу применить scipy.signal lfilter к моим данным - PullRequest
0 голосов
/ 17 ноября 2018

Используя лучший ответ из этого поста: Снижение шума в данных

Мне не удается повторно использовать код для удаления шума из моего файла data-> csv, который можно найти здесь: https://drive.google.com/open?id=1qVOKjDTAIEdB4thiTgv7BmSmfIoDyZ0J

Мой код:

import pandas as pd
import matplotlib.pyplot as plt
from scipy.signal import lfilter

data = pd.read_csv("Gain_Loss_test.csv")

#plot the original data
x = np.arange(1, 300, 1)  # x axis
y = data
plt.plot(x, y, linewidth=1, linestyle="-", c="b")

#apply the filter and plot the denoised data
n = 15  # the larger n is, the smoother curve will be
b = [1.0 / n] * n
a = 1
yy = lfilter(b,a,y)
plt.plot(x, yy, linewidth=1, linestyle="-", c="b")

Обе диаграммы выглядят одинаково, меняется только масштаб по отношению к n. Я не хочу масштабировать это, я хочу сгладить это. В оригинальном сообщении они также используют n = 15, но данные с шумом не масштабируются. Я пытался изменить, только изменения масштаба, без сглаживания.

Перед фильтром:

enter image description here

После фильтра:

enter image description here

Редактировать: После применения исправления, предложенного в ответе, все плавно, без масштабирования!:

enter image description here

1 Ответ

0 голосов
/ 17 ноября 2018

Обратите внимание, что вы должны использовать header=None при чтении этого файла с использованием pandas.read_csv, в противном случае первая строка данных обрабатывается как заголовок:

In [27]: data = pd.read_csv("Gain_Loss_test.csv", header=None)

Причина странного результата фильтрацииdata с lfilter означает, что Pandas DataFrame выглядит как двумерный массив с формой (300, 1):

In [28]: data.shape
Out[28]: (300, 1)

scipy.lfilter работает с n-мерныммассивов, но необходимо указать, какая ось содержит сигнал (ы) для фильтрации.По умолчанию axis=-1, что является последней осью.Для ваших данных это означает, что они фильтруют 300 сигналов, каждый с длиной 1. Это определенно не то, что вы хотите.

Есть несколько простых способов исправить это:

  • Используйте axis=0 в вызове lfilter:

    yy = lfilter(b, a, data, axis=0)
    
  • Вместо передачи DataFrame в lfilter, пропустите только первый столбец:

    yy = lfilter(b, a, data[0])
    

    data[0] - это объект Pandas Series, который выглядит одномерным.

  • Пропустите Pandas и прочитайте данные, используя, скажем, numpy.loadtxt:

    In [46]: data = np.loadtxt('Gain_Loss_test.csv')
    
    In [47]: data.shape
    Out[47]: (300,)
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...