2017-02-03 2 views
3

У меня есть блок данных 2Gb, который один раз записывает, читает много df. Я хотел бы использовать df в pandas, поэтому я использовал df.read_hdf и df.to_hdf в фиксированном формате, который отлично работает при чтении и записи.Быстрое чтение указанных столбцов в df с использованием pandas.to_hdf

Однако df растет с добавлением большего количества столбцов, поэтому вместо этого я хотел бы использовать формат таблицы, поэтому я могу выбрать столбцы, которые мне нужны при чтении данных. Я думал, что это даст мне преимущество в скорости, но от тестирования это, похоже, не так.

Этот пример:

import numpy as np 
import pandas as pd 
df = pd.DataFrame(np.random.randn(10000000,9),columns=list('ABCDEFGHI')) 
%time df.to_hdf("temp.h5", "temp", format ="fixed", mode="w") 
%time df.to_hdf("temp2.h5", "temp2", format="table", mode="w") 

показывает фиксированный формат немного быстрее (6.8s против 5,9 секунды на моей машине).

Затем чтение данных (после небольшого перерыва, чтобы убедиться, что файл был полностью сохранен):

%time x = pd.read_hdf("temp.h5", "temp") 
%time y = pd.read_hdf("temp2.h5", "temp2") 
%time z = pd.read_hdf("temp2.h5", "temp2", columns=list("ABC")) 

Урожайность:

Wall time: 420 ms (fixed) 
Wall time: 557 ms (format) 
Wall time: 671 ms (format, specified columns) 

Я понимаю, фиксированный формат быстрее чтение данных, но почему значение df с указанными столбцами медленнее, чем чтение полного фрейма данных? В чем преимущество использования форматирования таблиц (с указанными столбцами или без них) по фиксированному форматированию?

Возможно ли преимущество памяти при увеличении df?

ответ

3

IMO - основное преимущество использования format='table' в сочетании с data_columns=[list_of_indexed_columns] - это возможность условно (см. Параметр where="where clause") читать огромные файлы HDF5. Чтобы вы могли фильтровать свои данные при чтении и обрабатывать свои данные в кусках, чтобы избежать MemoryError.

Вы можете попытаться сохранить отдельные столбцы или группы столбцов (те, которые большую часть времени будут прочитаны вместе) в разных файлах HDF или в том же файле с разными ключами.

Я бы также рассмотреть возможность использования "передовые" технологии - Feather-Format

тестов и время:

import feather 

запись на диск в трех форматах: (HDF5 фиксированные, HDF% таблица, перо)

df = pd.DataFrame(np.random.randn(10000000,9),columns=list('ABCDEFGHI')) 
df.to_hdf('c:/temp/fixed.h5', 'temp', format='f', mode='w') 
df.to_hdf('c:/temp/tab.h5', 'temp', format='t', mode='w') 
feather.write_dataframe(df, 'c:/temp/df.feather') 

чтения с диска:

In [122]: %timeit pd.read_hdf(r'C:\Temp\fixed.h5', "temp") 
1 loop, best of 3: 409 ms per loop 

In [123]: %timeit pd.read_hdf(r'C:\Temp\tab.h5', "temp") 
1 loop, best of 3: 558 ms per loop 

In [124]: %timeit pd.read_hdf(r'C:\Temp\tab.h5', "temp", columns=list('BDF')) 
The slowest run took 4.60 times longer than the fastest. This could mean that an intermediate result is being cached. 
1 loop, best of 3: 689 ms per loop 

In [125]: %timeit feather.read_dataframe('c:/temp/df.feather') 
The slowest run took 6.92 times longer than the fastest. This could mean that an intermediate result is being cached. 
1 loop, best of 3: 644 ms per loop 

In [126]: %timeit feather.read_dataframe('c:/temp/df.feather', columns=list('BDF')) 
1 loop, best of 3: 218 ms per loop # WINNER !!! 

PS если вы столкнулись следующее сообщение об ошибке при использовании feather.write_dataframe(...):

FeatherError: Invalid: no support for strided data yet 

здесь обходной путь:

df = df.copy() 

после этого feather.write_dataframe(df, path) должен работать правильно ...

+0

Спасибо.Не могли бы вы рассказать о том, как сохранить транспонированные данные? Означает ли это, что я должен сохранять столбцы с отдельными ключами, но в том же файле hdf? Не могли бы вы привести пример? – user6538642

+0

@ user6538642, что такое «обычный» ок. Форма DF? – MaxU

+1

Форма = (6 млн. * 50), количество столбцов, расширяющихся до нескольких сотен. Индекс - это мультииндекс (дата (в формате даты и времени) и имя) – user6538642

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