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

SAS Base Discussion :

Fusion d'une base quotidienne dans une base mensuelle


Sujet :

SAS Base

  1. #1
    Membre à l'essai
    Homme Profil pro
    Doctorant
    Inscrit en
    Novembre 2014
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Doctorant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2014
    Messages : 22
    Points : 18
    Points
    18
    Par défaut Fusion d'une base quotidienne dans une base mensuelle
    Bonjour,

    Afin que je sois bien compris, vous trouverez ci-joint un fichier excel contenant un extrait des deux bases de données à fusionner et le résultat que je souhaiterais obtenir.

    La première base de données est intitulée Data1. Data1 est une base mensuelle,qui contient deux variables qui sont le code des fonds et datem (converti en nombre) représentant l'année et le mois.

    La deuxième base de données est intitulée Data2. Data2 est une base quotidienne, qui contient la variable date au complet (année/mois/jour) (converti aussi en nombre), la variable datem et une variable RMEX désignant le rendement quotidien.

    L'idée est d'associer à chaque datem pour chaque fonds dans data1 les données quotidiennes correspondantes se trouvant dans data2. Le résultat souhaité se trouve dans la feuille Résultat souhaité.

    J'ai tenté plusieurs codes, mais sans succès. Voici le code qui me donne un résultat incomplet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    proc sort data=data1; by crsp_fundno; run; 
     data fusion; merge data1 data2; by datem; run;
    proc sort data=fusion; by crsp_fundno; run
    Merci du temps consacré !
    Bonne journée.
    Fusion.xlsx

  2. #2
    Membre à l'essai
    Homme Profil pro
    Doctorant
    Inscrit en
    Novembre 2014
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Doctorant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2014
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    Une erreur s'est glissée dans mon code. En fait, la base de données Data1 a été triée en fonction de Datem et la base Data2 offre la variable datem qui est déjà classée, et donc le code tenté est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    proc sort data=data1; by datem; run; 
     data fusion; merge data1 data2; by datem; run;
    proc sort data=fusion; by crsp_fundno; run
    Ce code me fournit un résultat partiel. Il fait une fusion juste sauf qu'il m'affiche que le premier jour de chaque mois et non pas tous les jours du mois.

    NB : Dans l'exemple, j'utilise que deux fonds alors qu'en réalité j'en ai 3000. Plusieurs d'entre eux ont une durée de 198401 à 201512.

    Je ne suis pas certain que la fusion soit la commande appropriée pour ce cas.

    Merci !

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par ALELOU Voir le message
    Il fait une fusion juste sauf qu'il m'affiche que le premier jour de chaque mois et non pas tous les jours du mois.
    En faisant MERGE data1 data2 tu insères dans data1 toute les données correspondantes à ta clé en provenance de data2. Tu ne peux pas obtenir plus de ligne que data1. En inversant les tables, tu devrais obtenir le résultat que tu veux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    data fusion; merge data2 data1; by datem; run;

  4. #4
    Membre expérimenté
    Inscrit en
    Novembre 2009
    Messages
    703
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 703
    Points : 1 311
    Points
    1 311
    Par défaut merge many to many
    Bonjour,

    • Vous avez plusieurs observations par date dans chacune des tables. C'est donc un merge "many to many" que vous pouvez résoudre avec la proc sql.

    • Voir la note de l'aide :
    Note: The MERGE statement does not produce a Cartesian product on a many-to-many match-merge. Instead, it performs a one-to-one merge while there are observations in the BY group in at least one data set. When all observations in the BY group have been read from one data set and there are still more observations in another data set, SAS performs a one-to-many merge until all observations have been read for the BY group.
    • Proposition de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    proc sql;
      create table fusion as
        select crsp_fundno, b.* from data1 as a 
                                inner join data2 as b  
                                on a.datem=b.datem
                                order by crsp_fundno, date; 
    quit; 
    NOTE: Table WORK.FUSION created, with 11881 rows and 4 columns.
    Cordialement,

  5. #5
    Membre à l'essai
    Homme Profil pro
    Doctorant
    Inscrit en
    Novembre 2014
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Doctorant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2014
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    je l'avais testé et le résultat est similaire à celui obtenu avec le code que j'ai écrit. Il me semble que le numéro de code des fonds pose problème.

    Merci !

  6. #6
    Membre à l'essai
    Homme Profil pro
    Doctorant
    Inscrit en
    Novembre 2014
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Doctorant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2014
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    Re-bonjour,

    Le code proposé par le membre mgdondon fonctionne merveilleusement bien.
    Merci beaucoup à vous deux !

    bonne fin de journée

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

Discussions similaires

  1. [Toutes versions] enregistre le mot de passe dans une cellule ou dans la base de registre
    Par patricktoulon dans le forum Macros et VBA Excel
    Réponses: 24
    Dernier message: 19/08/2016, 09h49
  2. Réponses: 4
    Dernier message: 23/05/2011, 17h28
  3. Réponses: 82
    Dernier message: 05/02/2011, 14h34
  4. Réponses: 6
    Dernier message: 13/11/2009, 16h06
  5. Réponses: 11
    Dernier message: 06/12/2005, 08h23

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