我正在尝试使用Pandas rolling_window函数,win_type =' gaussian'或win_type =' general_gaussian'。我有一个按日期时间索引的时间序列数据集,我需要一个平滑函数来减少噪音。我想避开boxcar,而是使用高斯加权。我已经尝试了很多范围的窗口大小和std(高斯),以及窗口大小,功率和宽度值(对于一般的高斯),并且我始终得到相同的结果:平滑输出偏移低于原始输入数据。这是同一个问题,但仍未得到答复here。
我尝试使用的特定代码行是:
dNorth_smooth = rolling_window(s, window=40, win_type='gaussian', std=30, center=True, freq='15S')
在哪里'是日期时间索引的Pandas数据帧中的单列数据。在这种情况下,' s'以米为单位,以15秒的时间间隔。所以,我的窗口大小是40行,或40 * 15 = 600秒= 10分钟。目前尚不清楚std参数究竟是指什么,但我认为这是在频域中,并且会比窗口大小小一些,控制高斯曲线的形状(无论如何,我已经尝试了很多标准值;如果std非常大,则不会发生偏移,但这是因为高斯曲线与窗口相比变得如此宽,以至于你基本上使用了一个boxcar)。 '中心'和' freq'参数似乎不会以任何方式改变输出。其他可选参数似乎也无关紧要。
一旦我有更高的声誉,我可以发布一个情节来帮助解释。但请看上面链接问题的情节,因为这是我遇到的完全相同的问题。还要注意:boxcar窗口(相当于rolling_mean)不有这个偏移问题。但是,它似乎与所有其他窗口加权函数(triang,blackman等)一起存在。
答案 0 :(得分:3)
由于此问题(或类似的链接问题)没有发布特定的Pandas解决方案,我使用标准的numpy和scipy函数发布解决方案。这将使用高斯加权产生平滑曲线,适用于任何幅度数据(没有偏移问题)。
def smooth_gaussian(data,window,std):
g = sp.signal.gaussian(window,std,sym=True)
con = np.convolve(g/g.sum(),data,mode='valid')
con_shift = np.r_[np.full((window*0.5),np.nan),con,np.full((window*0.5),np.nan)]
return con_shift
结果数据集比输入数据集短于窗口长度,因为第一个和最后一个"平滑"数据点从任一端出现在(窗口* 0.5)处。返回的变量con_shift
说明了这一点,并使平滑后的数据相对于输入数据居中,因此它们的长度相同,可以一起绘制。 window
参数是移动窗口的大小,std
是标准偏差,控制高斯曲线的形状(我将其设置为0.1 *窗口)。请注意,要使con_shift
对称,窗口大小必须是奇整数。