Python 如何创建带索引的循环FIFO缓冲区

Python 如何创建带索引的循环FIFO缓冲区,python,pandas,Python,Pandas,我正在尝试创建一个索引循环FIFO(先进先出)缓冲区,用于保存烛台图表的最后90分钟,用于熊猫数据帧中15个资产的集合,按分钟聚合(即窗口大小=150),以便在客户端应用程序上实时显示(蜡烛棒图)。每(1m)个时间步,它将分别为每个资产维护关闭、打开、高、低和容量功能。单个烛台将由websocket更新,其中最新的时间间隔将根据价格(烛台)变化进行更新。在pandas中表示此数据结构的最有效机制是什么?客户端应用程序需要输出形状[5,15,90],如图所示,分别表示15个资产和90个间隔的[cl

我正在尝试创建一个索引循环FIFO(先进先出)缓冲区,用于保存烛台图表的最后90分钟,用于熊猫数据帧中15个资产的集合,按分钟聚合(即窗口大小=150),以便在客户端应用程序上实时显示(蜡烛棒图)。每(1m)个时间步,它将分别为每个资产维护关闭、打开、高、低和容量功能。单个烛台将由websocket更新,其中最新的时间间隔将根据价格(烛台)变化进行更新。在pandas中表示此数据结构的最有效机制是什么?客户端应用程序需要输出形状[5,15,90],如图所示,分别表示15个资产和90个间隔的[close、open、high、low、volume]

因此,数据将表示为:

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实现了一个简单的解决方案:

class Buffer():
    def __init__(self):
        self.cols = [
                'asset',
                'timestamp',
                'close',
                'high',
                'low'
        ];

        self.lvls = [
            'asset',
            'timestamp'
        ]

        self.frame = pd.DataFrame(
            columns=self.cols
        );

        self.frame.set_index(self.lvls)

    def add(
        self,
        entry
    ):
        ... what would be the most effective
        mechanism to add to the multi indexed
        dataframe given the entry/record 
        {
           "asset":"ASSET",
           "timestamp": 158090000, 
           "close":1.3, 
           "high":1.4, 
           "low":1.2, 
           "open":1.3, 
           "volume":134.5 
        } 
        such that the dataframe timestamp 
        index does not exceed the given 
        window size?

    def as_frame(
        self,
        assets,
        features,
        window_size
    ):
        outframe = self.frame.set_index(self.lvls)
        outframe = outframe.groupby(self.lvls).last()
        outlist = outframe.to_xarray().to_array()
        return outlist

我如何最有效地在熊猫中实施上述问题?如果给定另一个数据结构,不存在更优/性能更好的解决方案?

添加数据应该像使用
append
dict
一样简单,过滤目标
数据框中的列

self.frame.append({k:v for k, v in entry.items() if k in self.cols})
基于您的问题,我认为您希望保留一个
数据帧
,它在传入数据上保持一个连续的150秒窗口

为了过滤结果帧,我将从最新添加的时间窗口计算“开始”时间戳,并使用它过滤行,如下所示:

start_ts = entry['timestamp'] - 150
self.frame = self.frame[ self.frame['ts'] >= start_ts ]
根据数据帧的大小,您可能会在适当的位置获得更好的性能:

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