Partie 1: manipuler des données

Python s’est imposé comme une alternative très crédible à R dans la manipulation de données. L’écosystème Pandas a permis de démocratiser l’utilisation des DataFrames dans Python et faciliter la manipulation de données structurées grâce à la philosophie SQL. Python reste également le langage le plus pratique pour récupérer et manipuler des données moins structurées (webscraping, API). Python tend à devenir, grâce au développement d’API vers d’autres langages (C, Spark, Postgres, ElasticSearch…), le langage “one to rule them all”

Manipulation
Introduction
Author

Lino Galiana

Published

2024-05-08

Si on associe souvent les data scientists à la mise en oeuvre de modèles d’intelligence artificielle, il est important de ne pas oublier que l’entraînement et l’utilisation de ces modèles ne représente pas forcément le quotidien des data scientists.

En pratique, la récupération de sources de données hétérogènes, la structuration et harmonisation de celles-ci en vue d’une analyse exploratoire préalable à la modélisation ou la visualisation représente une part importante du travail des data scientists. Dans de nombreux environnements c’est même l’essence du travail du data scientist. L’élaboration de modèles pertinents requiert en effet une réflexion approfondie sur les données ; une étape que l’on ne saurait négliger.

Ce cours, comme de nombreuses ressources introductives sur la data science (Wickham, Çetinkaya-Rundel, and Grolemund 2023; VanderPlas 2016; McKinney 2012), proposera donc beaucoup d’éléments sur la manipulation de données, compétence essentielle pour les data scientists.

Les logiciels de programmation orientés autour du concept de base de données sont devenus les outils principaux des data scientists. Le fait de pouvoir appliquer un certain nombre d’opérations standards sur des bases de données, quelle que soit leur nature, permet aux programmeurs d’être plus efficaces que s’ils devaient répéter ces opérations à la main, comme dans Excel.

Tous les langages de programmation dominants dans l’écosystème de la data science reposent sur le principe du dataframe. Il s’agit même d’un objet central dans certains logiciels, notamment R. La logique SQL, un langage de déclaration d’opérations sur des données qui a déjà plus de cinquante ans, offre un cadre pertinent pour effectuer des opérations standardisées sur les colonnes (création de nouvelles colonnes, sélection de sous-ensemble de lignes…).

Néanmoins, le dataframe ne s’est imposé que récemment en Python, grâce au package Pandas créé par Wes McKinney. L’essor de la librairie Pandas (téléchargée plus de 5 millions de fois par jour en 2023) est pour beaucoup dans le succès de Python dans l’écosystème de la data science et a amené, en quelques années, a un renouvellement complet de la manière de coder en Python, ce langage si malléable, autour de l’analyse de données.

Cette partie du cours est une introduction générale à l’écosystème très riche de la manipulation de données avec Python. Ces chapitres évoquent aussi bien la récupération de données que la restructuration et la production d’analyse à partir de celles-ci.

Résumé de cette partie

Pandas est devenu incontournable dans l’écosystème Python pour la data science. Pandas est lui-même construit à partir du package Numpy, qu’il est utile de comprendre pour être à l’aise avec Pandas. Numpy est une librairie bas-niveau pour stocker et manipuler des données. Numpy est au coeur de l’écosystème de la data science car la plupart des librairies, même celles qui manient des objets destructurés, utilisent des objets construits à partir de Numpy1.

L’approche Pandas, qui offre un point d’entrée harmonisé pour manipuler des jeux de données de nature très différente, a été étendue aux objets géographiques avec Geopandas. Il est ainsi possible de manipuler des données géographiques comme s’il s’agissait de données structurées classiques. Les données géographiques et la représentation cartographique deviennent de plus en plus commun avec la multiplication de données ouvertes localisées et de big-data géolocalisées.

Cependant, les données structurées, importées depuis des fichiers plats ne représentent pas l’unique source de données. Les API et le webscraping permettent de télécharger ou d’extraire des données de manière très flexible depuis des pages web ou des guichets spécialisés. Ces données, notamment celles obtenues par webscraping nécessitent souvent un peu plus de travail de nettoyage de données, notamment des chaînes de caractère.

L’écosystème Pandas représente donc un couteau-suisse pour l’analyse de données. C’est pour cette raison que ce cours développera beaucoup de contenu dessus. Avant d’essayer de mettre en oeuvre une solution ad hoc, il est souvent utile de se poser la question suivante : “ne pourrais-je pas le faire avec les fonctionalités de base de Pandas ?” Se poser cette question peut éviter des chemins ardus et faire économiser beaucoup de temps.

