Я хочу представить данные в виде таблицы в Python.Думая "ну, кто-то наверняка написал такой модуль!"Я пошел в PyPI, где нашел Tabular, который оборачивает речевые массивы NumPy мощными функциями манипулирования данными.Большой!К сожалению, это не похоже на электронную таблицу, когда дело касается строк.
>>> import tabular as tb
>>> t = tb.tabarray(records=[('bork', 1, 3.5), ('stork', 2, -4.0)], names=['a','b','c'])
>>> t
tabarray([('bork', 1, 3.5), ('stork', 2, -4.0)],
dtype=[('a', '|S5'), ('b', '<i8'), ('c', '<f8')])
>>> t['a'][0] = 'gorkalork, but not mork'
>>> t
tabarray([('gorka', 1, 3.5), ('stork', 2, -4.0)],
dtype=[('a', '|S5'), ('b', '<i8'), ('c', '<f8')])
Хм ... tabarray!Вы обрезали мою строку там!В самом деле?!NumPy dtype '| S5' означает, что это строка из 5 или менее символов, но давай!Обновите dtype.Переформатируйте весь столбец, если это необходимо.Без разницы.Но не молча выбрасывайте мои данные!
Я попробовал несколько других подходов, но ни один из них не сработал.Например, он создает тип / размер данных при создании табуляции, но не при добавлении записей:
>>> t.addrecords(('mushapushalussh', 3, 4.44))
tabarray([('gorka', 1, 3.5), ('stork', 2, -4.0), ('musha', 3, 4.44)],
dtype=[('a', '|S5'), ('b', '<i8'), ('c', '<f8')])
Я попытался вырезать весь столбец, изменить его тип, задать значение и переназначить его:
>>> firstcol_long = firstcol.astype('|S15')
>>> firstcol_long
tabarray(['gorka', 'stork'],
dtype='|S15')
>>> firstcol_long[0] = 'morkapork'
>>> firstcol_long
tabarray(['morkapork', 'stork'],
dtype='|S15')
>>> t['a'] = firstcol_long
>>> t
tabarray([('morka', 1, 3.5), ('stork', 2, -4.0)],
dtype=[('a', '|S5'), ('b', '<i8'), ('c', '<f8')])
>>>
Он правильно присваивает значения, но исходный тип данных все еще действует, и мои ранее правильные данные снова молча усекаются.Я даже попытался установить явный тип данных:
>>> t = tb.tabarray(records=[('bork', 1, 3.5), ('stork', 2, -4.0)], dtype=[('a', str),('b', int),('c', float)])
>>> t
tabarray([('', 1, 3.5), ('', 2, -4.0)],
dtype=[('a', '|S0'), ('b', '<i8'), ('c', '<f8')])
Господи!Это еще хуже!Он правильно отображал типы int
и float
, но предположил, что str
означал, что я хотел строки длиной 0, и обрезал все данные до нуля.Короче говоря, таблица не только не работает как электронная таблица, я не могу найти способ заставить ее работать.Производительность не является большой проблемой для меня.В моих электронных таблицах может быть не более сотен или тысяч строк, и я бы с радостью попросил систему немного скопировать данные, чтобы облегчить мой код.Табличные, кажется, во многих других отношениях очень хорошо отвечают всем требованиям.
Полагаю, я мог бы создать подкласс табличной таблицы с чем-то, что по умолчанию для всех строк будет иметь что-то невероятно большое (скажем, 1024 или 4096 байт), с помощью метода __setitem__
, который вызывает исключение в случае назначения большей строки.Скорее небрежно ... но есть ли лучшие альтернативы?Я немного разбирался в numpy.recarray и так далее, и не видел ясного пути ... но я буду первым, кто признает, что я совершенно неопытен в NumPy.Реальность такова, что программы манипулирования данными могут увеличить длину строк сверх их первоначального максимума.Конечно, высокофункциональные модули должны это учитывать."Просто обрежь это!"Подход, распространенный в ориентированных на записи базах данных 1974 года, не может быть подходящим для Python в 2011 году!
Мысли и предложения?