2015-04-25 5 views
1

У меня есть файл, который я загрузил данные тика из Интернета. Похоже на это. Файл является относительно «большой»Как эффективно обновлять данные csv?

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. Когда Я запускаю это в оболочке, это занимает довольно много времени даже для одного файла. Я уверен, что я должен делать что-то не так в моем подходе, так как цель состоит в том, чтобы читать много файлов и объединять их в pandas DataFrame/Timeseries.
  2. Pandas выглядит как подход к типу памяти. Что делают люди, когда файлы (ы) действительно большие и не могут все вписаться в память? Есть ли интерфейс pandas, который скрывается от панд, где фактически хранятся данные, чтобы файл загружался и выгружался по мере необходимости с диска по мере прогрессирования вычислений?
  3. Кажется более логичным применить фильтр к столбцу времени, когда он считывается, а затем работать с ним позже. Есть ли способ сделать это, сообщив функции чтения, какую функцию вызывать, когда она читает столбец, до хранения объекта в памяти?
+2

Здесь вам нужно явно указать большой/большой - позже вы подразумеваете, что не устанавливаете в памяти, но явным образом начинаю с этого. Я бы также подумал об изменении названия, так как ваш вопрос будет более конкретным, чем предполагалось в заголовке (вы можете получить доступ только к названию). Кроме того, наилучшей практикой является не импорт, а *. Для pandas pd является стандартным. – JohnE

+0

Я изменил название. Используя команду linux wc, 17745 17745 825340 XLE.csv, и все же переиндексирование занимает много времени, и он падает, если я делаю это на слишком большом количестве файлов. У меня 8 ГБ или оперативная память. – Ivan

ответ

1

Я слишком ленив, слишком точно определяю, что здесь происходит, но это будет очень медленно, потому что вы явно зацикливаете, а не используете панды, созданные в векторизованных методах. (В принципе избежать «за» при использовании панд, если это возможно, и это обычно возможно.)

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'] 

Вы можете конвертировать время в панд DateTime довольно легко с этим:

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

Я не конечно, почему parse_dates с read_csv не работает для вас там, но вы также можете использовать date_parser и указать конкретный формат таким образом.

Тогда, если вы хотите, чтобы сделать его индекс:

XLE = XLE.set_index('time') 

Это должно вам начать работу. Когда-то «время» - это дата и время панд, вы можете делать всевозможные вещи (просто посмотрите документы). Эти вещи должны быть довольно быстрыми, если все поместится в памяти. Если нет, в SO есть ряд ответов, которые могут помочь вам в этом, хотя покупка большего объема памяти всегда является самым простым решением, если это возможно.

+0

На самом деле это работает довольно хорошо. Спасибо. – Ivan

Смежные вопросы