Néanmoins, Pandas n’est pas adapté à des données ayant une volumétrie importante. Pour traiter de telles données, il est plutôt recommander de privilégier Polars ou Dask qui reprennent la logique de Pandas mais optimisent son fonctionnement, Spark si on a une infrastructure adaptée, généralement dans des environnements big data, ou DuckDB si on est prêt à utiliser des requêtes SQL plutôt qu’une librairie haut-niveau.

Exercices

Cette partie présente à la fois des tutoriels détaillés et des exercices guidés.

Il est possible de les consulter sur ce site ou d’utiliser l’un des badges présents en début de chapitre, par exemple ceux-ci pour ouvrir le chapitre d’exercices sur Pandas:

Download nbviewer Onyxia Onyxia
Open In Colab githubdev

Pour aller plus loin

Ce cours n’aborde pas vraiment les questions de volumétrie ou de vitesse de calcul. Pandas peut montrer ses limites dans ce domaine sur des jeux de données d’une volumétrie conséquente (plusieurs Gigas).

Il est ainsi intéressant de porter attention à:

  • Le livre Modern Pandas pour obtenir des éléments supplémentaires sur la question de la performance avec Pandas ;
  • La question des objets sparse ;
  • Les packages Dask ou Polars pour accélérer les calculs ;
  • DuckDB pour effectuer de manière très efficace des requêtes SQL ;
  • PySpark pour des données très volumineuses.

Références

Voici une bibliographie sélective des ouvrages intéressants en complément des chapitres de la partie “Manipulation” de ce cours :

McKinney, Wes. 2012. Python for Data Analysis: Data Wrangling with Pandas, NumPy, and IPython. " O’Reilly Media, Inc.".
VanderPlas, Jake. 2016. Python Data Science Handbook: Essential Tools for Working with Data. " O’Reilly Media, Inc.".
Wickham, Hadley, Mine Çetinkaya-Rundel, and Garrett Grolemund. 2023. R for Data Science. " O’Reilly Media, Inc.".

Informations additionnelles

environment files have been tested on.

Latest built version: 2024-05-08

Python version used:

