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

Calcul scientifique Python Discussion :

probleme de suppression de valeurs extremes


Sujet :

Calcul scientifique Python

  1. #1
    Membre du Club
    Femme Profil pro
    Ergonome
    Inscrit en
    Février 2016
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ergonome

    Informations forums :
    Inscription : Février 2016
    Messages : 53
    Points : 43
    Points
    43
    Par défaut probleme de suppression de valeurs extremes
    Bonjour

    je suis en période de stage et je voudrais nettoyer une base de donnée ,
    en effet j'ai une base de donnée d'une dizaine de variables et d'un millier de données je veux pour les variables les plus significatifs enlever les observations qui me biaise ma distribution le problème c'est que mon étude devra être faite en divisant les données selon une variable qui est l'angle

    donc prendre pour chaque angles les données de chaque variables et dessiner la distribution calculer le 99 eme centile et le 1 er et enlever les points hors cette zone

    voici le fichier sur quoi je travaille test.xlsx

    et le code que j'ai réalisé :

    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
    32
    33
    34
    35
     
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    #####        importation des bibliothéques          #####
    import pickle
    import numpy as np 
    import matplotlib.pyplot as plt
    from scipy import stats
    from utils.struct import filter_data
    import seaborn as sns 
    sns.set(context="paper",font="monospace")
    import pdb
    from sklearn.feature_selection import SelectKBest, chi2, f_regression
     
    #####       importation de données   #####
     
    data=load(open("test.xlsx","rb"))
     
    mesures_names_tri =  ['var1', 'var2','var3','var4' ]
     
    ####### rejet de valeur extrémes
    print len(data['var1'])
    angles=np.unique(data['var4'])
    #for mesure_name in mesures_names_tri:
    mesure1=np.empty(1,float)
    for ang in angles:  
               i_angle= [data['var4'] ==  ang]                 
               mesure=data['var1'][i_angle]                     
               k= stats.scoreatpercentile(mesure,99)
               l= stats.scoreatpercentile(mesure,1)          
               for i in range(len(data['var1'][i_angle])):
                   mesure= np.delete(mesure,np.where(mesure < l) ,0)   
                   mesure= np.delete(mesure,np.where(mesure > k) ,0)    
               mesure1=np.append(mesure1,mesure)
    print (len(mesure1))

  2. #2
    Membre du Club
    Femme Profil pro
    Ergonome
    Inscrit en
    Février 2016
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ergonome

    Informations forums :
    Inscription : Février 2016
    Messages : 53
    Points : 43
    Points
    43
    Par défaut
    le soucis c'est que dans ce que je fais je met les bonnes valeurs dans mesure 1 mais après j'ai besoin d'utiliser les variables et ça marche pas ça c'est le premier point

    deuxièmement c'est que quand je veux faire la mm chose sur la deuxième variable je sais pas comment faire pour que je travaille sur la dernière base de donnée nettoyé

  3. #3
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Ne connaissant pas la forme des données que tu traites, il est difficile de comprendre ton code.

    Mais je m'interroge ...

    Comment explique-tu ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    angles=np.unique(data['var4'])
    ...
    for ang in angles:  
               i_angle= [data['var4'] ==  ang]                 
               mesure=data['var1'][i_angle]
    Si je lis bien i_angle est une liste qui contient un booléen, toutefois angles est déjà un objet numpy construit avec data['var4'] et ang est un de ses items, donc tu compares data['var4'] avec un de ses éléments.

    Et à la ligne suivante mesure=data['var1'][i_angle] devrait donc être mesure=data['var1'][[True]] (ou False) si l'on suit bien.

    Franchement incompréhensible dans l'état.

  4. #4
    Membre du Club
    Femme Profil pro
    Ergonome
    Inscrit en
    Février 2016
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ergonome

    Informations forums :
    Inscription : Février 2016
    Messages : 53
    Points : 43
    Points
    43
    Par défaut
    Bonjour

    Oui exactement c'est en fait comme si je prend un sous ensemble de ma base qui correspond à un angle précis et je veux travailler dessus

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Charge Etudes Statistiques
    Inscrit en
    Avril 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Charge Etudes Statistiques

    Informations forums :
    Inscription : Avril 2016
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    Si j'ai bien compris ton besoin, voici une solution avec la librairie Pandas :

    Exemple en utilisant ton fichier Excel comme source :
    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
    # Import des librairies 
    import pandas as pd
    import numpy as np
    from scipy import stats
    # Chargement du fichier dans une table 
    df=pd.read_excel("C:/datasteo/Downloads/Data/test.xlsx") 
     
    # Creation d'une fonction qui va rajouter des colonnes min & max pour chaque variable
    def valeur_extreme(data):
         for choixVar in range(1,4): # On boucle sur chaque variable de V1 à V3 
             data['max'+str(choixVar)]=stats.scoreatpercentile(data['V'+str(choixVar)],99)
             data['min'+str(choixVar)]=stats.scoreatpercentile(data['V'+str(choixVar)],1) 
         return data
    # Je groupe par Angle puis j'applique pour chaque groupement la fonction valeur_extreme
    df=df.groupby('V4').apply(valeur_extreme)
    Ta table ressemblera alors à ça :
    V1 V2 V3 V4 max1 min1 max2 min2 max3 min3
    0 -2.201310 5.67613 162.639 18.00 -1.852419 -2.201338 6.219074 5.67613 162.73898 162.64002
    1 -0.623170 6.25373 162.746 16.50 0.722070 -0.631159 6.253730 6.25373 162.84504 162.74696
    2 -0.719244 5.67613 162.701 17.25 -0.385232 -1.407608 6.253730 5.67613 162.78415 162.70185
    3 -1.866360 5.67613 162.656 18.00 -1.852419 -2.201338 6.219074 5.67613 162.73898 162.64002

    Il te reste alors à enlever les mauvaises valeurs pour chaque variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for choixVar in range(1,4):
        df=df[(df['V'+str(choixVar)]<df['max'+str(choixVar)]) & (df['V'+str(choixVar)]>df['min'+str(choixVar)])]

  6. #6
    Membre du Club
    Femme Profil pro
    Ergonome
    Inscrit en
    Février 2016
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ergonome

    Informations forums :
    Inscription : Février 2016
    Messages : 53
    Points : 43
    Points
    43
    Par défaut
    Bonjour

    merci pour votre réponse mais ce que j'ai compris dans votre exemple c'est que il me calcule le min max pour toute la variable alors que moi je veux qu'il filtre chaque variable par angle et ensuite calculer le min max et enlever les valeurs et refaire pour la même variable mais avec le deuxième angle le mm travail en utilisant la dernière mise à jour du la base de donnée jusqu’à terminer les angles et ensuite passer à une autre variable et ainsi de suite

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Charge Etudes Statistiques
    Inscrit en
    Avril 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Charge Etudes Statistiques

    Informations forums :
    Inscription : Avril 2016
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Le code ci-dessus calcule bien le min & le max par Angle pour toutes les variables V1 à V3 (La différence c'est que le filtre arrive en toute fin).
    la fonction apply sur un groupby permet de travailler par sous ensemble en fonction de la variable passée en paramètre du groupby (Ici V4 qui correspond à la variable Angle).

    Tu peux également utiliser le code ci-dessous (Ce code va filtrer les valeurs comprises entre le quantile 1% et le quantile 99% par Angle pour les variables V1, V2 et V3):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    result=df.groupby('V4')['V1','V2','V3'].apply(lambda x: x[(x> x.quantile(0.01)) & (x < x.quantile(0.99))]).dropna()
    df.ix[result.index]
    Si tu souhaites vérifier les valeurs qui sont utilisées comme seuil pour chaque Angle, tu peux utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    df.groupby('V4').quantile([0.01,0.99]).unstack()
    Ci-dessous le code + le résultat sur le fichier de test.
    Nom : pandas_percent.png
Affichages : 612
Taille : 28,0 Ko

  8. #8
    Membre du Club
    Femme Profil pro
    Ergonome
    Inscrit en
    Février 2016
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ergonome

    Informations forums :
    Inscription : Février 2016
    Messages : 53
    Points : 43
    Points
    43
    Par défaut
    Merci je vous remercie énormément pour votre aide

  9. #9
    Membre du Club
    Femme Profil pro
    Ergonome
    Inscrit en
    Février 2016
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ergonome

    Informations forums :
    Inscription : Février 2016
    Messages : 53
    Points : 43
    Points
    43
    Par défaut
    Je reviens vers vous , étant que mon fichier est de format pkl comment je peux le lire avec pandas ? j'ai utilisé cette fonction pandas.read_pickle mais elle me rend pas un objet dataframe

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

Discussions similaires

  1. [C#] Probleme de lecture de valeur nulle
    Par kenzo080 dans le forum ASP.NET
    Réponses: 7
    Dernier message: 25/10/2010, 16h58
  2. [VBA] Problem de suppression de composant
    Par jesus144 dans le forum IHM
    Réponses: 9
    Dernier message: 26/04/2006, 10h03
  3. Réponses: 3
    Dernier message: 24/05/2005, 08h19
  4. Probleme recuperation d'une valeur : script vbs -> .bat
    Par pinpin_du_net dans le forum Windows
    Réponses: 3
    Dernier message: 10/05/2005, 12h43
  5. suppression where valeur null
    Par jecht dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 07/06/2004, 16h19

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