gpt4 book ai didi

python - 无法对我的数据应用 scipy.signal lfilter

转载 作者:行者123 更新时间:2023-12-01 08:44:51 25 4
gpt4 key购买 nike

使用这篇文章中的最佳答案: Reducing noise on 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,但去噪数据未缩放。我尝试改变n,只改变比例,没有平滑。

过滤前:

enter image description here

过滤后:

enter image description here

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

enter image description here

最佳答案

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

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

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

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

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

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

  • lfilter 调用中使用 axis=0:

    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,)

关于python - 无法对我的数据应用 scipy.signal lfilter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53352807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com