Discussion: Avis pour DataPrep

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2014
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : mars 2014
    Messages : 54
    Points : 54
    Points
    54

    Par défaut Avis pour DataPrep

    Bonjour à tous,

    Dernièrement j'ai énormément utilisé du langage SQL et revenant dans l'analyse petit à petit, il m'est (pour moi) 100 fois plus rapide de faire des requetes via SQL pour la Dataprep: analyser les modalités des données (problème de saisie,..), MAJ de certaines valeurs de champ en fonction d'autres etc..

    Puis-je continuer ainsi ou il vaut mieux que j'essaye de tout faire via R (les boucles que je fais pour avoir le même résultat sont souvent très longues).
    Le package sqldf correspondrait-il à mon besoin ? est-il aussi rapide en terme de performance que d'autres requêtes executables sous R ?

    Merci d'avance

    Ineedi²

  2. #2
    Membre confirmé
    Inscrit en
    novembre 2009
    Messages
    305
    Détails du profil
    Informations forums :
    Inscription : novembre 2009
    Messages : 305
    Points : 597
    Points
    597

    Par défaut Avis pour DataPrep

    Bonjour,

    Pouvez-vous donner un exemple exécutable de vos boucles pour voir si elles sont vraiment nécessaires ?

    Cordialement,

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2014
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : mars 2014
    Messages : 54
    Points : 54
    Points
    54

    Par défaut

    Bonjour mgdondon,

    Voici un exemple de boucle, je cherche à remplacer les valeurs NULL de la table PremierTest, colonne Item_Weight en fonction d'une autre df ListeProduitPoid en matchant sur l'Item Identifier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for (i in 1:nrow(PremierTest)){
      for (j in 1:nrow(ListeProduitPoids)){
        if (is.na(PremierTest$Item_Weight[i])==TRUE && PremierTest$Item_Identifier[i]==ListeProduitPoids$Item_Identifier[j])
        {PremierTest$Item_Weight[i]=ListeProduitPoids$Item_Weight[j]}      
    }}
    Peut-etre que cette boucle est maladroite et qu'il existe un moyen plus rapide, je serais alors preneur.
    Typiquement sur SQL ça donnerait du genre:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    update PremierTest 
    Set Item_Weight=B.Item_Weight 
    FROM PremierTest A
    INNER JOIN ListeProduitPoids B
    ON A.Item_Identifier=B.Item_Identifier

    Merci

  4. #4
    Membre confirmé
    Inscrit en
    novembre 2009
    Messages
    305
    Détails du profil
    Informations forums :
    Inscription : novembre 2009
    Messages : 305
    Points : 597
    Points
    597

    Par défaut Avis pour DataPrep

    Bonjour Ineed2,

    • Vous pouvez mettre à jour les données de la table PremierTest avec celles de la table ListeProduitPoids, équivalent du update de SAS (source).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    > PremierTest <- data.frame(item_identifier=c(1,2,3),
    +                           item_weight=c(1,NA,NA))
    > 
    > ListeProduitPoids <- data.frame(item_identifier=c(1,2,3),
    +                           item_weight=c(2,2,2))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    > liste_item <- PremierTest$item_identifier[is.na(PremierTest$item_weight)]
    > liste_item
    [1] 2 3
    > maj_weight <- ListeProduitPoids[liste_item,]
    > maj_weight
      item_identifier item_weight
    2               2           2
    3               3           2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    > library(data.table)
    > Cols <- "item_weight"
    > iCols <- paste0("i.", Cols)
    > PremierTest <- setDT(PremierTest)[maj_weight, (Cols) := mget(iCols), on="item_identifier"][]
    > PremierTest 
       item_identifier item_weight
    1:               1           1
    2:               2           2
    3:               3           2
    • Si vous utilisez les boucles, les opérations se font en parallèle sur les observations d'une table donc il suffit de faire une boucle sur la deuxième table. Il est préférable de faire la boucle sur la table ayant le moins d'observations, voir ici.

    • Pour la performance, vous pouvez comparer les deux méthodes avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    T1<-Sys.time()
    # programme
    T2<-Sys.time()
    difftime(T2, T1)
    Cordialement,

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2014
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : mars 2014
    Messages : 54
    Points : 54
    Points
    54

    Par défaut

    Merci, je vais de suite jeter un coup d'oeil.


    Ineedi²

  6. #6
    Membre actif
    Homme Profil pro
    Ingénieur en études décisionnelles
    Inscrit en
    février 2013
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur en études décisionnelles

    Informations forums :
    Inscription : février 2013
    Messages : 115
    Points : 267
    Points
    267

    Par défaut

    Pour ma part, j'ai aussi une préférence pour la préparation des données en SQL. Je regroupe toutes mes actions dans un flux ETL.

    Je construis ma table, et je l'importe dans un data.frame sur R, comme suit :

    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
    library("RJDBC")
     
    drv <- JDBC("oracle.jdbc.driver.OracleDriver",
                classPath="D:/Drivers/ojdbc6.jar", 
                " ")
     
    con <- dbConnect(drv, "jdbc:oracle:thin:@server:port:database", "user", "mdp")
     
    ##### GET DATA ON R ##### 
     
    dta <- dbGetQuery(con,"
                  SELECT    
                        NO_CLIENT
                      , LIB_CLIENT
                      , NO_ARTICLE
                      , DESC_ARTICLE
                      , DATE_COMMANDE
                      , TOP_LST_APPEL
                      , QTE_COMMANDE
                      , PREV_QTE_COMMANDE
                      , JRS_SINCE_PREV_COMMANDE
                      , SAM_DIM_OU_JF
                      , TOP_COMMANDE
                   FROM DATA_TEST.LST_COMMANDES
                      "
    )
     
    ####### Disconnetion ####### 
     
    dbDisconnect(con)
    rm(drv)
    rm(con)
    Et derrière je fais mes as.factor, mes as.date, mes subset pour la cross-validation, etc...

    Je suis sur Oracle, mais j'utilise le package RJDBC, donc ça marche avec n'importe quelle base tant qu'il y a le driver correspondant.

    Je n'ai pas la prétention que c'est la meilleure façon de faire, mais c'est clair que je maîtrise beaucoup mieux les fonctions analytiques en SQL, surtout pour la construction de features.
    Je prendrais davantage de temps à le faire en R.

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2014
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : mars 2014
    Messages : 54
    Points : 54
    Points
    54

    Par défaut

    Merci pour vos contributions, je vous souhaite une bonne semaine

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

Discussions similaires

  1. [UML] Besoin d'un avis pour un diagramme de collaboration
    Par skystef dans le forum Autres Diagrammes
    Réponses: 2
    Dernier message: 26/04/2006, 15h51
  2. Besoin d'un avis pour max_connections
    Par simoryl dans le forum Requêtes
    Réponses: 9
    Dernier message: 03/04/2006, 12h26
  3. [Servlet/JSP] - Methodologie et avis pour un panier
    Par ShinJava dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 08/09/2005, 09h35

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