'3.11.6 | packaged by conda-forge | (main, Oct  3 2023, 10:40:35) [GCC 12.3.0]'
Package Version
affine 2.4.0
aiobotocore 2.12.2
aiohttp 3.9.3
aioitertools 0.11.0
aiosignal 1.3.1
alembic 1.13.1
aniso8601 9.0.1
annotated-types 0.6.0
appdirs 1.4.4
archspec 0.2.3
astroid 3.1.0
asttokens 2.4.1
attrs 23.2.0
Babel 2.15.0
bcrypt 4.1.2
beautifulsoup4 4.12.3
black 24.4.2
blinker 1.7.0
blis 0.7.11
bokeh 3.4.0
boltons 23.1.1
boto3 1.34.51
botocore 1.34.51
branca 0.7.1
Brotli 1.1.0
cachetools 5.3.3
cartiflette 0.0.2
Cartopy 0.23.0
catalogue 2.0.10
cattrs 23.2.3
certifi 2024.2.2
cffi 1.16.0
charset-normalizer 3.3.2
click 8.1.7
click-plugins 1.1.1
cligj 0.7.2
cloudpathlib 0.16.0
cloudpickle 3.0.0
colorama 0.4.6
comm 0.2.2
commonmark 0.9.1
conda 24.3.0
conda-libmamba-solver 24.1.0
conda-package-handling 2.2.0
conda_package_streaming 0.9.0
confection 0.1.4
contextily 1.6.0
contourpy 1.2.1
cryptography 42.0.5
cycler 0.12.1
cymem 2.0.8
cytoolz 0.12.3
dask 2024.4.1
dask-expr 1.0.10
debugpy 1.8.1
decorator 5.1.1
dill 0.3.8
distributed 2024.4.1
distro 1.9.0
docker 7.0.0
duckdb 0.10.1
en-core-web-sm 3.7.1
entrypoints 0.4
et-xmlfile 1.1.0
exceptiongroup 1.2.0
executing 2.0.1
fastjsonschema 2.19.1
fiona 1.9.6
flake8 7.0.0
Flask 3.0.2
folium 0.16.0
fontawesomefree 6.5.1
fonttools 4.51.0
frozenlist 1.4.1
fsspec 2023.12.2
GDAL 3.8.4
gensim 4.3.2
geographiclib 2.0
geopandas 0.12.2
geoplot 0.5.1
geopy 2.4.1
gitdb 4.0.11
GitPython 3.1.43
google-auth 2.29.0
graphene 3.3
graphql-core 3.2.3
graphql-relay 3.2.0
graphviz 0.20.3
great-tables 0.5.1
greenlet 3.0.3
gunicorn 21.2.0
htmltools 0.5.1
hvac 2.1.0
idna 3.6
imageio 2.34.1
importlib_metadata 7.1.0
importlib_resources 6.4.0
inflate64 1.0.0
ipykernel 6.29.3
ipython 8.22.2
ipywidgets 8.1.2
isort 5.13.2
itsdangerous 2.1.2
jedi 0.19.1
Jinja2 3.1.3
jmespath 1.0.1
joblib 1.3.2
jsonpatch 1.33
jsonpointer 2.4
jsonschema 4.21.1
jsonschema-specifications 2023.12.1
jupyter-cache 1.0.0
jupyter_client 8.6.1
jupyter_core 5.7.2
jupyterlab_widgets 3.0.10
kaleido 0.2.1
kiwisolver 1.4.5
kubernetes 29.0.0
langcodes 3.4.0
language_data 1.2.0
lazy_loader 0.4
libmambapy 1.5.7
llvmlite 0.42.0
locket 1.0.0
lxml 5.2.1
lz4 4.3.3
Mako 1.3.2
mamba 1.5.7
mapclassify 2.6.1
marisa-trie 1.1.1
Markdown 3.6
MarkupSafe 2.1.5
matplotlib 3.8.3
matplotlib-inline 0.1.6
mccabe 0.7.0
menuinst 2.0.2
mercantile 1.2.1
mizani 0.11.2
mlflow 2.11.3
mlflow-skinny 2.11.3
msgpack 1.0.7
multidict 6.0.5
multivolumefile 0.2.3
munkres 1.1.4
murmurhash 1.0.10
mypy 1.9.0
mypy-extensions 1.0.0
nbclient 0.10.0
nbformat 5.10.4
nest_asyncio 1.6.0
networkx 3.3
nltk 3.8.1
numba 0.59.1
numpy 1.26.4
oauthlib 3.2.2
opencv-python-headless 4.9.0.80
openpyxl 3.1.2
OWSLib 0.28.1
packaging 23.2
pandas 2.2.1
paramiko 3.4.0
parso 0.8.4
partd 1.4.1
pathspec 0.12.1
patsy 0.5.6
Pebble 5.0.7
pexpect 4.9.0
pickleshare 0.7.5
pillow 10.3.0
pip 24.0
pkgutil_resolve_name 1.3.10
platformdirs 4.2.0
plotly 5.19.0
plotnine 0.13.5
pluggy 1.4.0
polars 0.20.18
preshed 3.0.9
prometheus_client 0.20.0
prometheus-flask-exporter 0.23.0
prompt-toolkit 3.0.42
protobuf 4.25.3
psutil 5.9.8
ptyprocess 0.7.0
pure-eval 0.2.2
py7zr 0.20.8
pyarrow 15.0.0
pyarrow-hotfix 0.6
pyasn1 0.5.1
pyasn1-modules 0.3.0
pybcj 1.0.2
pycodestyle 2.11.1
pycosat 0.6.6
pycparser 2.21
pycryptodomex 3.20.0
pydantic 2.7.1
pydantic_core 2.18.2
pyflakes 3.2.0
Pygments 2.17.2
PyJWT 2.8.0
pylint 3.1.0
PyNaCl 1.5.0
pynsee 0.1.7
pyOpenSSL 24.0.0
pyparsing 3.1.2
pyppmd 1.1.0
pyproj 3.6.1
pyshp 2.3.1
PySocks 1.7.1
python-dateutil 2.9.0
python-dotenv 1.0.1
python-magic 0.4.27
pytz 2024.1
pyu2f 0.1.5
pywaffle 1.1.0
PyYAML 6.0.1
pyzmq 25.1.2
pyzstd 0.15.10
QtPy 2.4.1
querystring-parser 1.2.4
rasterio 1.3.10
referencing 0.34.0
regex 2023.12.25
requests 2.31.0
requests-cache 1.2.0
requests-oauthlib 2.0.0
rpds-py 0.18.0
rsa 4.9
Rtree 1.2.0
ruamel.yaml 0.18.6
ruamel.yaml.clib 0.2.8
s3fs 2023.12.2
s3transfer 0.10.1
scikit-image 0.23.2
scikit-learn 1.4.1.post1
scipy 1.13.0
seaborn 0.13.2
setuptools 69.2.0
shapely 2.0.3
six 1.16.0
smart-open 6.4.0
smmap 5.0.0
snuggs 1.4.7
sortedcontainers 2.4.0
soupsieve 2.5
spacy 3.7.4
spacy-legacy 3.0.12
spacy-loggers 1.0.5
SQLAlchemy 2.0.29
sqlparse 0.4.4
srsly 2.4.8
stack-data 0.6.2
statsmodels 0.14.1
tabulate 0.9.0
tblib 3.0.0
tenacity 8.2.3
texttable 1.7.0
thinc 8.2.3
threadpoolctl 3.4.0
tifffile 2024.5.3
tomli 2.0.1
tomlkit 0.12.4
toolz 0.12.1
topojson 1.8
tornado 6.4
tqdm 4.66.2
traitlets 5.14.2
truststore 0.8.0
typer 0.9.4
typing_extensions 4.11.0
tzdata 2024.1
Unidecode 1.3.8
url-normalize 1.4.3
urllib3 1.26.18
wasabi 1.1.2
wcwidth 0.2.13
weasel 0.3.4
webcolors 1.13
webdriver-manager 4.0.1
websocket-client 1.7.0
Werkzeug 3.0.2
wheel 0.43.0
widgetsnbextension 4.0.10
wordcloud 1.9.3
wrapt 1.16.0
xgboost 2.0.3
xlrd 2.0.1
xyzservices 2024.4.0
yarl 1.9.4
yellowbrick 1.5
zict 3.0.0
zipp 3.17.0
zstandard 0.22.0

