À l'heure actuelle, CSV
j'importe un fichier assez volumineux à chaque fois que j'exécute le script. Existe-t-il une bonne solution pour garder cette trame de données disponible en permanence entre les exécutions, donc je n'ai pas à passer tout ce temps à attendre l'exécution du script?
317
Réponses:
Le moyen le plus simple est de le décaper en utilisant
to_pickle
:Ensuite, vous pouvez le recharger en utilisant:
Remarque: avant 0.11.1
save
etload
étaient le seul moyen de le faire (ils sont désormais obsolètes en faveur deto_pickle
etread_pickle
respectivement).Un autre choix populaire consiste à utiliser HDF5 ( pytables ) qui offre des temps d'accès très rapides pour les grands ensembles de données:
Des stratégies plus avancées sont discutées dans le livre de cuisine .
Depuis 0.13, il y a aussi msgpack qui peut être meilleur pour l'interopérabilité, comme une alternative plus rapide à JSON, ou si vous avez des données objet / texte python (voir cette question ).
la source
Bien qu'il y ait déjà quelques réponses, j'ai trouvé une belle comparaison dans laquelle ils ont essayé plusieurs façons de sérialiser les Pandas DataFrames: Stocker efficacement les Pandas DataFrames .
Ils comparent:
Dans leur expérience, ils ont sérialisé un DataFrame de 1 000 000 lignes avec les deux colonnes testées séparément: l'une avec des données texte, l'autre avec des nombres. Leur avertissement dit:
Le code source du test auquel ils se réfèrent est disponible en ligne . Comme ce code ne fonctionnait pas directement, j'ai apporté quelques modifications mineures, que vous pouvez obtenir ici: serialize.py, j'ai obtenu les résultats suivants:
Ils mentionnent également qu'avec la conversion des données textuelles en données catégorielles , la sérialisation est beaucoup plus rapide. Dans leur test environ 10 fois plus rapide (voir aussi le code de test).
Edit : Les temps plus élevés pour le cornichon que le CSV peuvent être expliqués par le format de données utilisé. Par défaut,
pickle
utilise une représentation ASCII imprimable, qui génère des ensembles de données plus volumineux. Cependant, comme le montre le graphique, le cornichon utilisant le nouveau format de données binaires (version 2,pickle-p2
) a des temps de chargement beaucoup plus faibles.Quelques autres références:
numpy.fromfile
est la plus rapide.la source
.to_pickle()
(qui utilise le stockage binaire) contre.to_hdf()
(sans compression). Le but était la vitesse, la taille du fichier pour HDF était 11x Pickle et le temps de chargement était 5x Pickle. Mes données étaient ~ 5k fichiers de ~ 7k lignes x 6 cols chacun, principalement numérique.Si je comprends bien, vous utilisez déjà,
pandas.read_csv()
mais souhaitez accélérer le processus de développement afin que vous n'ayez pas à charger le fichier à chaque fois que vous modifiez votre script, n'est-ce pas? J'ai quelques recommandations:vous pouvez charger uniquement une partie du fichier CSV en utilisant
pandas.read_csv(..., nrows=1000)
uniquement le bit supérieur de la table pendant le développementutilisez ipython pour une session interactive, de telle sorte que vous gardiez la table pandas en mémoire lorsque vous éditez et rechargez votre script.
convertir le csv en une table HDF5
utilisation mise à jour
DataFrame.to_feather()
etpd.read_feather()
pour stocker des données dans le format binaire de plumes compatible R qui est super rapide (entre mes mains, légèrement plus rapide quepandas.to_pickle()
sur les données numériques et beaucoup plus rapide sur les données de chaîne).Vous pourriez également être intéressé par cette réponse sur stackoverflow.
la source
to_feather
fonctionnerait bien sur les données de chaîne? J'ai comparéto_pickle
etto_feature
sur mon dataframe numérique et pickle est environ 3 fois plus rapide.Pickle fonctionne bien!
la source
.pkl
comme suggéré dans la réponse @Andy Haydens.Vous pouvez utiliser un fichier au format plume. C'est extrêmement rapide.
la source
R
utilisant lafeather
bibliothèque.Pandas DataFrames ont la
to_pickle
fonction qui est utile pour enregistrer un DataFrame:la source
Comme déjà mentionné, il existe différentes options et formats de fichiers ( HDF5 , JSON , CSV , parquet , SQL ) pour stocker une trame de données. Cependant,
pickle
n'est pas un citoyen de première classe (selon votre configuration), car:pickle
est un risque potentiel pour la sécurité. Former la documentation Python pour cornichon :pickle
est lent. Trouvez ici et ici des repères.Selon votre configuration / utilisation, les deux limitations ne s'appliquent pas, mais je ne recommanderais pas
pickle
la persistance par défaut pour les trames de données pandas.la source
Les formats de fichiers Numpy sont assez rapides pour les données numériques
Je préfère utiliser les fichiers numpy car ils sont rapides et faciles à utiliser. Voici un point de référence simple pour enregistrer et charger une trame de données avec 1 colonne de 1 million de points.
en utilisant la
%%timeit
fonction magique d'ipythonla sortie est
pour charger les données dans une trame de données
la sortie est
PAS MAL!
LES INCONVÉNIENTS
Il y a un problème si vous enregistrez le fichier numpy en utilisant python 2, puis essayez d'ouvrir en utilisant python 3 (ou vice versa).
la source
https://docs.python.org/3/library/pickle.html
Les formats du protocole pickle:
La version 0 du protocole est le protocole «lisible par l'homme» d'origine et est rétrocompatible avec les versions antérieures de Python.
Le protocole version 1 est un ancien format binaire qui est également compatible avec les versions antérieures de Python.
La version 2 du protocole a été introduite dans Python 2.3. Il fournit un décapage beaucoup plus efficace des classes de nouveau style. Reportez-vous à PEP 307 pour plus d'informations sur les améliorations apportées par le protocole 2.
La version 3 du protocole a été ajoutée dans Python 3.0. Il prend explicitement en charge les objets octets et ne peut pas être décroché par Python 2.x. Il s'agit du protocole par défaut et du protocole recommandé lorsque la compatibilité avec d'autres versions de Python 3 est requise.
La version 4 du protocole a été ajoutée dans Python 3.4. Il ajoute la prise en charge des très grands objets, le décapage de plus de types d'objets et certaines optimisations de format de données. Reportez-vous à PEP 3154 pour plus d'informations sur les améliorations apportées par le protocole 4.
la source
compatibilité pyarrow entre les versions
Le mouvement global a été vers pyarrow / plume (avertissements de dépréciation de pandas / msgpack). Cependant, j'ai un défi avec pyarrow avec transitoire dans les spécifications Les données sérialisées avec pyarrow 0.15.1 ne peuvent pas être désérialisées avec 0.16.0 ARROW-7961 . J'utilise la sérialisation pour utiliser redis, je dois donc utiliser un encodage binaire.
J'ai retesté diverses options (en utilisant le cahier jupyter)
Avec les résultats suivants pour ma trame de données (dans la
out
variable jupyter)la plume et le parquet ne fonctionnent pas pour mon bloc de données. Je vais continuer à utiliser pyarrow. Cependant je compléterai avec du cornichon (pas de compression). Lors de l'écriture dans le cache, stockez les formulaires sérialisés pyarrow et pickle. Lors de la lecture à partir du cache de secours pour décaper si la désérialisation pyarrow échoue.
la source
Le format dépend de votre cas d'utilisation
La comparaison des formats de fichiers pandas est dans cette vidéo .
la source