Pandas HDFStore: изменение dtype индексов

Существует ли способ управления типом данных, который используется для хранения индексов фреймов данных при использовании HDFStore.append?

Кажется, что индексы pandas всегда хранятся с 64 битами в файле hdf5. Я хотел бы повысить эффективность хранения и уменьшить размер столбцов индекса.

У меня есть уникальный мультииндекс с тремя столбцами, и сохранение их как индексов uint64 - это огромная трата места в моем приложении:

Учитывая следующий кадр данных

In [15]: df.dtypes
Out[15]: indA              int32
indB              int16
indC              int8
data              float32
dtype: object

простая установка df.set_index(['indA', 'indB', 'indC']) перед HDFStore.append приводит к тому, что indA, indB и indC сохраняются как Int64Col в файле hdf5.

Не устанавливать индекс pandas и вместо этого указывать столбцы данных pytables:

store.append('mytable', df, data_columns=['indA', 'indB', 'indB'])

indA, indB и indC сохраняются с их исходными dtypes, однако дополнительный Int64Col хранится в файле hdf5.

Это на самом деле не помогает: сохраняя исходные dtypes, я сохраняю/сохраняю 56 бит для трех столбцов ind. Однако дополнительный (лишний) столбец индекса стоит 64 бита...

Есть идеи?


person ARF    schedule 18.11.2014    source источник


Ответы (1)


Ваш подход правильный. Столбцы данных обеспечивают возможность поиска и обеспечивают сохранение dtype. На данный момент хранилище индексов довольно исправлено.

Предоставление возможности хранения индекса является открытой проблемой, см. здесь. Я немного поработал над этим, но это не высокоприоритетный банкомат. Добро пожаловать, чтобы вы взглянули.

Обычный ответ на желание уменьшить пространство для хранения — использовать сжатие. Вы, кажется, прыгаете через множество обручей, чтобы сэкономить относительно небольшой объем памяти, но это my2c.

person Jeff    schedule 18.11.2014
comment
Спасибо за разъяснение, Джефф. Похоже, я увлекся, пытаясь оптимизировать эффективность хранения: после экономии около 50% за счет перехода с float64 на float32 для моих столбцов данных я был в ударе... Вы правы, избавление от дополнительного индекса int64 на самом деле оно того не стоит: я создал pytables hdf5 со структурой, которую искал. По сравнению с HDFStore hdf5 с индексами в качестве столбцов данных экономия составляет всего около 2%. (Оба сжаты bzip2.) - Очевидно, что не стоит заморачиваться. Похоже, что сжатие работает очень хорошо с добавленным индексом int64. - person ARF; 19.11.2014