'3.12.6 | packaged by conda-forge | (main, Sep 30 2024, 18:08:52) [GCC 13.3.0]'
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, et 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 Numpy
1.
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 fonctionnalité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 recommandé
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
:
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
ouPolars
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 :
Informations additionnelles
environment files have been tested on.
Latest built version: 2024-11-20
Python version used:
Package | Version |
---|---|
affine | 2.4.0 |
aiobotocore | 2.15.1 |
aiohappyeyeballs | 2.4.3 |
aiohttp | 3.10.8 |
aioitertools | 0.12.0 |
aiosignal | 1.3.1 |
alembic | 1.13.3 |
altair | 5.4.1 |
aniso8601 | 9.0.1 |
annotated-types | 0.7.0 |
appdirs | 1.4.4 |
archspec | 0.2.3 |
asttokens | 2.4.1 |
attrs | 24.2.0 |
babel | 2.16.0 |
bcrypt | 4.2.0 |
beautifulsoup4 | 4.12.3 |
black | 24.8.0 |
blinker | 1.8.2 |
blis | 0.7.11 |
bokeh | 3.5.2 |
boltons | 24.0.0 |
boto3 | 1.35.23 |
botocore | 1.35.23 |
branca | 0.7.2 |
Brotli | 1.1.0 |
cachetools | 5.5.0 |
cartiflette | 0.0.2 |
Cartopy | 0.24.1 |
catalogue | 2.0.10 |
cattrs | 24.1.2 |
certifi | 2024.8.30 |
cffi | 1.17.1 |
charset-normalizer | 3.3.2 |
click | 8.1.7 |
click-plugins | 1.1.1 |
cligj | 0.7.2 |
cloudpathlib | 0.20.0 |
cloudpickle | 3.0.0 |
colorama | 0.4.6 |
comm | 0.2.2 |
commonmark | 0.9.1 |
conda | 24.9.1 |
conda-libmamba-solver | 24.7.0 |
conda-package-handling | 2.3.0 |
conda_package_streaming | 0.10.0 |
confection | 0.1.5 |
contextily | 1.6.2 |
contourpy | 1.3.0 |
cryptography | 43.0.1 |
cycler | 0.12.1 |
cymem | 2.0.8 |
cytoolz | 1.0.0 |
dask | 2024.9.1 |
dask-expr | 1.1.15 |
databricks-sdk | 0.33.0 |
debugpy | 1.8.6 |
decorator | 5.1.1 |
Deprecated | 1.2.14 |
diskcache | 5.6.3 |
distributed | 2024.9.1 |
distro | 1.9.0 |
docker | 7.1.0 |
duckdb | 0.10.1 |
en-core-web-sm | 3.7.1 |
entrypoints | 0.4 |
et_xmlfile | 2.0.0 |
exceptiongroup | 1.2.2 |
executing | 2.1.0 |
fastexcel | 0.11.6 |
fastjsonschema | 2.20.0 |
fiona | 1.10.1 |
Flask | 3.0.3 |
folium | 0.17.0 |
fontawesomefree | 6.6.0 |
fonttools | 4.54.1 |
frozendict | 2.4.4 |
frozenlist | 1.4.1 |
fsspec | 2023.12.2 |
gensim | 4.3.2 |
geographiclib | 2.0 |
geopandas | 1.0.1 |
geoplot | 0.5.1 |
geopy | 2.4.1 |
gitdb | 4.0.11 |
GitPython | 3.1.43 |
google-auth | 2.35.0 |
graphene | 3.3 |
graphql-core | 3.2.4 |
graphql-relay | 3.2.0 |
graphviz | 0.20.3 |
great-tables | 0.12.0 |
greenlet | 3.1.1 |
gunicorn | 22.0.0 |
h2 | 4.1.0 |
hpack | 4.0.0 |
htmltools | 0.6.0 |
hyperframe | 6.0.1 |
idna | 3.10 |
imageio | 2.36.0 |
importlib_metadata | 8.5.0 |
importlib_resources | 6.4.5 |
inflate64 | 1.0.0 |
ipykernel | 6.29.5 |
ipython | 8.28.0 |
itsdangerous | 2.2.0 |
jedi | 0.19.1 |
Jinja2 | 3.1.4 |
jmespath | 1.0.1 |
joblib | 1.4.2 |
jsonpatch | 1.33 |
jsonpointer | 3.0.0 |
jsonschema | 4.23.0 |
jsonschema-specifications | 2024.10.1 |
jupyter-cache | 1.0.0 |
jupyter_client | 8.6.3 |
jupyter_core | 5.7.2 |
kaleido | 0.2.1 |
kiwisolver | 1.4.7 |
langcodes | 3.5.0 |
language_data | 1.3.0 |
lazy_loader | 0.4 |
libmambapy | 1.5.9 |
locket | 1.0.0 |
lxml | 5.3.0 |
lz4 | 4.3.3 |
Mako | 1.3.5 |
mamba | 1.5.9 |
mapclassify | 2.8.1 |
marisa-trie | 1.2.1 |
Markdown | 3.6 |
markdown-it-py | 3.0.0 |
MarkupSafe | 2.1.5 |
matplotlib | 3.9.2 |
matplotlib-inline | 0.1.7 |
mdurl | 0.1.2 |
menuinst | 2.1.2 |
mercantile | 1.2.1 |
mizani | 0.11.4 |
mlflow | 2.16.2 |
mlflow-skinny | 2.16.2 |
msgpack | 1.1.0 |
multidict | 6.1.0 |
multivolumefile | 0.2.3 |
munkres | 1.1.4 |
murmurhash | 1.0.10 |
mypy-extensions | 1.0.0 |
narwhals | 1.14.1 |
nbclient | 0.10.0 |
nbformat | 5.10.4 |
nest_asyncio | 1.6.0 |
networkx | 3.3 |
nltk | 3.9.1 |
numpy | 1.26.4 |
opencv-python-headless | 4.10.0.84 |
openpyxl | 3.1.5 |
opentelemetry-api | 1.16.0 |
opentelemetry-sdk | 1.16.0 |
opentelemetry-semantic-conventions | 0.37b0 |
OWSLib | 0.28.1 |
packaging | 24.1 |
pandas | 2.2.3 |
paramiko | 3.5.0 |
parso | 0.8.4 |
partd | 1.4.2 |
pathspec | 0.12.1 |
patsy | 0.5.6 |
Pebble | 5.0.7 |
pexpect | 4.9.0 |
pickleshare | 0.7.5 |
pillow | 10.4.0 |
pip | 24.2 |
platformdirs | 4.3.6 |
plotly | 5.24.1 |
plotnine | 0.13.6 |
pluggy | 1.5.0 |
polars | 1.8.2 |
preshed | 3.0.9 |
prometheus_client | 0.21.0 |
prometheus_flask_exporter | 0.23.1 |
prompt_toolkit | 3.0.48 |
protobuf | 4.25.3 |
psutil | 6.0.0 |
ptyprocess | 0.7.0 |
pure_eval | 0.2.3 |
py7zr | 0.20.8 |
pyarrow | 17.0.0 |
pyarrow-hotfix | 0.6 |
pyasn1 | 0.6.1 |
pyasn1_modules | 0.4.1 |
pybcj | 1.0.2 |
pycosat | 0.6.6 |
pycparser | 2.22 |
pycryptodomex | 3.21.0 |
pydantic | 2.9.2 |
pydantic_core | 2.23.4 |
Pygments | 2.18.0 |
PyNaCl | 1.5.0 |
pynsee | 0.1.8 |
pyogrio | 0.10.0 |
pyOpenSSL | 24.2.1 |
pyparsing | 3.1.4 |
pyppmd | 1.1.0 |
pyproj | 3.7.0 |
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.1 |
PyYAML | 6.0.2 |
pyzmq | 26.2.0 |
pyzstd | 0.16.2 |
querystring_parser | 1.2.4 |
rasterio | 1.4.2 |
referencing | 0.35.1 |
regex | 2024.9.11 |
requests | 2.32.3 |
requests-cache | 1.2.1 |
retrying | 1.3.4 |
rich | 13.9.4 |
rpds-py | 0.21.0 |
rsa | 4.9 |
ruamel.yaml | 0.18.6 |
ruamel.yaml.clib | 0.2.8 |
s3fs | 2023.12.2 |
s3transfer | 0.10.2 |
scikit-image | 0.24.0 |
scikit-learn | 1.5.2 |
scipy | 1.13.0 |
seaborn | 0.13.2 |
setuptools | 74.1.2 |
shapely | 2.0.6 |
shellingham | 1.5.4 |
six | 1.16.0 |
smart-open | 7.0.5 |
smmap | 5.0.0 |
sortedcontainers | 2.4.0 |
soupsieve | 2.5 |
spacy | 3.7.5 |
spacy-legacy | 3.0.12 |
spacy-loggers | 1.0.5 |
SQLAlchemy | 2.0.35 |
sqlparse | 0.5.1 |
srsly | 2.4.8 |
stack-data | 0.6.2 |
statsmodels | 0.14.4 |
tabulate | 0.9.0 |
tblib | 3.0.0 |
tenacity | 9.0.0 |
texttable | 1.7.0 |
thinc | 8.2.5 |
threadpoolctl | 3.5.0 |
tifffile | 2024.9.20 |
toolz | 1.0.0 |
topojson | 1.9 |
tornado | 6.4.1 |
tqdm | 4.66.5 |
traitlets | 5.14.3 |
truststore | 0.9.2 |
typer | 0.13.1 |
typing_extensions | 4.12.2 |
tzdata | 2024.2 |
Unidecode | 1.3.8 |
url-normalize | 1.4.3 |
urllib3 | 1.26.20 |
wasabi | 1.1.3 |
wcwidth | 0.2.13 |
weasel | 0.4.1 |
webdriver-manager | 4.0.2 |
websocket-client | 1.8.0 |
Werkzeug | 3.0.4 |
wheel | 0.44.0 |
wordcloud | 1.9.3 |
wrapt | 1.16.0 |
xgboost | 2.1.1 |
xlrd | 2.0.1 |
xyzservices | 2024.9.0 |
yarl | 1.13.1 |
yellowbrick | 1.5 |
zict | 3.0.0 |
zipp | 3.20.2 |
zstandard | 0.23.0 |
View file history
SHA | Date | Author | Description |
---|---|---|---|
5f08b57 | 2024-08-29 10:33:57 | Lino Galiana | Traduction de l’introduction (#551) |
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) |
Notes de bas de page
Some libraries are gradually moving away from
Numpy
, which is not always the most suitable for managing certain types of data. TheArrow
framework is becoming the lower layer used by more and more data science libraries. This blog post provides a detailed explanation of this topic.↩︎
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 = {fr}
}