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 :

Borner les valeurs d'un dataframe


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2020
    Messages : 2
    Par défaut Borner les valeurs d'un dataframe
    Bonjour,

    je m initie au langage Python pour mon travail et j ai un peu de mal à trouver la solution pour le problème suivant.
    J ai recueilli 1 an de données à l aide de 4 capteurs à un pas de temps de 20 secondes sur 32 sites.
    Il me faut maintenant les agréger à la minute.
    Cependant avant l’agrégation, j'aimerais "nettoyer" les données aberrantes qui ne sont pas dans la gamme de mes variables (du à des déconnexions de capteurs).
    Par exemple, mon capteur de température peut donner des valeurs de -999 quand il est déconnecté ou je peux mesurer une masse de -2000 dans la meme situation avec mon capteur de pesée.....


    J'ai donc écrit le code suivant pour traiter l ensemble du dataframe:

    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
     
     
     
    # Get and Clean data
    Hr=pd.read_csv('Hr.csv',decimal=",", sep = ';', parse_dates=['Time'], index_col=['Time'])
    Hr = Hr[Hr[:,:].between(0, 100)]
    Masse=pd.read_csv('Masse.csv',decimal=",", sep = ';', parse_dates=['Time'], index_col=['Time'])
    Masse = Masse[Masse[:,:].between(1500, 2500)]
    Temp=pd.read_csv('Temp.csv',decimal=",", sep = ';', parse_dates=['Time'], index_col=['Time'])
    Temp = Temp[Temp[:,:].between(-10, 40)]
    VPD=pd.read_csv('VPD.csv',decimal=",", sep = ';', parse_dates=['Time'], index_col=['Time'])
    VPD = VPD[VPD[:,:].between(0, 5)]
     
    # Resample to minute mean 
    Hr_min=Hr.resample("T").mean()
    Masse_min=Masse.resample("T").mean()
    Temp_min=Temp.resample("T").mean()
    VPD_min=VPD.resample("T").mean()
    La partie d’agrégation à la minute fonctionne bien mais les lignes de"nettoyage" ne fonctionnent pas (expl: Hr = Hr[Hr[:,:].between(0, 100)]...)
    Je m'y prend sans doute très mal pour tester l ensemble de mes 32 colonnes du tableau sur l année .

    Y a til une solution à ce problème?

    Merci à vous.

    M.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 739
    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 739
    Par défaut
    Salut,

    Citation Envoyé par ManuLund Voir le message
    Y a til une solution à ce problème
    La solution simple et rapide à coder est de faire une double boucle pour tester la valeur de chaque mesure et éventuellement la remplacer.

    Après y-a-t-il moyen de le faire faire à Panda via une opération magique?

    Il faudrait avoir un exemple de tableau de départ et du tableau qu'on voudrait à l'arrivée.

    note: Si on part d'un tableau à 10 colonnes de mesures et 10 mesures, en remplaçant les mesures en dehors des clous par des 0, on peut toujours faire la somme... Mais pour la moyenne, çà va être délicat.

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

  3. #3
    Nouveau candidat au Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2020
    Messages : 2
    Par défaut
    Bonjour Wiztricks et merci pour ta réponse rapide

    Alors en fait, j'imaginais plutôt supprimer les lignes qui contiennent au moins 1 valeur hors des limites pour 1 des 32 colonnes. Il doit y en avoir disons 150 sur un ensemble de 1.522.089 lignes.
    voici un petit bout de mes fichiers:

    Time masse_enceinte1 masse_enceinte2 masse_enceinte3 masse_enceinte4 masse_enceinte5 masse_enceinte6 masse_enceinte7 masse_enceinte8 masse_enceinte9 masse_enceinte10
    01/01/2019 00:00 2091,69 2075,46 2065,19 2068,22 2086,15 2067,91 2066,84 2068,04 2084,68 2080,7
    01/01/2019 00:00 2091,69 2075,5 2065,24 2068,27 2086,15 2067,86 2066,84 2068,09 2084,68 2080,7
    01/01/2019 00:00 2091,69 2075,4 2065,24 2068,32 2086,2 2067,86 2066,84 2068,09 2084,73 2080,75
    01/01/2019 00:01 2091,74 2075,45 2065,25 2068,32 2086,15 2067,81 2066,79 2068,14 2084,73 2080,75
    01/01/2019 00:01 2091,64 2075,46 2065,2 2068,37 2086,15 2067,81 2066,79 2068,09 2084,73 2080,7
    01/01/2019 00:01 2091,69 2075,31 2065,24 2068,42 2086,15 2067,86 2066,74 2068,14 2084,58 2080,75
    01/01/2019 00:02 2091,74 2075,36 2065,2 2068,47 2086,15 2067,81 2066,74 2068,14 2084,68 2080,75
    01/01/2019 00:02 2091,69 2075,41 2065,2 2068,52 2086,2 2067,81 2066,74 2068,14 2084,73 2080,74
    01/01/2019 00:02 2091,69 2075,46 2065,2 2068,57 2086,15 2067,91 2066,74 2068,19 2084,73 2080,75
    01/01/2019 00:03 2091,74 2075,5 2065,15 2068,57 2086,15 2067,86 2066,74 2068,19 2084,73 2080,85
    01/01/2019 00:03 2091,74 2075,46 2065,09 2068,57 2086,15 2067,86 2066,84 2068,19 2084,78 2080,85
    01/01/2019 00:03 2091,69 2075,5 2065,14 2068,62 2086,15 2067,86 2066,84 2068,24 2084,78 2080,85
    01/01/2019 00:04 2091,69 2075,46 2065,15 2068,67 2086,2 2067,86 2066,84 2068,29 2084,73 2080,9
    01/01/2019 00:04 2091,69 2075,51 2065,1 2068,67 2086,1 2067,86 2066,89 2068,29 2084,73 2080,8
    01/01/2019 00:04 2091,69 2075,51 2065,19 2068,72 2086,15 2067,86 2066,89 2068,29 2084,68 2080,8
    01/01/2019 00:05 2091,69 2075,46 2065,14 2068,72 2086,1 2067,76 2066,89 2068,29 2084,73 2080,85
    01/01/2019 00:05 2091,64 2075,41 2065,14 2068,72 2086,1 2067,76 2066,89 2068,24 2084,68 2080,9
    01/01/2019 00:05 2091,64 2075,41 2065,14 2068,77 2086,1 2067,76 2066,89 2068,29 2084,68 2080,95
    01/01/2019 00:06 2091,74 2075,46 2065,14 2068,77 2086,1 2067,76 2066,89 2068,29 2084,73 2080,9
    01/01/2019 00:06 2091,74 2075,45 2065,19 2068,82 2086,1 2067,81 2066,94 2068,24 2084,73 2081

    Du coup il me fait la moyenne minute (donc 3 mesures) sur toute l'année. Cependant si dans de très rares cas il ne me reste plus que 2 mesures par minute, ce n'est pas très dérangeant.

  4. #4
    Membre éclairé
    Homme Profil pro
    Data Lover
    Inscrit en
    Décembre 2014
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Data Lover
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2014
    Messages : 96
    Par défaut
    Salut,

    Au lieu de faire un "between", vous pouvez faire cette sélection comme dans l'exemple ci-dessous, si vous voulez le faire séparément. Sinon, vous pourrez partir d'un dataset ayant toutes les données comme présenté dans votre exemple (tableau) et faire une boucle avec des conditions pour chaque type de variable pour extraire les lignes qui vous intéressent.

    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
    df = pd.DataFrame(range(50))
     
    a = df[(df>10) & (df<=30)].dropna()
     
    >a
           0
    11  11.0
    12  12.0
    13  13.0
    14  14.0
    15  15.0
    16  16.0
    17  17.0
    18  18.0
    19  19.0
    20  20.0
    21  21.0
    22  22.0
    23  23.0
    24  24.0
    25  25.0
    26  26.0
    27  27.0
    28  28.0
    29  29.0
    30  30.0

Discussions similaires

  1. Dataframe: comparer les valeurs d'une même colonne
    Par Abdallah79596 dans le forum R
    Réponses: 2
    Dernier message: 03/05/2020, 23h21
  2. Merge Dataframe avec pandas, sans dupliquer les colonnes
    Par thecrazydonut dans le forum Général Python
    Réponses: 6
    Dernier message: 02/03/2020, 21h26
  3. Réponses: 2
    Dernier message: 12/04/2019, 11h33
  4. Réponses: 1
    Dernier message: 25/01/2019, 11h14
  5. [WD19] Borner les graduations d'un graphe
    Par jdsetls dans le forum WinDev
    Réponses: 0
    Dernier message: 13/05/2014, 12h08

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