python - 无法对我的数据应用 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,只改变比例,没有平滑。
过滤前:
过滤后:
编辑:应用答案中提出的修复后,一切顺利,没有缩放!:
解决方案
请注意,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=0
在lfilter
通话中使用:yy = lfilter(b, a, data, axis=0)
而不是传递
DataFrame
tolfilter
,只传递第一列: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,)
推荐阅读
- sql - 如何进一步优化此 SQL 代码以更快地运行
- android - 为产品风味添加环境变量
- windows - 运行 gcc 失败:在 windows 中的 golang 中退出状态 1
- android - Flutter:在相邻的两列中显示内容
- maven - Maven POM 中的红线
- python - 如何开发基于操作的锁机制?
- mysql - 请告诉我为什么这个 Magento 1.9 代码不起作用
- javascript - NodeJS 将数据从当前页面传递到另一个页面
- javascript - 在减少之后按字段分组在 JavaScript 中不起作用
- node.js - 没有从 Axios 和 curl 调用到特定站点的数据