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 :

Forcer dtype à l'importation d'un CSV avec pandas [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Homme Profil pro
    Éternel universitaire
    Inscrit en
    Avril 2012
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Éternel universitaire

    Informations forums :
    Inscription : Avril 2012
    Messages : 421
    Par défaut Forcer dtype à l'importation d'un CSV avec pandas
    Bonjour,

    J'ai des fichiers CSV qui sont volumineux et qui par conséquent requièrent plusieurs secondes à être chargés. Je voudrais optimiser leur importation sous pandas. La solution classique est de spécifier leur type lors de l'importation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import pandas as pd
    dtypes = {
    'Var1': object,
    'Var2': np.int64,
    'Var3': np.float64,
    'Var4': np.float64,
    'Var5': np.float64
    }
    df = pd.read_csv('../Data/my_file.csv', dtype=dtypes)
    Mon problème est que j'ai des valeurs manquantes qui sont indiquée par des "NAN" (donc des lettres entouré de guillemets). Si je tente de forcer le type de variable comme int ou float alors que la colonne contient ces "NAN", j'obtiens le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TypeError: Cannot cast array data from dtype('O') to dtype('float64') according to the rule 'safe'
    Comment faire en sorte pour que les "NAN" soient interprétés comme des np.nan lors de l'importation et n'interfèrent pas avec ma définition des dtypes ?

    Merci !

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

    Citation Envoyé par thecrazydonut Voir le message
    Comment faire en sorte pour que les "NAN" soient interprétés comme des np.nan lors de l'importation et n'interfèrent pas avec ma définition des dtypes ?
    Vous devriez pouvoir faire la conversion "à la main" via l'option converters de read_csv.

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

  3. #3
    Membre chevronné
    Homme Profil pro
    Éternel universitaire
    Inscrit en
    Avril 2012
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Éternel universitaire

    Informations forums :
    Inscription : Avril 2012
    Messages : 421
    Par défaut
    Merci ! Les converters font bien ce qu'on leur demande... mais je suis très surpris de voir que ça ralentit beaucoup l’exécution.
    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
    36
    37
    38
    import pandas as pd
    import time
     
    def ctf64(var):
        return float(var)
     
    def cti64(var):
        return int(var)
     
    start_time_import = time.time()
    df = pd.read_csv('../Data/20200830_0000_eddy.csv', skiprows=[0,2,3], low_memory=True)
    print("Import took {:0.3}s without converter\n".format(time.time() - start_time_import))
     
    converters = {
    'RECORD':                 cti64,
    'Ux':                     ctf64,
    'Uy':                     ctf64,
    'Uz':                     ctf64,
    'T_SONIC':                ctf64,
    'diag_sonic':             cti64,
    'CO2_density':            ctf64,
    'CO2_density_fast_tmpr':  ctf64,
    'H2O_density':            ctf64,
    'diag_irga':              cti64,
    'accel_x':                ctf64,
    'accel_y':                ctf64,
    'accel_z':                ctf64,
    'ang_rate_x':             ctf64,
    'ang_rate_y':             ctf64,
    'ang_rate_z':             ctf64,
    'roll':                   ctf64,
    'pitch':                  ctf64,
    'yaw':                    ctf64
    }
     
    start_time_import = time.time()
    df = pd.read_csv('../Data/20200830_0000_eddy.csv', skiprows=[0,2,3], converters=converters)
    print("Import took {:0.3}s with converter\n".format(time.time() - start_time_import))
    J'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Import took 8.86s without converter
    Import took 17.8s with converter
    Alors que mon but initial était d'améliorer la vitesse de chargement...

    Le plus "amusant" dans tout ça, c'est que si je convertis les colonnes après importation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    start_time_import = time.time()
    for c in df.columns:
        if c != 'TIMESTAMP':
            df[c].astype(float)
    print("Conversion took {:0.3}s after import\n".format(time.time() - start_time_import))
    le temps de conversion est vraiment petit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Conversion took 0.702s after import
    Qu'est-ce qu'il se passe ?

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 776
    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 776
    Par défaut
    Citation Envoyé par thecrazydonut Voir le message
    Qu'est-ce qu'il se passe ?
    Si on appelle une fonction Python pour chaque item plutôt que de buriner en C, çà va mettre plus de temps.

    Vous avez une autre option à essayer côté read_csv: na_values (ce qui par ailleurs donne des indications sur les NAN reconnus par défaut).

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

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

Discussions similaires

  1. Import d'un CSV avec entête en 3eme ligne
    Par sucrepop dans le forum VBA Access
    Réponses: 2
    Dernier message: 29/04/2016, 17h29
  2. Réponses: 1
    Dernier message: 04/01/2013, 11h43
  3. [EasyPHP] importer un fichier CSV avec phpMyAdmin
    Par K.aoutar dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 0
    Dernier message: 16/08/2010, 19h10
  4. Importer un fichier .csv avec php et PDO
    Par Touny dans le forum Langage
    Réponses: 6
    Dernier message: 05/03/2009, 17h45
  5. Importer 1 Fichier CSV avec des ";" dans les champs
    Par opaillon dans le forum Import/Export
    Réponses: 3
    Dernier message: 15/01/2009, 14h23

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