例如,我从呼吸记录中得到了一个信号,由于打哈欠而产生了许多尖峰。我试着用熊猫的滚动均值函数把它去掉,但是没有用。此图上的绿色空间是使用滚动平均值的结果。
import pandas as pd
RESP=pd.DataFrame(RESP)
RESP_AV=pd.rolling_mean(RESP,50)
我对过滤数据知之甚少,在pandas中也找不到任何其他方法来消除这种尖峰,所以我的问题是到哪里去寻找答案。RESP.head()的结果是:
0 -2562.863389
1 -2035.020403
2 -2425.538355
3 -2554.280563
4 -2242.438367
6.7636961937
发布于 2018-03-29 22:00:49
以下函数将从数组yi中删除最高尖峰,并用抛物线替换尖峰区域:
import numpy as np
def despike(yi, th=1.e-8):
'''Remove spike from array yi, the spike area is where the difference between
the neigboring points is higher than th.'''
y = np.copy(yi) # use y = y1 if it is OK to modify input array
n = len(y)
x = np.arange(n)
c = np.argmax(y)
d = abs(np.diff(y))
try:
l = c - 1 - np.where(d[c-1::-1]<th)[0][0]
r = c + np.where(d[c:]<th)[0][0] + 1
except: # no spike, return unaltered array
return y
# for fit, use area twice wider then the spike
if (r-l) <= 3:
l -= 1
r += 1
s = int(round((r-l)/2.))
lx = l - s
rx = r + s
# make a gap at spike area
xgapped = np.concatenate((x[lx:l],x[r:rx]))
ygapped = np.concatenate((y[lx:l],y[r:rx]))
# quadratic fit of the gapped array
z = np.polyfit(xgapped,ygapped,2)
p = np.poly1d(z)
y[l:r] = p(x[l:r])
return y
要移除许多尖峰:找到最高尖峰的位置,将此函数应用于尖峰周围的狭窄区域,重复此操作。
发布于 2016-06-01 06:52:19
我知道有两种方法可以解决这个问题:
设计更好的过滤器:
1)确定您的信号频段:
比较信号的频谱图和时间信号,比较非尖峰段和尖峰段,以确定最大有用频率(截止频率)和最小尖峰显示频率(停止频率)。
2)设计一个LowPass过滤器:如果你有matlab,使用fdatool,如果你想使用python,使用remez。
3)使用自定义LowPass滤波器而不是滚动平均,
如果你不喜欢结果,重新设计滤波器(带权重和窗口大小)
检测+替换:
1)去除信号的均值。
2)使用微分滤波器和阈值来检测峰值。
3)从信号中剔除所有的峰值(用0替换它们)
4)可选滤除截断段中的峰值(参见上述方法)
5)对于每个被剪切的峰值,找出被剪切的片段与没有峰值的信号之间的最大互相关系数,替换该片段,并进行淡入/淡出效果,以平滑粘贴。
发布于 2022-01-27 17:26:53
对于数据中的尖峰,我也遇到了同样的问题,因为您使用了Dataframe Quantile,一种解决方案是使用Pandas Series between过滤掉所需分位数/范围Dataframe Quantile之外的点。在我的示例中,我只采用98%分位数内的值,它保留了大多数所需的值;您可以尝试使用最高分位数,看看哪个效果更好。
x=raw_data
x_r = x[x.between(x.quantile(.000), x.quantile(0.98))]
您可以做的一件事是绘制散点,这样您就可以准确地看到哪些点是异常值,因为显然matplotlib line plot在缺省情况下会将相邻的点连接在一起,即使它们之间没有数据。
https://stackoverflow.com/questions/37556487
复制相似问题