2010-10-26 3 views
6

Je suis récemment tombé sur Pytables et je l'ai trouvé très cool. Il est clair qu'ils sont supérieurs à un format csv pour de très grands ensembles de données. Je cours des simulations en utilisant python. La sortie n'est pas si grande, disons 200 colonnes et 2000 lignes.Pytables vs CSV pour les fichiers qui ne sont pas très grands

Si quelqu'un a de l'expérience avec les deux, pouvez-vous suggérer quel format serait le plus commode à long terme pour de tels ensembles de données qui ne sont pas très grands. Pytables a des capacités de manipulation de données et de navigation des données avec Vitables, mais le navigateur n'a pas autant de fonctionnalités que, disons Excel, qui peuvent être utilisées pour CSV. De même, trouvez-vous un meilleur que l'autre pour importer et exporter des données, si vous travaillez principalement en python? Est-ce que c'est plus pratique en termes d'organisation de fichiers? Des commentaires sur des questions comme celles-ci seraient utiles.

Merci.

+1

Cela dépend probablement de ce que vous faites avec les données, c'est-à-dire comment définissez-vous la commodité. Avez-vous 1. Vous voulez voir les données avec un bon éditeur visuel quand vous voulez 2. Peut-être vérifier les données une fois visuellement et ensuite le transmettre à un autre programme? Si vous voulez le premier et que vous avez besoin de cette fonctionnalité pour 'voir' les données, alors le format csv n'est probablement pas un mauvais choix. Étant donné 2, pytables est probablement bon. Dans les deux cas, vos données sont petites, pourquoi ne pas enregistrer les deux? – Marm0t

Répondre

5

Avez-vous considéré les tableaux Numpy? PyTables sont merveilleux lorsque vos données sont trop volumineuses pour tenir en mémoire, mais une matrice 200x2000 de 8 octets nécessite seulement environ 3 Mo de mémoire. Donc, je pense que PyTables peut être exagéré.

Vous pouvez enregistrer des tableaux numpy à des fichiers en utilisant np.savetxt ou np.savez (pour la compression), et peut les lire à partir de fichiers avec np.loadtxt ou np.load.

Si vous avez beaucoup de telles baies à stocker sur le disque, alors je suggère d'utiliser une base de données au lieu de fichiers .npz numpy. Soit dit en passant, pour stocker une matrice 200x2000 dans une base de données, il vous suffit 3 colonnes de table: ligne, colonne, valeur:

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.8.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.8.52689885 0.05861043 0.71784406 0.20222138 0.63094807] 
# [ 0.01309897 0.45391578 0.04950273 0.93040381 0.41150517 0.66263562]] 

Si vous avez beaucoup de ces 200x2000 matrices, vous devez juste une colonne de table pour spécifier quelle matrice.

+0

Cela semble intéressant. Je ne sais pas grand-chose sur les bases de données, mais j'y reviendrai et je posterai. Ce qui n'est pas clair pour moi à partir de votre exemple est que les coordonnées de chaque valeur de la matrice 2000 lignes x 200 colonnes sont affectées à la table de base de données. Je vais essayer de comprendre cela. – Curious2learn

+0

Je ne pense pas que j'utiliserais une colonne 'id' séparée pour la clé primaire. la ligne/colonne fait une clé primaire bien meilleure, puisque c'est vraiment l'identification pour ce bit de données. pour une matrice de 2000x2000, vous pouvez même devenir intelligent et placer à la fois la ligne et la colonne dans la même colonne entière, quelque chose comme 'row << 16 + col'. – SingleNegationElimination

+0

@TokenMacGuy: Merci! – unutbu

0

Ce ne sont pas des choix «exclusifs».

Vous avez besoin des deux. CSV est juste un format d'échange de données.

Si vous utilisez pytables, vous devez tout de même importer et exporter au format CSV.

+0

Pouvez-vous élaborer s'il vous plaît? Je n'ai pas besoin de créer des fichiers CSV pour utiliser pytables. Merci! – Curious2learn

+0

Vous devez créer un fichier CSV pour échanger des données avec des applications acceptant uniquement le format CSV. Des feuilles de calcul, par exemple. –

2

