在实时流数据上复制pandas
滚动窗口功能的有效方法是什么?在
假设我们想保持最后一个n观察值的总和,collections.deque
加上maxlen
参数是可行的,但是如果不是固定的n我们需要最后m秒的值的和呢?在
使用pandas.Series
将是低效的,因为底层的numpy
数组是不可变的,因此不适合处理实时数据流-每次追加都复制整个数组。在
像cachetools.TTLCache
这样的东西很适合存储实时数据,但是对于计算来说效率很低-要获得总和,需要每次迭代每个元素。在
目前,我维护实时数据流总和的方法使用collections.deque
、生存时间参数和一个用于丢弃旧值的while
循环:
import time
from collections import deque
class Accumulator:
def __init__(self, ttl):
self.ttl = ttl
self.sum = 0
self.q = deque()
def append(self, value):
self.q.append((time.time(), value))
self.sum += value
self.discard_old_values()
def discard_old_values(self):
cutoff_time = time.time() - self.ttl
try:
while self.q[0][0] < cutoff_time:
self.sum -= self.q.popleft()[1]
except IndexError:
pass
def get_sum(self):
self.discard_old_values()
return self.sum
所以问题是:
while
循环?在pandas
滚动窗口?在
以下是我对
discard_old_values
的改进建议:我决定不为可能被丢弃的每个元素调用
time.time()
,而是调用它一次并执行算术,只找到一次“死亡时间”。在这节省了抛出异常的成本,以及多次调用time的成本。在
相关问题 更多 >
编程相关推荐