数据帧切片产生不同的结果

2024-10-03 02:39:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过将数据帧切片传递给我的函数来对加速度计数据进行带通滤波,但是基于切片数据的方式,我得到了不同的结果

我尝试使用列名和索引使用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

请注意,从第二行开始,值是不同的,那么哪种方式是正确的方式,为什么?你知道吗

screenshot of my work


Tags: 数据函数datadef方式切片orderfilter
2条回答

简短回答:使用tremor_0['X']。你知道吗

长答案

首先,tremor_0[['X']]tremor_0['X']是不一样的。你知道吗

假设您有一个数据帧:

df = pd.DataFrame(np.ndarray((100, 10)), columns=['x_%i' % i for i in range(10)])
type(df[['x_0']])
# pandas.core.frame.DataFrame
type(df['x_0'])
# pandas.core.series.Series

更重要的是,它们的形状不同

df[['x_0']].shape
# (100, 1)
df['x_0'].shape
# (100, )

因为它对axis=-1应用过滤器,所以scipy.signal.lfilter的处理方式不同。你知道吗

axis : int, optional The axis of the input data array along which to apply the linear filter. The filter is applied to each subarray along this axis. Default is -1.

如果将lfilter参数更改为axis = 0,则butter_bandpass_filter返回带有示例值的数组。但请记住,生成的数组将遵循输入的形状。你知道吗

当您使用tremor_0[['X']]时,您会得到一个dataframe对象,它是一个数组。当您使用tremor_0['X']时,您会得到一个可以轻松转换为列表的Series对象

如果您只是试图从一维列中提取数据,那么可以使用tremor_0['X'],但是您应该验证给定数据的结果是否有意义以及您试图实现的目标

相关问题 更多 >