Pandas, une bibliothèque pour manipuler facilement des données

Posté par  . Édité par _PhiX_, Benoît Sibaud, karteum59, Nÿco, Jiehong, olivierweb, palm123, Benoît et mornik. Modéré par tuiu pol. Licence CC By‑SA.
Étiquettes :
38
19
jan.
2014
Python

À l'occasion de la sortie de la version 0.13, je vous présente cette bibliothèque basée sur Python qui permet de travailler simplement et efficacement avec des données structurées. Jusqu'à présent, les versions se sont enchaînées rapidement mais celle-ci arrive plusieurs mois après la précédente. On peut donc espérer qu'un code développé pour cette nouvelle version demandera moins de maintenance.

Logo pandas

Les principales possibilités sont :

  • récupérer des données depuis des fichiers CSV, tableaux Excel, des pages web, HDF5, etc. ;
  • grouper, découper, alléger, déplacer, écrire les données ;
  • ces données peuvent être à une ou deux dimensions, avec des manques, ou encore temporelles avec ou sans périodicité.

Pour peu que les données soient correctement formatées, pandas peut s'en sortir même dans le cas où la quantité dépasse les capacités de votre machine en traitant les sources morceaux par morceaux.

Le développement de cette bibliothèque s'inscrit dans la problématique de disposer d'outils pour manipuler de gros volumes de données dans le but de leur exploitation scientifique ou commerciale.

Note : pandas fonctionne avec la même base de code sur Python 2 et 3 mais ce n'est, peut-être, pas le cas de toutes les dépendances.

Pourquoi pandas

L'objectif de pandas est d'être le meilleur outil statistique qui soit aussi bien performant, facile d'utilisation et flexible. Le logiciel existe depuis 2008 mais son développement s'est fortement accéléré avec la publication de la version 0.3 en février 2011 (le nombre de modifications pour cette version dépassait celui des modifications depuis le début de projet). Depuis les nouveautés et les corrections de bugs s'enchaînent à un rythme élevé comme le montre la paga What's new.
Pour mieux comprendre la mécanique interne de pandas, je vous suggère de consulter le blog de Wes McKinney, le leader du projet.

Comparaison avec R

Les statisticiens dans la salle doivent se demander pourquoi pandas a été développé alors que R fonctionne très bien. pandas se base sur les bonnes idées de R et s'attache à apporter les fonctionnalités manquantes. Du côté écosystème, R possède l'inestimable CRAN qui est le dépôt des différents paquets venant enrichir la bibliothèque de base, tandis que pandas profite de l'engouement autour des outils scientifiques en Python. L'aspect généraliste de Python permet également de développer l'intégralité d'une application avec un seul langage ce qui n'est pas le cas de R. Reste la licence de R (GPL) qui peut sembler un obstacle pour certaines finalités, Pandas étant sous licence BSD.

Ressources

Bien que la documentation soit étoffée, pour ceux qui souhaitent être accompagnés sur des cas concrets, il existe un livre de recettes ou bien un tutoriel. Voici également une page qui rassemble des liens qui seront intégrés à la documentation officielle dans la version suivante.

Écosystème

Pandas ne vit pas dans un monde cloisonné et sert de base ou de complément à d'autres logiciels que ce soit pour manipuler des données géographiques, faire des statistiques ou encore tendre à remplacer matplotlib pour certains usages.

Politique de développement

