在Pandas中应用RMS公式到三列数据

3

我正在尝试对三维加速度计数据应用RMS函数。同时,我在开头有一个时间戳列,我将其保留为天数计数。因此,数据框如下:

       0        1       2      3
0   1.963   -12.0   -71.0   -2.0
1   1.963   -11.0   -71.0   -3.0
2   1.963   -14.0   -67.0   -6.0
3   1.963   -16.0   -63.0   -7.0
4   1.963   -18.0   -60.0   -8.0

列'0'是天数,所有其他列都是加速度计的三轴数据。现在我正在使用这种方法计算RMS值并将其放入新列中,并删除现有的三轴数据:

def rms_detrend(x):
    return np.sqrt(np.mean(x[1]**2 + x[2]**2 + x[3]**2))

accdf =pd.read_csv(ACC_files[1],header=None)
accdf['ACC_RMS'] = accdf.apply(rms_detrend,axis=1)
accdf = accdf.drop([1,2,3],axis=1)
accdf.columns = accdf['Days','ACC_RMS']

然而,我有70个这样的加速度计数据文件,每个文件大约有4000多行。因此,有没有更好、更快(Pythonic)的方法来处理这些数据呢?谢谢。 上面的代码只是针对一个文件进行的,速度非常慢。


2
首先,这里没有必要调用 apply,你可以直接使用 accdf['ACC_RMS'] = np.mean(accdf [1] **2 + accdf [2] ** 2 + accdf [3] **2) - EdChum
@EdChum np.mean()??我觉得应该是np.sqrt()。 - undefined
在这个例子中,np.mean()并没有起到任何作用,它只是被传递了一个单一的值(这个值的平均值仍然是这个值本身)。 - undefined
2个回答

5

pandas中的一种方法

(df.iloc[:,1:]**2).sum(1).pow(1/2)
Out[26]: 
0    72.034714
1    71.909666
2    68.709534
3    65.375837
4    63.150614
dtype: float64

嘿Wen,显然@jezrael的实现比你的实现快0.1秒,只有0.21秒。不过我会记住这个!感谢你的快速帮助。 - lamo_738
@lamo_738 yw:-)编码愉快 - BENY

4

使用:

accdf['ACC_RMS'] = np.sqrt(accdf.pop(1)**2 + accdf.pop(2)**2 + accdf.pop(3)**2)
print (accdf)
       0    ACC_RMS
0  1.963  72.034714
1  1.963  71.909666
2  1.963  68.709534
3  1.963  65.375837
4  1.963  63.150614

Numpy 优化性能的解决方案:

#[50000 rows x 4 columns]
accdf = pd.concat([accdf] * 10000, ignore_index=True)

In [27]: %timeit (accdf.iloc[:,1:]**2).sum(1).pow(1/2)
1.97 ms ± 89.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [28]: %timeit np.sqrt(np.sum(accdf.to_numpy()[:,1:]**2, axis=1))
202 µs ± 1.25 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

很不幸,我的解决方案在测试时出现了错误,但我猜想它可能比仅使用numpy的解决方案要慢。


它比apply方法更快吗? - lamo_738
@lamo_738 - 是的,它更快。 - jezrael
谢谢,它非常快!但现在哪个是正确的答案?因为@Wen的回答不同! - lamo_738
如何在不降低性能的情况下应用于所有列,考虑到 apply 选项较慢? - Arturo Rodriguez
@ArturoRodriguez - 我的解决方案已经被编辑过了。 - jezrael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接