Optimiser un traitement sur un gros dataframe Pandas ? Quelle voie possible ?

a marqué ce sujet comme résolu.

Bonjour à tous,

Je bosse actuellement sur une expérience perso en IA et je suis sur la phase de préparation des données.

Je me trouve donc avec un dataset qui ressemble à ca une fois importé avec Pandas dans mon notebook:

image.png
image.png

Sur ce dataset je voulais avoir le département de chaque ligne. j’ai pour cela trouvé une lib Python qui semble convenir pour éviter de juste tronquer aux deux premiers caractères et ainsi foirer tous les DOM-TOM : https://pypi.org/project/pgeocode/

Je me retrouve donc avec un code de la sorte :

import pgeocode

geo = pgeocode.Nominatim('fr')

missionement['departement'] = missionement.apply(lambda row: geo.query_postal_code(row['CODE_POSTAL']).county_code, axis=1)

Ce code tourne pendant un temps très long : plus de 45 min avant que je kill à chaque fois

J’ai tenté une approche sans lamba sous la forme :

missionement['departement'] = geo.query_postal_code(missionement['CODE_POSTAL']).county_code

Cette approche tourne en 1 sec mais me renvoi une colonne completement remplie de valeur "NaN"

Hors si je tente la même approche mais sur une seule ligne (pour tester les données) cela fonctionne parfaitement :

geo.query_postal_code(missionement['CODE_POSTAL'].values[0]).county_code  

Me retourne : '01'

Comment puis-je traiter tout le tableau dans un délai "raisonnable" ? Ai-je raté quelque chose ?

Merci à tous pour votre aide :D

Il ne faut pas que tu appliques ligne par ligne mais le tout en même temps. C’est une pratique courante en science des données.

Bref, tu devrais pouvoir faire :

missionement['departement'] = geo.query_postal_code(missionement['CODE_POSTAL'].rename('postal_code'))['county_code']

Qui devrait s’exécuter en environ seconde.

Je te renvois vers la documentation de query_postal_code:

https://pgeocode.readthedocs.io/en/latest/generated/pgeocode.Nominatim.html

En toute honnêteté elle est pas bien faite. J’aurais aimé qu’il considère les séries comme des tableaux mais non. Après une erreur et une vérification dans le code source de query_postal_code j’ai compris que je pouvais juste renommer la série et c’était bon.

+1 -0

Du coup c’est assez bizarre comme code, non ?

Je ne peux pas tester là, mais est-ce que ca ne fonctionnerait pas ?:

geo.query_postal_code(missionement['CODE_POSTAL'].values)['county_code']

(Ou bien à la place de .values, .tolist())

Ca me semble plus lisible.

Oui tout à fait. .values puisque query_postal_code prend également des list en paramètre.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte