IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Optimisation temps de traitement avec pandas (boucle)


Sujet :

Python

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 147
    Points : 58
    Points
    58
    Par défaut Optimisation temps de traitement avec pandas (boucle)
    Bonjour,

    Je code sous Python depuis peu (apprentissage en autodidacte), et je cherche des moyens pour optimiser mon code car celui-ci risque de prendre en entrée de grosses volumétries.

    J'ai vu qu'il était possible d'accélérer les temps de traitement en passant par du C (mon futur objectif!), mais en attendant, comment est-il possible d'optimiser par exemple le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        for i in xrange(len(profil)) :
            if profil.loc[i, "GENDER"]==1:
                profil.loc[i, "top_fem"]=1
            elif profil.loc[i, "GENDER"] ==2:
                profil.loc[i, "top_hom"]=1
    Ici, un dataframe nommé "profil". Sur ce dataframe, si la variable GENDER ==1 alors je crée une variable top_fem contenant la valeur 1. Si elle vaut 2, alors je crée la variable top_hom=1

    J'ai tenté l'infructueux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            if profil.loc[:,"GENDER"]==1:
                profil.loc[:,"top_fem"]=1
    Que me conseillez-vous pour optimiser cela? Car j'ai énormément de boucles dans ce style dans mon code.

    Merci à vous

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Déjà le second test ne sert à rien. A moins qu'il y ait un 3° sexe, si "GENDER" n'est pas à 1 alors c'est qu'il est à 2. Donc tu peux écrire profil.loc[i, "top_fem" if profil.loc[i, "GENDER"]==1 else "top_hom"]=1.

    Maintenant tu peux éviter ce "if" en positionnant tes valeurs dans une liste. Exemple
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    values=(None, "top_fem", "top_hom")    # Le "None" pour l'élément [0]
    for i in xrange(len(profil)) :
        profil.loc[i, values[profil.loc[i, "GENDER"]]]=1

    C'est pas mal rapide mais ça a l'inconvénient de faire "deviner" que la valeur "1" est pour les femmes et la "2" est pour les hommes. Et si ça change demain pour passer à "125" ça ne fonctionne plus (sauf à mettre 124 "None" entre les deux).

    On peut alors utiliser à la place un dico fatalement un poil moins rapide que la liste (plus lourd à implémenter) mais quand-même bien efficace.
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    values={1 : "top_fem", 2 : "top_hom"}
    for i in xrange(len(profil)) :
        profil.loc[i, values[profil.loc[i, "GENDER"]]]=1

    Mais tu n'éviteras pas la boucle. Et même s'il y avait une instruction "magique" comme celle que tu as tenté, la boucle serait quand-même implémentée derrière...

    Accessoirement je n'ai jamais vu ce style de syntaxe item[x, y]. Il se pourrait que tu aies fait erreur et que ce soit item[x][y]. Dans ce cas, le code serait
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    values={1 : "top_fem", 2 : "top_hom"}
    for i in xrange(len(profil)) :
        profil.loc[i][values[profil.loc[i]["GENDER"]]]=1
    Avec plusieurs accès à l'élément [i] qu'on peut éviter en itérant sur les éléments eux-mêmes au-lieu d'itérer sur les indices:
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    values={1 : "top_fem", 2 : "top_hom"}
    for loc in profil.loc:
        loc[values[loc["GENDER"]]]=1
    ...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 147
    Points : 58
    Points
    58
    Par défaut
    Merci Sve@r

    En effet, la variable GENDER a 4 modalités (0, 1, 2, 9), mais je ne veux créer des variables que pour les modalités 1 et 2, d'où mon "elif".
    Merci pour les bouts de code, je vais tester ça et voir l'impact sur les temps de traitement.
    Il est vrai que le top aurait été de supprimer la boucle, dans le style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if profil["GENDER"]==1:
                profil["top_fem"]=1
    comme en SAS, mais bon, tant pis, je vais continuer avec mes ".loc" !

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Un truc comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    profil["top_fem"][(profil["GENDER"]==1)] = 1
    profil["top_hom"][(profil["GENDER"]==2)] = 1
    mais je ne vois pas trop l'intérêt d'avoir 2 colonnes (top_fem et top_hom) calculées sur seulement un sous-ensemble.
    note: on est dans les fonctionnalités de pandas qui demandent quelques notions de SGDB-R plutôt que Python "en général".

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 147
    Points : 58
    Points
    58
    Par défaut
    Merci Wiztricks,

    Je te le testerai demain

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 147
    Points : 58
    Points
    58
    Par défaut
    Salut Wiztricks,

    J'ai pu tester ton code hier et il fonctionne très bien, et permet de m'éviter la boucle
    Par contre, même si je comprends comment fonctionne ce bout de code au global (filtre, création et affectation de la valeur dans la colonne), la syntaxe ne m'est pas claire.

    Je m'explique :

    Je sais que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     profil[(profil["GENDER"]==1)]
    permet de faire le filtre sur GENDER =1 dans le dataframe "profil".

    Mais je ne comprends pas pourquoi le fait d'ajouter ["top_fem"] entre "profil" et "[(profil["GENDER"]==1)]" indique la création d'une nouvelle colonne
    J'ai essayé de trouver des infos sur ce type de syntaxe mais je n'ai pas trouvé.
    Aurais-tu un lien ou une explication à m'apporter sur le sujet? De sorte que je puisse expliquer à mon tour le contenu de cette syntaxe?

    Je te remercie

    Meuah

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par meuah Voir le message
    Mais je ne comprends pas pourquoi le fait d'ajouter ["top_fem"] entre "profil" et "[(profil["GENDER"]==1)]" indique la création d'une nouvelle colonne
    Effectivement, ça ne crée pas la colonne: il faut l'avoir créée avant.
    Mais la vraie question était de savoir quel est l'intérêt de créer une colonne dont la valeur est "calculée" à partir d'autres colonnes.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 147
    Points : 58
    Points
    58
    Par défaut
    En effet j'ai oublié de te répondre.
    Le but de mon programme entier de te faire la mise en forme de données brutes afin de les faire entrer dans un score en régression logistique.
    L'information GENDER concerne des individus, alors que mon score doit ensuite effectué au foyer (=groupement d'individus)
    Comme le nombre d'individus est parfois aberrant (à cause de règles de déduplication), je crée des top_fem et top_hom pour qu'en faisant un regroupement au foyer, je ne garde qu'une information binaire sur le genre des individus qui le compose.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [11g] Temps de traitement avec dblink
    Par morocoboy dans le forum Administration
    Réponses: 6
    Dernier message: 21/10/2013, 12h09
  2. Optimisation temps de traitement
    Par Alqualonde dans le forum Macro
    Réponses: 11
    Dernier message: 01/08/2012, 16h43
  3. [SQL] Optimisation temps de traitement PROC SQL
    Par amidujour dans le forum SAS Base
    Réponses: 2
    Dernier message: 13/10/2010, 20h16
  4. optimiser le temp du traitement d'une boucle
    Par riad_09 dans le forum Développement
    Réponses: 1
    Dernier message: 05/11/2009, 08h38
  5. [MySQL] Temps de traitement avec phpMyAdmin
    Par ratatam25 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 09/04/2009, 21h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo