在蟒蛇熊猫的deque

时间:2013-11-20 08:43:53

标签: python pandas buffer

我正在使用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中获得相同内容的简单方法。换句话说,如何在末尾有效添加单行并在SeriesDataFrame开头删除单行?

编辑:我试过了:

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()方法慢得多。

1 个答案:

答案 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的任何优点。