Как вы должны использовать параметр `min_itemsize` в HDFStore.append`? - PullRequest
0 голосов
/ 14 января 2019

Я хочу ограничить размер столбца строки в магазине HDF. Вы должны сделать это с min_itemsize. В документации говорится:

min_itemsize

Базовая реализация HDFStore использует фиксированную ширину столбца. (itemsize) для строковых столбцов. Размер строки столбца рассчитывается как максимальная длина данных (для этого столбца), которые передаются в хранилище HDFS, в первом приложении. Последующие добавления, май ввести строку для столбца больше, чем может содержать столбец, Исключение будет повышено (в противном случае вы могли бы иметь тихое усечение из этих столбцов, что приводит к потере информации). В будущем мы может ослабить это и разрешить усечение, указанное пользователем.

Передайте min_itemsize при создании первой таблицы, чтобы априори указать минимальная длина определенного строкового столбца. min_itemsize может быть integer или dict, отображающий имя столбца в целое число. Вы

http://pandas.pydata.org/pandas-docs/stable/io.html#string-columns

Хорошо, поэтому, когда я делаю это, я получаю неожиданный результат. Я установил min_itemsize на 1 здесь. Это должно установить все строковые столбцы на 1 символьную строку. Но это не тот случай. Зачем? Что я неправильно понимаю в документации?

store = pd.HDFStore('store.h5', mode='w', format='table', complevel=9,
                    complib='blosc:lz4')

values = [['a', 'b'], ['aa', 'bb'], ['aaa', 'bbb']]
columns = ['A', 'B'] 
data = pd.DataFrame(values, columns=columns)

store.append('df', data, min_itemsize=1)

print(store.df)
store.close()

     A    B
0    a    b
1   aa   bb
2  aaa  bbb

Я ожидал, что упомянутое исключение и документация будут выданы.

1 Ответ

0 голосов
/ 14 января 2019

Похоже, что для размера столбца будет установлено наибольшее значение, добавленное в первом кадре данных, или max_itemsize, в зависимости от того, что больше. Код pytables.py имеет несколько ссылок на эту логику:

itemsize = max(1, libwriters.max_len_string_array(ensured))

itemsize = max(min_itemsize or 0, itemsize)

if min_itemsize is not None and self.typ.itemsize < min_itemsize:
...