我试图通过将数据帧切片传递给我的函数来对加速度计数据进行带通滤波,但是基于切片数据的方式,我得到了不同的结果
我尝试使用列名和索引使用iloc
,但是结果不同,所以我不知道哪个结果是正确的结果
我的带通滤波器功能:
def butter_bandpass(lowcut, highcut, fs, order=6):
nyq = 0.5 * fs
low = lowcut / nyq
high = highcut / nyq
b, a = butter(order, [low, high], btype='band')
return b, a
def butter_bandpass_filter(data, lowcut, highcut, fs):
b, a = butter_bandpass(lowcut, highcut, fs, order=6)
y = lfilter(b, a, data)
return y
在这两种方式下,我通常将数据传递给函数:
第一种方法:对列名使用tremor_0[['X']] as [[]]
切片
y=pd.DataFrame(data=butter_bandpass_filter(tremor_0[['X']],0.3,12,100),columns=['X'])
第二种方式:
对列名使用tremor_0['X'] as []
切片
y=pd.DataFrame(data=butter_bandpass_filter(tremor_0['X'],0.3,12,100),columns=['X'])
第一种方式的结果:
X
0 -0.001962
1 -0.001962
2 -0.001948
3 -0.001903
4 -0.001874
第二种方法的结果:
X
0 -0.001962
1 -0.019822
2 -0.095867
3 -0.298136
4 -0.675933
请注意,从第二行开始,值是不同的,那么哪种方式是正确的方式,为什么?你知道吗
简短回答:使用
tremor_0['X']
。你知道吗长答案
首先,
tremor_0[['X']]
和tremor_0['X']
是不一样的。你知道吗假设您有一个数据帧:
更重要的是,它们的形状不同
因为它对
axis=-1
应用过滤器,所以scipy.signal.lfilter
的处理方式不同。你知道吗如果将
lfilter
参数更改为axis = 0
,则butter_bandpass_filter
返回带有示例值的数组。但请记住,生成的数组将遵循输入的形状。你知道吗当您使用
tremor_0[['X']]
时,您会得到一个dataframe对象,它是一个数组。当您使用tremor_0['X']
时,您会得到一个可以轻松转换为列表的Series对象如果您只是试图从一维列中提取数据,那么可以使用
tremor_0['X']
,但是您应该验证给定数据的结果是否有意义以及您试图实现的目标相关问题 更多 >
编程相关推荐