pandas.HDFStore: Как изменить data_columns для существующего магазина? Я хочу добавить индекс в столбец не в столбцы данных

Я создал большой (120 ГБ; 1 миллиард строк) файл HDF5 с помощью pandas. После первоначального создания файла hdf я добавил в файл так:

with pd.get_store(path_output) as hdf_output:
  for i in range(BIG_LOOP):
    df = ...
    hdf_output.append('all', df, data_columns=[])

Я специально установил data_columns = [], чтобы избежать индексации во время создания. Теперь, когда у меня есть файл HDF, я хотел бы добавить индексы к нескольким столбцам (скажем, columns_to_index = ['A', 'B', 'C'])

Почему-то, судя по ptdump, у меня сейчас data_columns:=['A'], но я не помню, как это произошло. (Возможно, исходный df был написан с другим параметром (я последовательно добавлял в hdfstore в течение нескольких дней и, возможно, что-то изменил). В любом случае, однако, независимо от того, как это было создано, я хотел бы проиндексировать дополнительные столбцы.

Очевидно, просто позвонить mystore.create_table_index('all', columns=['A', 'B', 'C'], optlevel=9, kind='full') не получится. В первый раз, когда я запустил его, он перемешался в течение часа и добавил 2 ГБ к размеру файла (проверка метаданных показывает, что размер фрагмента был увеличен), но у меня нет всех трех индексов (только индекс для 'A'). Как я могу создать индекс для всех трех столбцов?

Я также заметил эту строку в ptdump - мне кажется, что у меня есть "non_index_axes" для элементов, которые я хочу проиндексировать: non_index_axes := [(1, ['A', 'B', 'C'])]

Если невозможно создать индекс в пандах, я был бы признателен за совет о том, как это сделать прямо в pytables. (например, мне нужно сначала удалить какие-либо существующие индексы? и как мне изменить "non_index_axes" и "data_coumns")

Изменить: предвидя вопросы о моем варианте использования, вот общая картина того, чего я пытаюсь достичь:

  1. Прочтите 120 ГБ данных из файлов CSV. Каждый файл представляет собой финансовые данные за один день и состоит из 100 000 строк с примерно дюжиной столбцов в каждой строке. Я просто сохраняю каждую строку последовательно в файле HDF5. Я бы хотел, чтобы этот начальный этап прошел быстро, поэтому я отключил индексацию. В настоящее время я читаю и анализирую каждый файл CSV за 6 секунд, а сохранение в файл HDF5, как указано выше, занимает всего 1,5 секунды.

  2. Проиндексируйте несколько (не все) столбцов для поддержки различных запросов, таких как получение всех элементов с заданной строкой в ​​столбце 1 и датой из столбца 2 в определенном диапазоне.

  3. По прошествии времени я каждый день буду анализировать новый файл CSV и добавлять его в файл HDF5. Ожидаю, что индексы и дальше будут обновляться.

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

В настоящее время я застрял на шаге 2, генерируя индексы столбцов.


person eraoul    schedule 01.08.2016    source источник


Ответы (1)


Я бы сделал это немного по-другому - взгляните на этот небольшой пример:

for chunk in ...  # reading data in chunks:
    # specify `data_columns`, but don't index (`index=False`)
    hdf_output.append('all', chunk, data_columns=[cols_to_index], index=False)

# index columns explicitly     
hdf_output.create_table_index(hdf_key, columns=cols_to_index, optlevel=9, kind='full')
person MaxU    schedule 01.08.2016
comment
Спасибо - да, я нашел этот синтаксис index = False после того, как уже сгенерировал файл, так что это здорово знать. Однако мне кажется, что в идеале у меня должна быть возможность исправить существующий файл - data_columns не встроены в файл HDF ... не так ли? - person eraoul; 02.08.2016