En ce qui concerne l'importation/l'exportation, PyTables utilise un format de fichier normalisé appelé HDF5. De nombreux logiciels scientifiques (comme MATLAB) ont un support intégré pour HDF5, et l'API C n'est pas terrible. Ainsi, toutes les données dont vous avez besoin d'exporter ou d'importer vers l'une de ces langues peuvent simplement être conservées dans des fichiers HDF5. PyTables ajoute certains attributs, mais ceux-ci ne devraient pas vous faire de mal. Bien sûr, si vous stockez des objets Python dans le fichier, vous ne pourrez pas les lire ailleurs.

La seule bonne chose à propos des fichiers CSV est qu'ils sont lisibles par l'homme. Cependant, si vous avez besoin de stocker autre chose que des nombres simples et de communiquer avec d'autres, vous aurez des problèmes. Je reçois des fichiers CSV provenant de personnes appartenant à d'autres organisations, et j'ai remarqué que les humains ne sont pas bons pour s'assurer que les choses comme les chaînes de caractères sont correctement faites. Il est bon que l'analyseur CSV de Python soit aussi flexible que cela. Un autre problème est que les nombres à virgule flottante ne peuvent pas être stockés exactement dans le texte en utilisant le format décimal. C'est généralement assez bon, cependant.

+0

Merci pour les commentaires! Diriez-vous qu'avec ViTables, même les PyTables deviennent lisibles par l'homme. – Curious2learn

+0

ViTables est génial. MAIS, c'est quelque chose d'une peine à installer (jusqu'à peut-être récemment). –

+0

floats * can * peut être stocké exactement en décimal ascii, mais nécessite quelques chiffres décimaux pour le faire. Cependant, ce n'est souvent pas la valeur par défaut pour le formatage des chaînes de caractères. – SingleNegationElimination

1

Je pense qu'il est très difficile de comparer pytables et csv .. pyTable est une structure de données ehile CSV est un format d'échange pour les données.

1

Ceci est en fait tout à fait liée à une autre réponse que j'ai fourni en ce qui concerne la lecture/écriture des fichiers csv w/numpy:

Python: how to do basic data manipulation like in R?

Vous devriez certainement utilisation numpy, peu importe quoi d'autre! La facilité d'indexation, etc., l'emporte de loin sur le coût de la dépendance supplémentaire (eh bien, je le pense). PyTables, bien sûr, s'appuie également sur numpy.

Sinon, cela dépend vraiment de votre application, de votre matériel et de votre public. Je soupçonne que lire dans des fichiers csv de la taille dont vous parlez n'aura pas d'importance en termes de vitesse par rapport à PyTables. Mais si c'est un problème, écrivez une référence! Lire et écrire des données aléatoires 100 fois. Ou, si les temps de lecture sont plus importants, écrivez une fois, lisez 100 fois, etc.

Je suspecte fortement que PyTables surpasse SQL. SQL va basculer sur les requêtes multi-tables complexes (en particulier si vous faites les mêmes fréquemment), mais même sur les requêtes de table à table unique (dénormalisées), pytables est difficile à battre en termes de vitesse. Je ne peux pas trouver une référence pour ce hors-main, mais vous pouvez être en mesure de creuser quelque chose si vous mine les liens:

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

Je devine exécuter des performances pour vous à ce stade pâle par rapport à la performance du codeur. Donc, surtout, choisissez quelque chose qui vous semble le plus logique!

Autres points:

Comme SQL, PyTables dispose d'une fonction undo. Les fichiers CSV ne l'auront pas, mais vous pouvez les garder en contrôle de version, et vous n'avez pas besoin d'être trop intelligent (les fichiers CSV sont du texte). Par ailleurs, les fichiers CSV seront beaucoup plus volumineux que les formats binaires (vous pouvez certainement écrire vos propres tests pour cela).

2

Un grand avantage pour PyTables est le stockage de métadonnées, comme des variables, etc. Si vous exécutez les simulations plus souvent avec des paramètres différents, vous stockez les résultats sous la forme d'une entrée de tableau dans le fichier h5.

Nous l'utilisons pour stocker des données de mesure + scripts d'expérience pour obtenir les données de sorte qu'il est entièrement autonome.

BTW: Si vous avez besoin de regarder rapidement dans un fichier hdf5, vous pouvez utiliser HDFView. C'est une application Java gratuite de HDFGroup. C'est facile à installer.

Questions connexes