基于时间的最快移动平均值

时间:2019-05-11 00:00:32

标签: python

我目前有一个移动平均线,它使用一个有效的列表,但我想看看去皮是实现此目的的更快方法。

 strut[i].cpsi = round(bit2UntrimPSI(i) + float(strut[i].trim), 0)
 strut[i].rpsi.append([time.time(), strut[i].cpsi])
 while strut[i].rpsi[0][0] <= time.time() - apsiTimeWindow:
      del strut[i].rpsi[0]
 strut[i].apsi = mean([n[1] for n in strut[i].rpsi])

我试图使用Numpy的cumsum函数来完成此操作,但是我唯一的问题是数组的大小是恒定的,并且据我所知无法用时间来控制。下面是那个例子。

def running_mean(x, N):
    cumsum = numpy.cumsum(numpy.insert(x, 0, 0)) 
    return (cumsum[N:] - cumsum[:-N]) / float(N)

1 个答案:

答案 0 :(得分:0)

对于这样的问题,您需要一个可以在两侧有效地扩展或截断的数据结构。 Python list在结尾处很有效率,但在开始时却没有效率。 deque是更好的选择。我不理解您的大问题是否足以按照精确的代码来构建演示,但这是一个演示,它演示了在需要获取更多值的情况下使用deque的想法。 ,丢弃太旧的值,然后计算剩余值的平均值。

from collections import deque
from random import randint

# A double-ended queue and the current "time".
pairs = deque()
t = 0

# Check a few rounds.
for _ in range(3):

    # Get some more simulated (TIME, VALUE) pairs.
    n_vals = randint(5, 10)
    for _ in range(n_vals):
        val = randint(1, 10)
        pairs.append((t, val))
        time_incr = randint(1, 20)
        t += time_incr

    # Check.
    print('\nBEFORE :', pairs)

    # Exclude the data older than 30.
    last_time = pairs[-1][0]
    oldest_time = last_time - 30
    while pairs[0][0] < oldest_time:
        pairs.popleft()

    # Get mean of remaining vals.
    vals = [v for _, v in pairs]
    m = sum(vals) / len(vals)

    # Check.
    print('AFTER  :', pairs)
    print('VALS   :', vals)
    print('MEAN   :', m)