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 :

Problème de code


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2024
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2024
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Problème de code
    Bonjour,
    Je suis nouveau sur le forum et j'aurais besoin d'aide.
    J'ai écrit un code pour itérer sur les colonnes d'intérêt dans un DataFrame et assigner des catégories ('OK', 'Limit', 'NOK') à une colonne nommée en fonction des bornes minimales et maximales spécifiées pour chaque colonne.
    Cependant bien qu'il me compte le bon nombre de données totales il ne m'assigne pas le bon nombre de points dans chaque catégorie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    # List of columns to process with their respective bounds
    columns_of_interest = [
     (('A', 'Y1'), df_A['SPECVMIN'].iloc[0], df_A['SPECVMAX'].iloc[0]),
     (('B', 'Y1'), df_B['SPECVMIN'].iloc[0], df_B['SPECVMAX'].iloc[0]), 
     (('C', 'Y1'), df_C['SPECVMIN'].iloc[0], df_C['SPECVMAX'].iloc[0]),        
     (('D', 'Y2'), df_D['SPECVMIN'].iloc[0], df_D['SPECVMAX'].iloc[0]),
     (('E', 'Y2'), df_E['SPECVMIN'].iloc[0], df_E['SPECVMAX'].iloc[0]), 
     (('F', 'Y2'), df_F['SPECVMIN'].iloc[0], df_F['SPECVMAX'].iloc[0]), 
    ]
     
    # Initialize empty DataFrames to store results
    results_prc_list = []
     
    # Iterate over columns
    for (col_name, measure_name), min_bound, max_bound in columns_of_interest:
        df1_column = df1[(col_name, measure_name)].copy().to_frame()
     
        # Create conditions for each category
        if measure_name == 'g':
            condition_nok = (df1_column < min_bound - 0.0049) | (df1_column > max_bound + 0.0049)
            condition_ok = (df1_column > min_bound) & (df1_column < max_bound)
            condition_limit = ((df1_column >= min_bound-0.0049) & (df1_column < min_bound)) | ((df1_column >= max_bound) & (df1_column <= max_bound + 0.0049))
        else:
            condition_nok = (df1_column < min_bound - 0.49) | (df1_column > max_bound + 0.49)
            condition_ok = (df1_column > min_bound) & (df1_column < max_bound)
            condition_limit = ((df1_column >= min_bound-0.49) & (df1_column < min_bound)) | ((df1_column >= max_bound) & (df1_column <= max_bound + 0.49))
     
        # Assign categories based on conditions using NumPy indexing
        categories = ['NOK', 'OK', 'Limit']
        conditions = [condition_nok, condition_ok, condition_limit]
        df1[f'Type_de_point_{measure_name}'] = np.select(conditions, categories, default='NOK')
    pouvez-vous m'aider?
    Merci

  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 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Difficile car il nous manque la base "df" pour tester. Dans ce genre de cas, le print() reste la meilleure arme.
    Toutefois je remarque ce df1[f'Type_de_point_{measure_name}'] = np.select(conditions, categories, default='NOK') mis dans la boucle mais non récupéré d'une façon ou d'une autre => perdu à l'itération suivante (si j'ai bien suivi le code dans le fait que "measure_name" vaudra souvent le même Y1 ou Y2).

    Accessoirement cette douloureuse écriture de test (df1_column < min_bound - 0.49) | (df1_column > max_bound + 0.49) fonctionne mais part du principe que les booléens False et True valent 0 et 1 (oui c'est vrai mais ça peut changer) et bon, ce "jonglage" de bit montre une maîtrise des mathématiques binaires mais nuit à la lisibilité. Moi je l'aurais plutôt écrite not (min_bound - 0.49 <= df1_column <= max_bound + 0.49)...
    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
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2024
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2024
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci pour la réponse. Je l'utilise après en comptant les différents points dans chaque catégorie:
    counts_df = df1[f'Type_de_point_{measure_name}'].value_counts().
    Mes intervalles sont assez compliqués et je ne vois pas comment appliquer ce que tu viens de me dire à la catégorie nok et limite par exemple

    Désolé je viens juste de commencer à coder et je n'ai pas l'exemple le plus simple

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par JSAGDG Voir le message
    Je l'utilise après en comptant les différents points dans chaque catégorie:
    counts_df = df1[f'Type_de_point_{measure_name}'].value_counts()
    Si counts_df est lui-aussi dans la boucle et que lui aussi n'est pas récupéré...

    Citation Envoyé par JSAGDG Voir le message
    Mes intervalles sont assez compliqués et je ne vois pas comment appliquer ce que tu viens de me dire à la catégorie nok et limite par exemple
    Ca semble être un cas en 3 étapes: dans les bornes, hors des bornes mais dans les limites ou carrément hors de tout
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    nok = not (min_bound - 10 <= value <= max_bound + 10)
    ok = min_bound < value < max_bound
    limit = (min_bound - 10 <= value <= min_bound) or (max_bound <= value <= max_bound + 10)
    J'ai pris "10" pour tester mais ça me semble correspondre. Par ailleurs si "ok" est True, "nok" sera False et inversement => l'une des deux écritures peut disparaître.

    Bref tout ça peut se résumer en
    • ok
    • sinon limit
    • sinon pas ok

    Donc moi je prendrais une variable que je mettrais à 0, 1 ou 2 selon le cas...

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if min_bound < value < max_bound: result=2				# ok
    elif  not (min_bound - 10 <= value <= max_bound + 10): result=0		# pas ok
    else: result=1								# limite
    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]

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2024
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2024
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    J'ai essayé ce que tu m'as dit mais sans succès
    Est-ce que je peux t'envoyer mon code en privé pour que tu m'aide?

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par JSAGDG Voir le message
    J'ai essayé ce que tu m'as dit mais sans succès
    On n'essaye pas des codes, on les comprend. Un code ce n'est pas une formule magique. Par ailleurs il faut ensuite associer 0, 1 et 2 aux branches qui traitaient ton ok/limit/not_ok d'origine (refaire les bons liens quoi)

    Citation Envoyé par JSAGDG Voir le message
    Est-ce que je peux t'envoyer mon code en privé pour que tu m'aide?
    Mais le en public, je ne suis pas le seul sur le forum (surtout que moi je n'utilise pas pandas). Déjà c'est dans les règles du forum (on demande un exemple minimaliste permettant de reproduire les erreurs rencontrées). Positionne lui en amont des valeurs de test pour qu'il puisse être exécuté par tout le monde (suffit de remplacer df_A['SPECVMIN'].iloc[0] et autres par leurs valeurs que toi tu as) et tu auras rapidement ta solution.
    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]

Discussions similaires

  1. De la rapidité du code
    Par jfloviou dans le forum Contribuez
    Réponses: 233
    Dernier message: 29/05/2009, 02h17
  2. code pour interbase 6.0 et 6.5 de generateur
    Par tripper.dim dans le forum InterBase
    Réponses: 4
    Dernier message: 01/07/2002, 11h29
  3. [MFC](encapsulation ADO) ou placer le code
    Par philippe V dans le forum MFC
    Réponses: 2
    Dernier message: 13/06/2002, 14h58
  4. Explorateur de code C
    Par Zero dans le forum C
    Réponses: 14
    Dernier message: 06/06/2002, 09h41
  5. OmniORB : code sous Windows et Linux
    Par debug dans le forum CORBA
    Réponses: 2
    Dernier message: 30/04/2002, 17h45

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