我有一个包含5000行(df_ohlc_OTF)的时间序列数据帧。 我也有一个列表器,该列表器按行1(df_latest_OTF_candle)接收行。 收到一行后,我想删除最旧的行并将新的行添加到数据框中。
现在我用这样的Concat函数来做到这一点:
if len(df_ohlc_OTF.index)>5000:
df_ohlc_OTF = df_ohlc_OTF.drop(df_ohlc_OTF.index[0], axis='index') # remove oldest row
df_ohlc_OTF = pd.concat([df_ohlc_OTF, df_latest_OTF_candle]) # append new row
如何加快此过程?结束时df_ohlc_OTF的大小始终与我执行一次简单旋转相同,并且我认为concat创建原始数据帧的副本并不很快。
任何帮助,不胜感激!
谢谢
答案 0 :(得分:0)
一种更快的方法是将DataFrame视为环形缓冲区。保留一个单独的计数器,该计数器说明哪个位置保存着最旧的值,并且当输入新值时,只需替换最旧的行并递增计数器(以DataFrame的长度为模)。
当然,这意味着当您要读取或使用DataFrame时,您需要记住,它仅按时间顺序分为两个块:直到(包括)计数器的块(包括较旧的数据)和其余的块。这可能会使一些计算变得有些棘手,但是在大多数情况下,如果需要性能,那可能是值得的。
答案 1 :(得分:0)
谢谢! 最终有了这个快速的解决方案: 更新索引值,排序索引,更新行值
if len(df_ohlc_OTF.index)>500: # rotate or append
df_ohlc_OTF.rename(index={df_ohlc_OTF.index[0]:latest_OTF_candle.index[-1]}, inplace=True)
df_ohlc_OTF.sort_index(inplace=True)
df_ohlc_OTF.iloc[-1, [high, low, open, close]] = latest_OTF_candle.iloc[-1, [high, low, open, close]]