View file history

SHA Date Author Description
005d89b 2023-12-20 17:23:04 Lino Galiana Finalise l’affichage des statistiques Git (#478)
1f23de2 2023-12-01 17:25:36 Lino Galiana Stockage des images sur S3 (#466)
69cf52b 2023-11-21 16:12:37 Antoine Palazzolo [On-going] Suggestions chapitres modélisation (#452)
154f09e 2023-09-26 14:59:11 Antoine Palazzolo Des typos corrigées par Antoine (#411)
9a4e226 2023-08-28 17:11:52 Lino Galiana Action to check URL still exist (#399)
8082302 2023-08-25 17:48:36 Lino Galiana Mise à jour des scripts de construction des notebooks (#395)
3bdf3b0 2023-08-25 11:23:02 Lino Galiana Simplification de la structure 🤓 (#393)
5d4874a 2023-08-11 15:09:33 Lino Galiana Pimp les introductions des trois premières parties (#387)
8e5edba 2022-09-02 11:59:57 Lino Galiana Ajoute un chapitre dask (#264)
f10815b 2022-08-25 16:00:03 Lino Galiana Notebooks should now look more beautiful (#260)
d201e3c 2022-08-03 15:50:34 Lino Galiana Pimp la homepage ✨ (#249)
12965ba 2022-05-25 15:53:27 Lino Galiana :launch: Bascule vers quarto (#226)
5cac236 2021-12-16 19:46:43 Lino Galiana un petit mot sur mercator (#201)
4cdb759 2021-05-12 10:37:23 Lino Galiana :sparkles: :star2: Nouveau thème hugo :snake: :fire: (#105)
0a0d034 2021-03-26 20:16:22 Lino Galiana Ajout d’une section sur S3 (#97)
4677769 2020-09-15 18:19:24 Lino Galiana Nettoyage des coquilles pour premiers TP (#37)
d48e68f 2020-09-08 18:35:07 Lino Galiana Continuer la partie pandas (#13)
913047d 2020-09-08 14:44:41 Lino Galiana Harmonisation des niveaux de titre (#17)
Back to top

Footnotes

  1. Certaines librairies commencent, petit à petit, à s’émanciper de Numpy qui n’est pas toujours le plus adapté pour la gestion de certains types de données. Le framework Arrow tend à devenir la couche basse utilisée par de plus en plus de librairies de data science. Ce post de blog approfondit de manière très pédagogique ce sujet.↩︎

Citation

BibTeX citation:
@book{galiana2023,
  author = {Galiana, Lino},
  title = {Python Pour La Data Science},
  date = {2023},
  url = {https://pythonds.linogaliana.fr/},
  doi = {10.5281/zenodo.8229676},
  langid = {en}
}
For attribution, please cite this work as:
Galiana, Lino. 2023. Python Pour La Data Science. https://doi.org/10.5281/zenodo.8229676.