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.

Другие вопросы по тегам