如何用pandas创建索引循环FIFO缓冲区

2024-04-19 23:52:16 发布

您现在位置:Python中文网/ 问答频道 /正文

Im正在尝试创建一个索引循环FIFO(先进先出)缓冲区,用于保存pandas数据帧中15个资产的烛台图的最后90分钟,这些数据帧按分钟聚合(即窗口大小=150),以便在客户端应用程序(烛光图)上实时显示。它将保持每(100万)个时间步长的每个资产的收盘、开盘、高、低和成交量特征。单个烛台将由websocket更新,其中最新的时间间隔将根据价格(烛台)的变化进行更新。在pandas中表示这种数据结构的最有效机制是什么,客户端应用程序需要输出形状[5,15,90],如as_frame中所示,分别代表[close,open,high,low,volume]15个资产和90个区间。在

因此,数据可以这样表示:

assets  time   close    open    high    low    volume
asset1  time1  0.001    0.002   0.003   0.001  0.001
        time2  0.001    0.001   0.003   0.001  0.001
        ...
        time90 ...

...

asset15 time1  0.001    0.002   0.003   0.001  0.001
        time2  0.001    0.001   0.003   0.001  0.001
        ...
        time90 ...

我用python pandas实现了一个简单的解决方案:

^{2}$

如何在熊猫身上最有效地实施上述问题?如果在另一种数据结构下,不存在一种更为优化/性能更好的解决方案?在


Tags: 数据应用程序客户端数据结构pandasclose时间open
2条回答

添加数据应该像使用appenddict一样简单,过滤目标DataFrame中的列。在

self.frame.append({k:v for k, v in entry.items() if k in self.cols})

根据您的问题,我想您应该保留一个DataFrame,它在传入数据上保持一个连续150秒的窗口。在

为了过滤生成的帧,我将从最近添加的时间窗口计算“开始”时间戳,并使用该时间戳筛选行,如下所示:

^{pr2}$

根据数据帧的大小,您可能会获得更好的性能下降到位:

self.frame.drop(self.frame[ self.frame['ts'] < start_ts ].index, inplace=True)

您可能可以在检查时间索引的长度后执行移位:

if len(self.frame.index.levels(1))>=150:
   self.frame = self.frame.shift(1)

相关问题 更多 >