首页 > 解决方案 > 无法对我的数据应用 scipy.signal lfilter

问题描述

使用这篇文章的最佳答案: 减少数据噪声

我无法重新使用代码去噪我的数据-> 可以在此处找到的 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 但去噪数据没有缩放。我尝试改变 n,只改变比例,没有平滑。

过滤前:

在此处输入图像描述

过滤后:

在此处输入图像描述

编辑:应用答案中提出的修复后,一切顺利,没有缩放!:

在此处输入图像描述

标签: pythonnumpyscipysmoothing

解决方案


请注意,header=None当您使用 读取该文件时应该使用pandas.read_csv,否则第一行数据将被视为标题:

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

data过滤结果奇怪的原因lfilter是 PandasDataFrame看起来像一个二维数组,形状为(300, 1)

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

scipy.lfilter适用于 n 维数组,但必须告知哪个轴包含要过滤的信号。默认值为axis=-1,即最后一个轴。对于您的数据,这意味着它正在过滤 300 个信号,每个信号的长度为 1。这绝对不是您想要的。

有几种简单的方法可以解决这个问题:

  • axis=0lfilter通话中使用:

    yy = lfilter(b, a, data, axis=0)
    
  • 而不是传递DataFrameto lfilter,只传递第一列:

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

    data[0]是一个 PandasSeries对象,看起来是一维的。

  • 跳过 Pandas,并使用以下方法读取数据numpy.loadtxt

    In [46]: data = np.loadtxt('Gain_Loss_test.csv')
    
    In [47]: data.shape
    Out[47]: (300,)
    

推荐阅读