如何有效地重新索引csv数据?

时间:2015-04-25 15:19:27

标签: python pandas bigdata

我有一个文件,我从互联网上下载了tick数据。看起来像这样。该文件相对“大”

time,bid,bid_depth,bid_depth_total,offer,offer_depth,offer_depth_total
20150423T014501,81.79,400,400,81.89,100,100
20150423T100001,81.,100,100,84.36,100,100
20150423T100017,81.,100,100,83.52,500,500
20150423T115258,81.01,500,500,83.52,500,500
...

然后我想重新索引数据,以便我可以通过时间类型查询访问它:

from pylab import *
from pandas import *
import pandas.io.date_converters as conv

XLE = read_csv('XLE.csv') # Chunking seems somewhat kludy XLE = pd.read_csv('XLE.csv', chunksize=4)
#preferred something like XLE = pd.read_csv('XLE.csv', index_col=0, parse_dates=True) but can't handle this time format?

XLE = XLE.drop_duplicates(cols='time')

for i in XLE.index :
    XLE [ 'time' ][ i ]= datetime.strptime ( XLE [ 'time' ][ i], '%Y%m%dT%H%M%S')
XLE.index = XLE [ ' time ' ]; del XLE [ 'time']

print XLE[['bid','offer']].ix[1000:1015].to_string() # this is the goal, to be able to manipulate the data through a time index.

我的问题是:

  1. 当我在shell中运行它时,即使对于一个文件也需要相当多的时间。我确信我必须在我的方法中做错事,因为目标是阅读许多文件并将它们合并到一个pandas DataFrame / Timeseries
  2. 熊猫似乎是一种记忆式的方法。当文件真的很大并且不能全部适合内存时,人们会怎么做?是否存在pandas接口,它隐藏了数据实际驻留的pandas,以便在计算过程中根据需要从磁盘加载和卸载文件?
  3. 将过滤器应用于时间列似乎更合乎逻辑,因为它正在读取,然后再对其进行操作。有没有办法通过告诉read函数在读取列 将对象存储在内存中之前调用哪个函数来执行此操作?

1 个答案:

答案 0 :(得分:1)

我有点懒得知道到底发生了什么,但这会非常慢,因为你明确地循环而不是使用矢量化方法中构建的pandas。 (基本上避免使用大熊猫,如果可能的话,通常可以使用大熊猫。)

for i in XLE.index :
    XLE [ 'time' ][ i ]= datetime.strptime ( XLE [ 'time' ][ i], '%Y%m%dT%H%M%S')
XLE.index = XLE [ ' time ' ]; del XLE [ 'time']

您可以通过以下方式将时间转换为pandas datetime:

XLE['time'] = pd.to_datetime(XLE.time)

我不确定parse_dates read_csv为什么date_parser在那里不适合您,但您也可以使用XLE = XLE.set_index('time') 并指定具体格式。< / p>

然后,如果你想把它作为索引:

[f=1-(1./((1+exp((d-d50)/w))))]

这应该让你开始。一次&#39;时间&#39;是一个熊猫日期时间你可以做各种事情(只看文档)。如果事情适合记忆,这些事情应该非常快。如果没有,那么SO上有很多答案可以帮助你,尽管如果可行的话,购买更多内存总是最简单的解决方案。