基于时间的滑动窗口和测量(更改)数据到达率

时间:2016-09-03 01:57:31

标签: python list queue sliding-window

我试图实现基于时间的滑动窗口(在Python中),即数据源插入新的数据项,并且比1h更早的项目会被自动删除。最重要的是,我需要测量速率,或者更确切地说是数据源插入项目的速率变化。

我的问题有点双重。首先,如何实现基于时间的窗口的最佳方式。在我目前可能很天真的解决方案中,我只使用Python列表window = []。如果是新数据item,我会附加包含当前时间戳的项目:window.append((current_time, item))。然后,使用计时器,每1秒我pop所有第一个元素的时间戳早于当前时间戳(timestamp-1h):

threshold = int(time.time()*1000) - self.WINDOW_SIZE_IN_MS
while True:
    try:
        if window[0][0] < threshold:
            del self.word_lists[0]
        else:
            break            
    except:
        break

虽然这有效,但我想知道是否有更聪明的解决方案。

更重要的是,衡量费率数据项变化的好方法是进入窗口。在这里,我不知道如何处理这个问题,至少没有一个听起来也很有效。我想到的东西非常幼稚:我每隔5分钟以20个间隔分割1h窗口并计算项目数。如果最近5分钟的间隔比20个间隔的平均值多得多,我说有一个爆发。但我必须每做一次,比方说,1分钟。这听起来效率不高,而且有很多参数。

简而言之,我需要测量新物品进入窗口的加速度。是否有针对此的最佳实践方法?

1 个答案:

答案 0 :(得分:0)

对于第一部分,检查过期项目并在收到要添加的新项目时删除它们会更有效。也就是说,不要打扰定时器,它会无缘无故地唤醒过程一次 - 只需在真正的工作发生时捎带维护工作。

对于第二部分,整个1小时具有已知长度。存储一个整数,该整数是五分钟前列表中的索引。你可以在进行插入时保持这一点,并且你知道你只需要向前移动它。

将所有内容放在一起,伪代码:

window = []
recent_index = 0
def insert(time, item):
    while window and window[0][0] < time - timedelta(hours=1):
        window.pop()
        recent_index -= 1

    while window[recent_index][0] < time - timedelta(minutes=5):
        recent_index += 1

    window.append((time, item))

    return float(len(window) - recent_index) / len(window)

上述函数返回过去五小时内过去一小时内到达的项目数。比方说超过20%或50%,你就会爆发。