我正在尝试通过将数据帧切片传递给函数来对加速度计数据进行带通滤波,但是基于切片数据的方式,我得到了不同的结果
我尝试使用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
请注意,从第二行开始,值是不同的,那么哪种方法是正确的方法,为什么呢?
答案 0 :(得分:1)
简短答案:使用const BadWords = require('bad-words');
const { readFileSync } = require('fs');
// Matches both ("foo,bar" and "foo, bar")
const bwo_list = readFileSync('bad-words.txt').split(/, ?/);
const bwo_filter = BadWords({ list: bwo_list });
bot.on('message', message => {
// Checks for profrane words!
if(bwo_filter.isProfane(message.content))
message.delete();
});
。
好答案
首先,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, )
处理不同的,因为它对scipy.signal.lfilter
应用了过滤器。
轴:整数,可选 输入数据数组的轴,沿该轴应用线性滤波器。过滤器沿此轴应用于每个子数组。默认值为-1。
如果将axis=-1
参数更改为lfilter
,则axis = 0
将返回带有样本值的数组。但是请记住,结果数组将遵循输入的形状。
答案 1 :(得分:1)
使用rvm fix-permissions
时,您将获得一个数据框对象,该对象是一个数组。使用tremor_0[['X']]
时,您会获得一个Series对象,可以轻松将其转换为列表
如果您只是尝试从一维列中提取数据,请使用tremor_0['X']
,但您应该验证给出的数据有意义的结果以及您要实现的目标