我正在使用Python的deque()
来实现一个简单的循环缓冲区:
from collections import deque
import numpy as np
test_sequence = np.array(range(100)*2).reshape(100,2)
mybuffer = deque(np.zeros(20).reshape((10, 2)))
for i in test_sequence:
mybuffer.popleft()
mybuffer.append(i)
do_something_on(mybuffer)
我想知道是否有一种使用Series
(或DataFrame
)在Pandas中获得相同内容的简单方法。换句话说,如何在末尾有效添加单行并在Series
或DataFrame
开头删除单行?
编辑:我试过了:
myPandasBuffer = pd.DataFrame(columns=('A','B'), data=np.zeros(20).reshape((10, 2)))
newpoint = pd.DataFrame(columns=('A','B'), data=np.array([[1,1]]))
for i in test_sequence:
newpoint[['A','B']] = i
myPandasBuffer = pd.concat([myPandasBuffer.ix[1:],newpoint], ignore_index = True)
do_something_on(myPandasBuffer)
但它比deque()
方法慢得多。
答案 0 :(得分:1)
如dorvak所述,pandas并非设计用于类似队列的行为。
下面我使用h5py模块在pandas数据帧,numpy数组以及hdf5中的deque中复制了简单的插入函数。
timeit函数显示(毫不奇怪)集合模块更快,其次是numpy然后是pandas。
headers={'user-agent':'Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Googlebot/2.1; +http://www.google.com/bot.html) Safari/537.36',
'From':'iancissel@gmail.com'
}
boston_id='8443970'
url='http://tidesandcurrents.noaa.gov/api/datagetter?date=today&station=8443970&product=high_low&datum=STND&units=english&time_zone=lst&format=json'
r=requests.get(url, headers=headers)
print r
%timeit结果:
deque:每个循环34.1μs
pandas:每个循环48毫秒
numpy数组:每个循环187μs
hdf5 with h5py:每个循环31.7 ms
注意:
我的pandas切片方法只比问题中列出的concat方法稍快一些。
hdf5格式(通过h5py)没有显示出任何优势。我也没有看到安迪建议的HDFStore的任何优点。