Pytables и CSV для файлов, которые не очень велики - PullRequest
7 голосов
/ 26 октября 2010

Я недавно наткнулся на Pytables и считаю, что это очень круто.Понятно, что они превосходят формат CSV для очень больших наборов данных.Я запускаю некоторые симуляции с использованием Python.Вывод не такой большой, скажем, 200 столбцов и 2000 строк.

Если кто-то имеет опыт работы с обоими, можете ли вы предложить, какой формат будет более удобным в долгосрочной перспективе для таких наборов данных, которые не очень велики.Pytables имеет возможности манипулирования данными и просмотра данных с помощью Vitables, но браузер не обладает такой функциональностью, как, скажем, Excel, которую можно использовать для CSV.Точно так же, вы находите одно лучше другого для импорта и экспорта данных, если работаете в основном на python?Еще один удобный с точки зрения организации файлов?Любые комментарии по таким вопросам будут полезны.

Спасибо.

Ответы [ 6 ]

6 голосов
/ 26 октября 2010

Рассматривали ли вы массивы Numpy?

PyTables прекрасны, когда ваши данные слишком велики, чтобы поместиться в памяти, но Матрица 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, вам просто нужен еще один столбец таблицы, чтобы указать, какую матрицу.

2 голосов
/ 13 октября 2011

Один большой плюс для PyTables - хранение метаданных, таких как переменные и т. Д. Если вы чаще запускаете симуляции с разными параметрами, вы сохраняете результаты в виде массива в файле h5.

Мы используем его для хранения данных измерений + сценариев эксперимента, чтобы получить данные, чтобы они были полностью автономными.

Кстати: если вам нужно быстро просмотреть файл hdf5, вы можете использовать HDFView. Это бесплатное Java-приложение от HDFGroup. Его легко установить.

2 голосов
/ 26 октября 2010

Что касается импорта / экспорта, PyTables использует стандартизированный формат файла под названием HDF5 .Многие научные пакеты программного обеспечения (например, MATLAB) имеют встроенную поддержку HDF5, и C API не так уж страшен.Поэтому любые данные, которые необходимо экспортировать или импортировать на один из этих языков, можно просто сохранить в файлах HDF5.

PyTables добавляет некоторые свои собственные атрибуты, но они не должны повредить вам.Конечно, если вы храните объекты Python в файле, вы не сможете прочитать их в другом месте.

Одна приятная вещь в CSV-файлах заключается в том, что они удобочитаемы для человека.Однако если вам нужно хранить в них что-то кроме простых чисел и общаться с другими, у вас будут проблемы.Я получаю CSV-файлы от людей из других организаций, и я заметил, что люди не умеют убедиться, что такие вещи, как цитирование строк, выполнены правильно.Хорошо, что анализатор CSV в Python такой же гибкий, как и сейчас.Еще одна проблема заключается в том, что числа с плавающей запятой не могут быть сохранены точно в тексте в десятичном формате.Обычно это достаточно хорошо.

1 голос
/ 23 июня 2011

Это на самом деле очень связано с другим ответом, который я дал относительно чтения / записи CSV-файлов w / numpy:

Python: как выполнять базовые операции с данными, как в R?

Вы должны определенно использовать numpy, несмотря ни на что! Простота индексации и т. Д. Намного превышает стоимость дополнительной зависимости (ну, я так думаю). PyTables, конечно, тоже полагается на numpy.

В противном случае, это действительно зависит от вашего приложения, вашего оборудования и вашей аудитории. Я подозреваю, что чтение в CSV-файлах того размера, о котором вы говорите, не имеет значения с точки зрения скорости по сравнению с PyTables. Но если это проблема, напишите тест! Чтение и запись случайных данных 100 раз. Или, если время чтения имеет большее значение, напишите один раз, прочитайте 100 раз и т. Д.

Я сильно подозреваю, что PyTables превзойдет SQL. SQL будет работать со сложными многотабличными запросами (особенно если вы часто выполняете одни и те же запросы), но даже в однотабличных (так называемых «денормализованных») табличных запросах сложно вычислить pytables с точки зрения скорости. Я не могу найти ссылку на это от руки, но вы, возможно, сможете что-то выкопать, если у вас есть ссылки здесь:

http://www.pytables.org/moin/HowToUse#HintsforSQLusers

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

Другие баллы:

Как и в SQL, PyTables имеет функцию отмены. CSV-файлы не будут иметь этого, но вы можете держать их под контролем версий, и вам не нужно быть слишком умным в VCS (CSV-файлы являются текстовыми).

В соответствующей заметке файлы CSV будут намного больше, чем двоичные форматы (для этого вы также можете написать свои собственные тесты).

1 голос
/ 26 октября 2010

я думаю, что очень трудно сопоставить pytables и csv .. pyTable - структура данных, а CSV - формат обмена данными.

0 голосов
/ 26 октября 2010

Это не «эксклюзивные» варианты.

Вам нужны оба.

CSV - это просто формат обмена данными.Если вы используете pytables, вам все равно нужно импортировать и экспортировать в формате CSV.

...