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 :

Calcul de rating et valeurs manquantes : correction conditionnelle des valeurs [DATA]


Sujet :

SAS Base

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Calcul de rating et valeurs manquantes : correction conditionnelle des valeurs
    Bonjour à tous,

    j'ai une question vraiment basique de programmation SAS mais je la pose quand même.

    Je dispose d'une table SAS avec les données suivantes :

    ISIN ;LIBELLE ;EMETTEUR ;RATING
    FR0001 ;BNP PARIBAS 5% 02/2020 ;BNP PARIBAS ;AA
    FR1526 ;BNP PARIBAS TV 08/2015 ;BNP PARIBAS ;#NA#
    FR2589 ;BNP PARIBAS 3,5% 03/2012 ;BNP PARIBAS ;AA
    FR1452 ;ALCATEL 3,5% 06/2015 ;ALCATEL ;A
    FR8459 ;ALCATEL 5,5% 05/2017 ;ALCATEL ;#NA#

    J'ai un problème avec les données sources et pour certains titres, le rating est mis à #NA# alors qu'il devrait être renseigné.

    Mon objectif est de disposer de la base des emetteurs avec les bons ratings donc classer cette base par les emetteurs.

    Un PROC SORT by EMETTEUR ascending devrait faire l'affaire pour classer cela même si les doublons sur les ratings seront peut-être un problème déjà au niveau de la PROC SORT...

    Là où j'ai un problème c'est pour corriger les #NA# qui apparaisse. Il faut que j'écrive à SAS que :

    * si EMETTEUR(i+1)= EMETTEUR (i)
    * et que RATING de l'émetteur (i+1) = #NA#,
    ALORS il faut mettre dans RATING de l'émetteur (i+1) le AA qui est RATING de l'émetteur (i) .

    Il est même possible que le #NA# apparaisse en première ligne et donc qu'il faille inverser...Exemple...

    ISIN ;LIBELLE ;EMETTEUR ;RATING
    FR0001 ;BNP PARIBAS 5% 02/2020 ;BNP PARIBAS ;#NA#
    FR1526 ;BNP PARIBAS TV 08/2015 ;BNP PARIBAS ;AA
    FR2589 ;BNP PARIBAS 3,5% 03/2012 ;BNP PARIBAS ;AA
    FR1452 ;ALCATEL 3,5% 06/2015 ;ALCATEL ;#NA#
    FR8459 ;ALCATEL 5,5% 05/2017 ;ALCATEL ;A


    Je débute en programmation SAS et l'écriture de ce bout de code qui est a priori simple (en tous cas en VBA même avec des cells(i,j)) ne me semble pas aisé.

    Merci d'avance de vos réponses.

    JoE.

  2. #2
    Rédacteur

    Homme Profil pro
    SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Inscrit en
    Avril 2009
    Messages
    2 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 2 497
    Points : 6 064
    Points
    6 064
    Par défaut
    EN SAS, tu pars du haut vers le bas donc modifie ton raisonnement

    * si EMETTEUR(i)= EMETTEUR (i-1)
    * et que RATING de l'émetteur (i) = #NA#,
    ALORS il faut mettre dans RATING de l'émetteur (i) le AA qui est RATING de l'émetteur (i-1) .



    Je te la fais étape par étape pour que ce soit explicite. Commente le DROP et le RENAME pour voir les intermédiaires mais l'usage des LAG est toujours compliqué à comprendre.

    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
    data test;
    infile datalines dlm="|" ;
    input ISIN $ LIBELLE :$30. EMETTEUR :$12. RATING $;
    datalines;
    FR0001 |BNP PARIBAS 5% 02/2020 |BNP PARIBAS |AA
    FR1526 |BNP PARIBAS TV 08/2015 |BNP PARIBAS |#NA#
    FR2589 |BNP PARIBAS 3,5% 03/2012 |BNP PARIBAS |AA
    FR1452 |ALCATEL 3,5% 06/2015 |ALCATEL |A
    FR8459 |ALCATEL 5,5% 05/2017 |ALCATEL |#NA#
    ;run;
     
    proc sort ;
    by emetteur;
    run;
     
    data test;
    length rating rl $8 ;
    set test;
    rl=lag(rating);
    if left(rating) ne '#NA#' then vrai = rating;
    else if left(rating) = '#NA#' then vrai = rl;
    drop rating rl;
    rename vrai=rating;
    run;

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Bonjour Datametric, merci de ta réponse.
    Ca marche sur cet exemple là mais cela ne marche plus s'il y a deux #NA# qui se suivent...

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    DATA test;
    INFILE datalines dlm="|" ;
    input ISIN $ LIBELLE :$30. EMETTEUR :$12. RATING $;
    datalines;
    FR0001 |BNP PARIBAS 5% 02/2020 |BNP PARIBAS |AA
    FR1526 |BNP PARIBAS TV 08/2015 |BNP PARIBAS |#NA#
    FR2589 |BNP PARIBAS 3,5% 03/2012 |BNP PARIBAS |AA
    FR1452 |ALCATEL 3,5% 06/2015 |ALCATEL |A
    FR8459 |ALCATEL 5,5% 05/2017 |ALCATEL |#NA#
    FR8559 |ALCATEL 4,75% 04/2015 |ALCATEL |#NA#
    ;run;
    etc...
    Si je refais ta procédure, j'ai les résultats suivants:

    Obs ISIN LIBELLE EMETTEUR rating
    1 FR1452 ALCATEL 3,5% 06/2015 ALCATEL A
    2 FR8459 ALCATEL 5,5% 05/2017 ALCATEL A
    3 FR8559 ALCATEL 4,75% 04/2015 ALCATEL #NA#
    4 FR0001 BNP PARIBAS 5% 02/2020 BNP PARIBAS AA
    5 FR1526 BNP PARIBAS TV 08/2015 BNP PARIBAS AA
    6 FR2589 BNP PARIBAS 3,5% 03/2012 BNP PARIBAS AA

    Ainsi, la fonction LAG marche si la dernière valeur est le bon rating. Sinon, il y a un problème...

    Compliqué mon truc mais je suis sûr qu'il y a une manipulation simple a faire.
    Il me semble que je dois rajouter une instruction conditionnelle avec l'emetteur mais je ne sais pas trop m'y prendre.
    Enfin, j'espère y arriver...

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 747
    Points : 978
    Points
    978
    Par défaut
    Combien de RATING pour un EMETTEUR ?

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci de ta réponse.

    Il ne doit y avoir qu'un seul rating par émetteur !!

    Mais c'est des raisons de "bug" dans l'acquisition de données sous BLOOMBERG (logiciel de marché qui nous fournit ces infos) sur certains titres qui font le #NA# apparaît.

    Le #NA# veut simplement dire qu'il ne trouve pas l'information du rating pour le titre en question mais on a bien la donnée de l'émetteur et cet émetteur a un seul rating...

    Merci de vos réponses. Ce forum est vraiment génial pour les débutants en SAS comme moi...

  6. #6
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Points : 372
    Points
    372
    Par défaut
    Salut, voici une solution à ton probleme en partant de la table test fournie par datametric:

    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
    DATA test;
    INFILE datalines dlm="|" ;
    input ISIN $ LIBELLE :$30. EMETTEUR :$12. RATING $;
    datalines;
    FR0001 |BNP PARIBAS 5% 02/2020 |BNP PARIBAS |#NA#
    FR0001 |BNP PARIBAS 5% 02/2020 |BNP PARIBAS |AA
    FR1526 |BNP PARIBAS TV 08/2015 |BNP PARIBAS |#NA#
    FR2589 |BNP PARIBAS 3,5% 03/2012 |BNP PARIBAS |AA
    FR1452 |ALCATEL 3,5% 06/2015 |ALCATEL |A
    FR8459 |ALCATEL 5,5% 05/2017 |ALCATEL |#NA#
    FR8559 |ALCATEL 4,75% 04/2015 |ALCATEL |#NA#
    ;run;
     
     
     
    proc sort ;
    BY emetteur;
    run;
     
    DATA test2;
    length bon_rating $8 ;
    retain bon_rating;
    set test (in=firstpass) test;
    by emetteur; /* tres important: permet de concaténer test avec elle-meme groupe (d'emetteur)
    				apres groupe */
    if (firstpass) then do; /* premier passage sur tous les ISIN de même valeur */
    	if RATING ne "#NA#" then bon_rating=RATING; /* on retient le bon rating */
    end;
    else do; /* second passage  */
    	if RATING eq "#NA#" then RATING=bon_rating; /* remplacement du rating NA */
    	output; /* ecriture de la ligne */
    end;
    drop bon_rating;
    run;
    Ce code est inspiré de l'excellent SUGI interleaving

    Ce code est particulierement adapté à ton cas car il permet de ne pas tenir compte de la position du bon rating parmi les mauvais.

  7. #7
    Membre actif
    Inscrit en
    Juillet 2010
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 199
    Points : 214
    Points
    214
    Par défaut
    bonjour,

    je propose une autre solution qui consiste à récupérer les bons ratings dans une table puis de fusionner les tables initiale et des bons ratings :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    proc sql ;
    create table base_rating as
    select distinct emetteur, rating
    from test
    where rating ne "#NA#" ;
     
     
    create table fin as
    select t.isin,t.LIBELLE,t.EMETTEUR,b.rating 
    from test t left join base_rating b
    on t.emetteur = b.emetteur ;
    quit ;

  8. #8
    Rédacteur

    Homme Profil pro
    SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Inscrit en
    Avril 2009
    Messages
    2 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 2 497
    Points : 6 064
    Points
    6 064
    Par défaut
    Et si tu créais un rl2 comme étant LAG2(rating) pour créer un test supplémentaire ?

    Sinon prends la proposition de mohamed_ c'est simple et efficace.

    Tu connais le SQL ?

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

Discussions similaires

  1. [AC-2003] Recherche des valeurs manquantes
    Par merocean dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 30/06/2009, 23h23
  2. Interpolation linéraire des valeurs manquantes
    Par j_ere_my dans le forum MATLAB
    Réponses: 17
    Dernier message: 27/11/2008, 17h15
  3. Changement des valeurs manquantes NA par 0
    Par fafabzh6 dans le forum R
    Réponses: 3
    Dernier message: 01/04/2008, 17h24
  4. Copie conditionnelle des valeurs d'une ligne
    Par frisette68 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 13/02/2008, 02h07
  5. renseigner des valeurs manquantes
    Par mouche dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 25/05/2007, 12h00

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