2015-01-25 3 views
0

Я пытаюсь обработать большой (2 гб) файл csv на машине с 4 ГБ ОЗУ (не спрашивать), чтобы создать другой, отформатированный csv, содержащий подмножество данных который нуждается в некоторой обработке. Я читаю файл и создаю HDFstore, который я запрашиваю позже для данных, которые мне нужны для вывода. Все работает, за исключением того, что я не могу извлечь данные из хранилища с помощью Term - сообщение об ошибке возвращает, что PLOT не является именем столбца. Отдельные переменные выглядят прекрасно, и магазин - это то, что я ожидаю, я просто не вижу, где ошибка. (nb pandas v14 и numpy1.9.0). Очень новичок в этом, так что извиняюсь за неуклюжий код.pandas HDF select не распознает имя столбца

#wibble wobble -*- coding: utf-8 -*- 
# short version 
def filesport(): 
    import pandas as pd 
    import numpy as np 
    from pandas.io.pytables import Term 

    Location = r"CL_short.csv" 
    store = pd.HDFStore('blarg.h5') 

    maxlines = sum(1 for line in open (Location)) 
    print maxlines 
#set chunk small for test file 
    chunky=4 
    plotty =pd.DataFrame(columns=['PLOT']) 
    dfdum=pd.DataFrame(columns=['PLOT', 'mDate', 'D100']) 

#read file in chunks to avoid RAM blowing up  
    bucket = pd.read_csv(Location, iterator=True, chunksize=chunky, usecols= ['PLOT','mDate','D100']) 

    for chunk in bucket: 
     store.append('wibble', chunk, format='table', data_columns=['PLOT','mDate','D100'], ignore_index=True) 

#retrieve plot numbers and select unique items 
    plotty = store.select('wibble', "columns = ['PLOT']") 
    plotty.drop_duplicates(inplace=True) 

#iterate through unique plots to retrieve data and put in dataframe for output 
    for index, row in plotty.iterrows(): 
     dfdum = store.select('wibble', [Term('PLOT', '=', plotty.iloc[index]['PLOT'])]) 
#process dfdum for output to new csv 

    print("successful completion") 
filesport() 
+0

Я отвечу на свой вопрос в случае кто-то еще сталкивается с проблемой и находит себя в этой темноте, одинокую угол полотна , Проблема заключается в том, что Term должен быть строкой, а числовая часть Term - числовой переменной, а не строкой. Я не мог заставить функцию str работать внутри части Term(), но это работало для индекса, строка в plotty.iterrows(): условие = 'PLOT =' + str (plotty.iloc [index] ['PLOT' ]) dfdum = store.select ('wibble', [Term (условие)]). – zarquon

+0

для индекса, строка в plotty.iterrows(): условие = 'PLOT =' + str (plotty.iloc [index] ['PLOT']) dfdum = store.select ('wibble', [Term (condition) ]) – zarquon

ответ

0

Окончательный список для тех, кто желает бороться через перекати, чтобы добраться сюда и так же озадачены обработкой больших .csv файлов и различных методов пытаются получить данные/процесса. Самая большая проблема заключалась в том, чтобы получить sytax для pytables Term right. Несмотря на несколько примеров, показывающих, что можно использовать «A> 20» и т. Д., Это никогда не работало для меня. Я установил условие строки, содержащее запрос Term, и это сработало (это в документации TBF).
Также было проще запросить HDF для извлечения уникальных элементов непосредственно из хранилища в списке, который затем можно сортировать и повторять для извлечения графика данных по сюжету. Обратите внимание, что я хотел, чтобы последний файл csv имел график, а затем все данные D100 в порядке дат, следовательно, точка в конце.
Чтение файла csv в кусках означало, что каждый сюжет, извлеченный из магазина, имел заголовок, и это было записано в окончательный csv, который перепутал вещи. Я уверен, что есть более элегантный способ писать только один заголовок, чем тот, который я показал здесь.
Он работает, занимает около 2 часов для обработки данных и создания окончательного файла csv (начальный файл 2GB, 30 + миллионов строк, данные для 100 000 + уникальных графиков, машина имеет 4 ГБ ОЗУ, но работает 32-битная, что означает, что только 2,5 ГБ ОЗУ).
Успехов, если у вас есть аналогичные проблемы, и я надеюсь, что вы найдете этот полезный

#wibble wobble -*- coding: utf-8 -*- 

def filesport(): 
    import pandas as pd 
    import numpy as np 
    from pandas.io.pytables import Term 

    print (pd.__version__) 
    print (np.__version__) 

    Location = r"conliq_med.csv" 
    store = pd.HDFStore('blarg.h5') 

    maxlines = sum(1 for line in open (Location)) 
    print maxlines 
    chunky=100000 

#read file in chunks to avoid RAM blowing up select only needed columns 
    bucket = pd.read_csv(Location, iterator=True, chunksize=chunky, usecols= ['PLOT','mDate','D100']) 

    for chunk in bucket: 
     store.append('wibble', chunk, format='table', data_columns=['PLOT','mDate','D100'], ignore_index=True) 

#retrieve unique plots and sort 
    plotty = store.select_column('wibble', 'PLOT').unique() 
    plotty.sort() 
#set flag for writing file header 
    i=0 

#iterate through unique plots to retrieve data and put in dataframe for output 
    for item in plotty: 
     condition = 'PLOT =' + str(item) 
     dfdum = store.select('wibble', [Term(condition)]) 
     dfdum["mDate"]= pd.to_datetime(dfdum["mDate"], dayfirst=True) 
     dfdum.sort(columns=["PLOT", "mDate"], inplace=True) 
     dfdum["mDate"] = dfdum["mDate"].map(lambda x: x.strftime("%Y - %m")) 
     dfdum=dfdum.pivot("PLOT", "mDate", "D100") 

#only print one header to file 
     if i ==0: 
      dfdum.to_csv("CL_OP.csv", mode='a') 
      i=1 
     else: 
      dfdum.to_csv("CL_OP.csv", mode='a', header=False) 

    print("successful completion") 

filesport()