基于tim的最快移动平均值

2024-06-28 10:59:52 发布

您现在位置: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)

Tags: 方法numpytimefloatmeanappendwhiletrim
1条回答
网友
1楼 · 发布于 2024-06-28 10:59:52

对于这样的问题,您需要一个两边都可以有效扩展或截断的数据结构。Pythonlist在最后是有效的,但在开始时不是。一个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)

相关问题 更多 >