Pytables и CSV для файлов, которые не очень велики
Я недавно наткнулся на Pytables и считаю, что это очень круто. Понятно, что они превосходят формат CSV для очень больших наборов данных. Я запускаю некоторые симуляции с использованием Python. Вывод не такой большой, скажем, 200 столбцов и 2000 строк.
Если у кого-то есть опыт работы с обоими, можете ли вы предложить, какой формат будет более удобным в долгосрочной перспективе для таких наборов данных, которые не очень велики. Pytables имеет возможности манипулирования данными и просмотра данных с помощью Vitables, но браузер не обладает такой функциональностью, как, скажем, Excel, которую можно использовать для CSV. Точно так же, вы находите одно лучше другого для импорта и экспорта данных, если работаете в основном на python? Еще один удобный с точки зрения организации файлов? Любые комментарии по таким вопросам будут полезны.
Благодарю.
6 ответов
Вы рассматривали массивы Numpy?
PyTable замечательны, когда ваши данные слишком велики, чтобы поместиться в памяти, но матрица размером 200x2000 с 8-байтовыми числами требует только около 3 МБ памяти. Поэтому я думаю, что PyTables может быть излишним.
Вы можете сохранить массивы в файлы, используя np.savetxt
или же np.savez
(для сжатия), и может читать их из файлов с np.loadtxt
или же np.load
,
Если у вас есть много таких массивов для хранения на диске, то я бы предложил использовать базу данных вместо numpy .npz
файлы. Кстати, чтобы сохранить матрицу 200x2000 в базе данных, вам нужно всего 3 столбца таблицы: строка, столбец, значение:
import sqlite3
import numpy as np
db = sqlite3.connect(':memory:')
cursor = db.cursor()
cursor.execute('''CREATE TABLE foo
(row INTEGER,
col INTEGER,
value FLOAT,
PRIMARY KEY (row,col))''')
ROWS=4
COLUMNS=6
matrix = np.random.random((ROWS,COLUMNS))
print(matrix)
# [[ 0.87050721 0.22395398 0.19473001 0.14597821 0.02363803 0.20299432]
# [ 0.11744885 0.61332597 0.19860043 0.91995295 0.84857095 0.53863863]
# [ 0.80123759 0.52689885 0.05861043 0.71784406 0.20222138 0.63094807]
# [ 0.01309897 0.45391578 0.04950273 0.93040381 0.41150517 0.66263562]]
# Store matrix in table foo
cursor.executemany('INSERT INTO foo(row, col, value) VALUES (?,?,?) ',
((r,c,value) for r,row in enumerate(matrix)
for c,value in enumerate(row)))
# Retrieve matrix from table foo
cursor.execute('SELECT value FROM foo ORDER BY row,col')
data=zip(*cursor.fetchall())[0]
matrix2 = np.fromiter(data,dtype=np.float).reshape((ROWS,COLUMNS))
print(matrix2)
# [[ 0.87050721 0.22395398 0.19473001 0.14597821 0.02363803 0.20299432]
# [ 0.11744885 0.61332597 0.19860043 0.91995295 0.84857095 0.53863863]
# [ 0.80123759 0.52689885 0.05861043 0.71784406 0.20222138 0.63094807]
# [ 0.01309897 0.45391578 0.04950273 0.93040381 0.41150517 0.66263562]]
Если у вас много таких матриц 200x2000, вам просто нужен еще один столбец таблицы, чтобы указать, какую матрицу.
Один большой плюс для PyTables - это хранение метаданных, таких как переменные и т. Д. Если вы чаще запускаете симуляции с разными параметрами, вы сохраняете результаты в виде массива в файле h5.
Мы используем его для хранения данных измерений + сценариев эксперимента, чтобы получить данные, чтобы они были полностью автономными.
Кстати: если вам нужно быстро просмотреть файл hdf5, вы можете использовать HDFView. Это бесплатное Java-приложение от HDFGroup. Это легко установить.
Что касается импорта / экспорта, PyTables использует стандартизированный формат файла, называемый HDF5. Многие научные пакеты программного обеспечения (например, MATLAB) имеют встроенную поддержку HDF5, и C API не так уж страшен. Поэтому любые данные, которые необходимо экспортировать или импортировать на один из этих языков, можно просто сохранить в файлах HDF5.
PyTables действительно добавляет некоторые свои собственные атрибуты, но они не должны повредить вам. Конечно, если вы храните объекты Python в файле, вы не сможете прочитать их в другом месте.
Одна приятная вещь о файлах CSV - то, что они удобочитаемы для человека. Однако если вам нужно хранить в них что-то кроме простых чисел и общаться с другими, у вас будут проблемы. Я получаю CSV-файлы от людей из других организаций, и я заметил, что люди не способны убедиться, что такие вещи, как цитирование строк, выполняются правильно. Хорошо, что анализатор CSV в Python такой же гибкий, как и сейчас. Еще одна проблема заключается в том, что числа с плавающей запятой не могут быть сохранены точно в тексте в десятичном формате. Это обычно достаточно хорошо, хотя.
Я думаю, что очень трудно совместить pytables и csv. pyTable - структура данных, а CSV - это формат обмена данными.
На самом деле это связано с другим ответом, который я дал относительно чтения / записи CSV-файлов w / numpy:
Python: как сделать основные манипуляции с данными, как в R?
Вы обязательно должны использовать NumPy, независимо от того, что еще! Простота индексации и т. Д. Намного превышает стоимость дополнительной зависимости (ну, я так думаю). PyTables, конечно, тоже полагается на numpy.
В противном случае, это действительно зависит от вашего приложения, вашего оборудования и вашей аудитории. Я подозреваю, что чтение в CSV-файлах того размера, о котором вы говорите, не имеет значения с точки зрения скорости по сравнению с PyTables. Но если это проблема, напишите тест! Чтение и запись случайных данных 100 раз. Или, если время чтения имеет большее значение, напишите один раз, прочитайте 100 раз и т. Д.
Я сильно подозреваю, что PyTables превзойдет SQL. SQL будет работать со сложными многотабличными запросами (особенно, если вы часто выполняете одни и те же запросы), но даже в однотабличных (так называемых "денормализованных") табличных запросах сложно вычислить pytables с точки зрения скорости. Я не могу найти ссылку на это от руки, но вы, возможно, сможете что-то выкопать, если вы найдете здесь ссылки:
http://www.pytables.org/moin/HowToUse
Я предполагаю, что производительность выполнения для вас на этом этапе будет бледной по сравнению с производительностью кодера. Поэтому, прежде всего, выберите то, что имеет для вас наибольшее значение!
Другие моменты:
Как и в SQL, PyTables имеет функцию отмены. CSV-файлы не будут иметь этого, но вы можете держать их под контролем версий, и вам не нужно быть слишком умным в VCS (CSV-файлы являются текстовыми).
На заметку о том, что файлы CSV будут намного больше, чем двоичные форматы (вы также можете написать свои собственные тесты для этого).
Это не "эксклюзивный" выбор.
Вам нужны оба.
CSV - это просто формат обмена данными. Если вы используете pytables, вам все равно нужно импортировать и экспортировать в формате CSV.