Python 用于活动识别的低通滤波平滑编码优化

Python 用于活动识别的低通滤波平滑编码优化,python,numpy,pandas,scipy,accelerometer,Python,Numpy,Pandas,Scipy,Accelerometer,我正在尝试对加速计数据实现一个低通滤波器(使用x-加速度(ax)、y-加速度(ay)、z-加速度(az)) 我已经计算出我的alpha为0.2 使用以下公式计算沿x方向的直流分量 新的_-ax[n]=(1-alpha)*新的_-ax[n-1]+(alpha*ax[n]) 我能够为一个有几千条记录的小数据集计算这个。但我有一个拥有一百万条记录的数据集,用下面的代码运行它要花很长时间。如果能为我的代码提供时间复杂性方面的帮助,我将不胜感激 ### df is a pandas dataframe o

我正在尝试对加速计数据实现一个低通滤波器(使用x-加速度(ax)、y-加速度(ay)、z-加速度(az))

我已经计算出我的alpha为0.2

使用以下公式计算沿x方向的直流分量

新的_-ax[n]=(1-alpha)*新的_-ax[n-1]+(alpha*ax[n])

我能够为一个有几千条记录的小数据集计算这个。但我有一个拥有一百万条记录的数据集,用下面的代码运行它要花很长时间。如果能为我的代码提供时间复杂性方面的帮助,我将不胜感激

### df is a pandas dataframe object
n_ax = []
seq = range(0, 1000000, 128)
for w in range(len(seq)):
   prev_x = 0
   if w+1 <= len(seq):
      subdf = df[seq[w]:seq[w+1]]
      for i in range(len(subdf)):
          n_ax.append((1-alpha)*prev_x + (alpha*subdf.ax[i]))
          prev_x = n_ax[i]
###df是一个数据帧对象
n_ax=[]
seq=范围(0,1000000,128)
对于范围内的w(len(seq)):
prev_x=0

如果w+1首先,您似乎不需要

if w+1 <= len(seq):
在这里,您将发现比内置列表快得多的数组和方法。例如,您可以直接在数组上应用numpy函数,并在几秒钟而不是几小时内获得结果,而不是在numpy数组中循环每个元素来执行某些处理。例如:

data = numpy.arange(0, 1000000, 128);
shiftData = numpy.arange(128, 1000000, 128);
result = (1-alpha)*data[:-1] + shiftdata;

查看一些有关numpy的教程。我使用此模块处理图像数据,相比之下,通过列表循环处理5000多个图像需要2周的时间,而使用numpy类型最多需要2分钟。

假设您使用的是python 2.7

  • 使用xrange
  • 在循环内计算
    len(seq)
    是不必要的,因为它的值没有变化
  • 访问
    seq
    实际上并不需要它,因为您可以动态计算它
  • 您实际上不需要
    if
    语句,因为在您的代码中,它总是计算为true(
    w in range(len(seq))
    意味着
    w
    最大值将是
    len(seq)-1
  • 您为获取
    subdf
    而进行的切片并不是真正必要的,因为您可以直接访问df(切片会创建一个新列表)
请参阅下面的代码

n_ax = []
SUB_SAMPLE = 128
SAMPLE_LEN = 1000000
seq_len = SAMPLE_LEN/SUB_SAMPLE
for w in xrange(seq_len):
   prev_x = 0
   for i in xrange(w*SUB_SAMPLE,(w+1)*SUB_SAMPLE):
       new_x = (1-alpha)*prev_x + (alpha*df.ax[i])
       n_ax.append(new_x)
       prev_x = new_x
我想不出还有什么明显的优化。如果这仍然很慢,也许您应该考虑将代码> > df>代码>数据复制到Python本地数据类型。如果这些都是浮点数,请使用python
array
,这将提供非常好的性能


如果您仍然需要更好的性能,可以尝试使用
多处理
模块进行并行处理,或者编写一个C模块,在内存中获取一个数组并进行计算,然后使用
ctypes
python库调用它

另请参见和@Warren:谢谢你将我引导到正确的页面。谢谢你的回答。。我要试试你的方法
n_ax = []
SUB_SAMPLE = 128
SAMPLE_LEN = 1000000
seq_len = SAMPLE_LEN/SUB_SAMPLE
for w in xrange(seq_len):
   prev_x = 0
   for i in xrange(w*SUB_SAMPLE,(w+1)*SUB_SAMPLE):
       new_x = (1-alpha)*prev_x + (alpha*df.ax[i])
       n_ax.append(new_x)
       prev_x = new_x