Cette version ayant mis un peu de temps à sortir (surtout, il y a eu quelques couacs entre l'étiquetage de cette version 0.13, la mise à jour du site et la mise à disposition sur PyPi), il a été décidé que la prochaine devrait voir le jour dans trois mois sans attendre que les nouvelles fonctionnalités soient terminées.

Aller plus loin

  • # Gros volumes de données ?

    Posté par  (site web personnel) . Évalué à 4.

    J'avais déjà entendu parler de Pandas, mais je n'ai pas eu l'occasion de m'en servir pour l'instant.

    Mais que veux-tu dire exactement par gros volumes de données ? Pour moi, un gros volume de données, ça se compte en Po ou au moins en To, mais je ne pense pas que Pandas soit réellement adapté à de tels volumes.

    • [^] # Re: Gros volumes de données ?

      Posté par  (site web personnel) . Évalué à 2.

      Dans le même ordre d'idée, sur un fichier HDF5 (ou NetCDF4), est-il capable de lire un morceau d'un tableau sans tout charger en mêmoire ? C'est un peu le défaut des modules classique qui ne fonctionne pas avec de gros volumes de données.

      Autre question, Pandas gère t'il le format VTK ?

      • [^] # Re: Gros volumes de données ?

        Posté par  . Évalué à 1.

        D'après la doc, pas de VTK pour pandas, d'ailleurs c'est quoi ce format ?

        pandas se base sur PyTable pour attaquer les fichiers HDF5 et d'après le wiki ça dit :

        Furthermore, PyTables also tries hard to be a high performance interface to HDF5/NumPy, implementing niceties like internal LRU caches for nodes and other data and metadata, automatic computation of optimal chunk sizes for the datasets, a variety of compressors, ranging from slow but efficient (bzip2) to extremely fast ones (Blosc) in addition to the standard zlib.

        http://www.pytables.org/moin/FAQ#HowdoesPyTablescomparewiththeh5pyproject.3F

      • [^] # Re: Gros volumes de données ?

        Posté par  . Évalué à 2. Dernière modification le 20 janvier 2014 à 11:12.

        À propos de VTK, pandas est en python, et VTK fournit des bindings python (apt-get install python-vtk).

        hors sujet
        C'est aussi une dépendance de mayavi, qui est un logiciel / bibliothèque qui permet de manipuler des données 3D dans python, et qui repose largement sur VTK. J'ai un peu joué avec mayavi, mais je trouve que l'intégration au reste du stack python scientifique n'est pas géniale, par exemple parce que mayavi repose sur wx pour tout ce qui est graphique, et que ce n'est pas le toolkit de choix pour le reste du stack, donc c'est moins bien maintenu, et pas du tout stable en interaction avec matplotlib la dernière fois que j'ai regardé…

        J'imagine que ça ne prendrai pas trop de temps d'écrire un wrapper VTK/pandas en passant par des ndarrays numpy, mais j'ai rien trouvé.

        Un bout de code qui lit du vtk dans python:
        https://github.com/vahidR/facy/blob/master/wind.py

        hors sujet
        Finalement, pour tout ce qui est représentation 3D complexe, je me repose du plus en plus sur Blender (en gros je code la glue entre mon code dans un script exécuté dans Blender). Comme tout est compatible python 3, ça se passe assez bien, et blender est vraiment puissant…

        • [^] # Re: Gros volumes de données ?

          Posté par  . Évalué à 1.

          Pour les données structurées il y a SimpleITK qui fournit des fonctions d'import performantes.

          Sur la classe python VTK, ça ne va pas du tout car il faut faire des boucles sur les éléments du fichier VTK ce qui est long en python.

          Le mieux est d'utiliser un langage compilé qui fait la conversion et met tout ça dans un array numpy mais ça il faut le faire à la main dès que l'on a un format de fichier un peu non standard. Sur des petites structures ce n'est pas grave, ça devient chiant sur des plus grandes et c'est ingérable (pour l’utilisateur lambda) sur des structures dépassant la taille de la mémoire.

          Mais VTK est un standard de facto, utilisé par les gens de l'analyse d'images médicales pour la segmentation et par la communauté des éléments finis pour le post traitement (via paraview), une solution sérieuse se doit de traiter ce format en fournissant le même niveau de service (chargment par morceaux comme HDF/NetCDF).

    • [^] # Re: Gros volumes de données ?

      Posté par  . Évalué à 2.

      Il est possible de grignoter des gros tas de données morceaux après morceaux donc je suppose que ça doit être fonctionnel avec des To de données. Par contre je n'utilise pas le logiciel, mon avis est donc à prendre avec des pincettes.

  • # python 2 et 3

    Posté par  . Évalué à 2.

    J'utilise pandas avec python 2.7 et python 3.3 de manière transparente (et sans problèmes de dépendance, sauf des soucis d'interopérabilité pour certains fichiers sauvés au format HDF5, des problèmes de pickling et d'encodage je pense). Ceci étant dit, je suis vraiment très content de cette bibliothèque, qui m'a vraiment simplifié la vie (ah le bonheur de ne plus se demander si la colonne 'z' était la troisième ou la quatrième) …

    C'est un petit détail, mais l'affichage des tableaux en html dans ipython notebook est agréable.

    • [^] # Re: python 2 et 3

      Posté par  . Évalué à 2.

      simplifié la vie (ah le bonheur de ne plus se demander si la colonne 'z' était la troisième ou la quatrième

      Pourtant nommer les colonnes est une fonctionnalité standard d’HDF5, dans les wrappers classiques tels que PyTables et h5py.

      • [^] # Re: python 2 et 3

        Posté par  . Évalué à 1.

        Bien sûr, je parlais de la classe DataFrame de pandas par rapport à une ndarray numpy, pas du format de stockage. Dans les premiers temps où j'utilisais le stack scipy, la seule solution était les structured array pour nommer des colonnes, mais la facilité d'utilisation est bien moindre, et il n'y avait pas les fonctionnalité de MultiIndex si pratique dans pandas pour manipuler des structures de données compliquées (sans déclarer une classe spécifique à chaque fois, et de manière beaucoup moins bien optimisée).

  • # Compraison avec R

    Posté par  . Évalué à 3.

    Je ne comprends pas très bien la comparaison entre pandas et R.

    Si j'ai bien compris, pandas est une bibliothèque spécialisée dans la récupération de données alors de R est un environnement complet de statistiques. Dans ces conditions, est-il bien légitime de les comparer ou de les opposer ?

    A quand un package pour utiliser pandas à partir de R ?

    • [^] # Re: Compraison avec R

      Posté par  (site web personnel) . Évalué à 1.

      On peut déjà utiliser les modules R depuis Python (donc depuis Pandas) avec rpy2 :)

    • [^] # Re: Compraison avec R

      Posté par  (site web personnel) . Évalué à 7.

      La comparaison avec R vient du fait que pandas est là en parti pour apporter au python ce que les dataframes sont dans R : très pratique d'utilisation. Ça permet de manipuler des données en filtrant par nom de colonne par exemple. Donc oui, c'est légitime de les comparer, puisque pandas ne se cache pas de reprendre les avantages des dataframes dans R. Je ne pense pas que pandas apporterait un grand plus sous R. L'avantage de pandas est aussi de disposer des autres atouts de la plate-forme python.

    • [^] # Re: Compraison avec R

      Posté par  . Évalué à 4.

      pandas ce n'est pas seulement récupérer des données depuis des csv et autres, c'est aussi les trier, les découper, les déplacer, gérer les valeurs foireuses ou manquantes, calculer des statistiques. Tout ça en prenant le meilleur de R et d'autres langages pour que ce soit performant et facile d'utilisation donc meilleur que R et les autres langages. D'ailleurs Wes Mc Kinney dit : « I want to build a statistical computing environment that trounces R ».

      • [^] # Re: Compraison avec R

        Posté par  . Évalué à 3.

        Tout ça en prenant le meilleur de R

        Le meilleur de R est l’accès aux milliers de packages statistiques disponibles dans CRAN.

  • # excel+pandas+notebook

    Posté par  . Évalué à 4.

    Combiné aux notebooks d'ipython, cette librairie est vraiment efficace.

    Je n'avais jamais su prendre le temps de maitriser numpy, encore moins d'apprendre R pour pouvoir aisement brasser des tableaux de données de plusieurs millions de lignes (tenant en mémoire vive).
    Au delà des fonctionnalités de base, ce sont les petits détails suivants qui me font gagner un temps fou :
    - lire une source CSV ou Excel en une ligne de code;
    - exporter un résultat au format HTML ou JSON en une ligne (très utile en combinaison d'un framework web comme web2py) ;
    - obtenir un graphique d'un série de plus de 100000 lignes en moins d'une seconde là où Excel s'épuise ;
    - Pivoter et grouper des tableaux dans tous les sens pour produire des résultats
    - Faire du traitement lourd sur les dates ; Quand je dis lourd, je parle des choses pénibles comme l'alignement de dates, le sous et sur-échantillonnage, etc …

    Mes comparaisons systématiques avec Excel sont volontaires. Pandas(+notebook) est pour moi un complément, et parfois un substitut, à Excel dans beaucoup de mes projets. Excel est largement sur-utilisé et au final coûte très cher quand il s'agit d'automatiser des tâches complexes ou de traiter des volumes important (>50000 ligne).

    Dis autrement, je rève d'un frontal tableur pour pandas ;-)

    • [^] # Re: excel+pandas+notebook

      Posté par  . Évalué à 2.

      Du coup XlsxWriter doit t'être utile. Voici un tuto pour l'utiliser en combinaison avec pandas http://pandas-xlsxwriter-charts.readthedocs.org/pandas.html

      • [^] # Re: excel+pandas+notebook

        Posté par  . Évalué à 1.

        Merci, je ne connaissais pas !
        J'utilisais exclusivement OpenPyXL/xlrd/xlwt avec pandas ou carrément une version windows de python/pandas et du Excel automation.

        Je ne sais pas comment va évoluer XlsxWriter mais c'est le support du tableau croisé dynamique qui serait le plus utile (https://github.com/jmcnamara/XlsxWriter/issues/50).

        Allez je rève encore … si le pivot() de pandas pouvait générer un tableau croisé dynamique lors de l'appel à to_excel() !
        … ou si le rendu HTML d'un DataFrame pouvait être pivoté !!

    • [^] # Re: excel+pandas+notebook

      Posté par  . Évalué à 2.

      Dis autrement, je rève d'un frontal tableur pour pandas ;-)

      On a mentionné ça au dev meeting d'IPython la semaine dernière à Berkley.
      Une fois ça mergé, les dev de panda (ou autre)
      pourrons se faire plaisir et implémenter une vue tableur si ils le désirent.

  • # Java

    Posté par  . Évalué à 0.

    Un équivalent Java ou un binding Java ?

    • [^] # Re: Java

      Posté par  . Évalué à 3.

      Jamais utilisé mais vu une presentation d'incanter à un meetup. Ca à l'air assez limité et faible sur le côté IO mais des gens ont l'air de faire des libs autours. Après du peut embarquer du R dans du Java.

      D'une manière générale l'écosystème Python va être excellent pour les "petits" volumes de données. Java à l'inverse à pas mal de trucs quand tu passes en distribué. Faut juste assemblé le ouatmillion de briques et parfois aller glander sur les repos des grosses boites.

      • [^] # Re: Java

        Posté par  . Évalué à 2.

        Faut juste assemblé le ouatmillion de briques et parfois aller glander sur les repos des grosses boites.

        Ah oui, elles sont fortes pour les pauses repos.

  • # Julia

    Posté par  . Évalué à 2. Dernière modification le 22 janvier 2014 à 15:08.

    Depuis quelques mois, j'entends de plus en plus souvent parler du langage Julia en remplacement de R ou Python/numpy. Je n'ai personnellement pas eu le temps de me plonger dedans. Y a t'il des moules qui ont une expérience de ce langage qui pourraient faire un retour ?

    juste une petite nimage en complément

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.