Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > Macro
Macro Forum d'entraide sur le langage Macro de SAS
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 29/08/2008, 14h59   #1
Invité de passage
 
Inscription : août 2008
Messages : 10
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 10
Points : 1
Points : 1
Par défaut [Macro] Ajout valeur manquantes date (trimestre)

Bonjour,

J'ai un léger souci.
J'ai une table de résultats SAS sous cette forme-là :

A B C
22007 456 451.123
32007 468 466.456
42007 480 474.563
12008 486 484.756
22008 486 486.359
. . 482.865
. . 474.123
. . 496.263

J'aimerais ajouter à la colonne A, les valeurs manquantes automatiquement grace à une boucle (ou autre), en sachant que la colonne A représente les trimestres.
En espérant que vous pourrez m'aider, je vous remercie par avance.
uekoner est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2008, 15h01   #2
Responsable SAS
 
Inscription : septembre 2006
Messages : 1 688
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 1 688
Points : 5 952
Points : 5 952
Bonjour,
Je n'ai pas bien cerné ton problème! Tu veux ajouter des valeurs manquantes à ta colonne A???
__________________
Les balises code
FAQ SAS
Rubrique SAS

Si vous souhaitez contribuer à la rubrique SAS, contactez-moi ou tout autre membre de l'équipe BI par MP.
fafabzh6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2008, 15h03   #3
Invité de passage
 
Inscription : août 2008
Messages : 10
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 10
Points : 1
Points : 1
Désolé, je me suis mal exprimé.

En fait je veux simplement ajouter dans la colonne A, les trimestres correspondant manquant.
uekoner est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2008, 15h05   #4
Invité de passage
 
Inscription : août 2008
Messages : 10
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 10
Points : 1
Points : 1
Je vous redonne la forme de la table :

22007 456 89 451.61497628
32007 468 90 466.72620758
42007 480 91 474.67348936
12008 486 92 484.11794168
22008 486 93 486.38391315
. . . 482.11226535
. . . 474.49172019
. . . 463.58011042
. . . 449.85770595
uekoner est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2008, 15h08   #5
Responsable SAS
 
Inscription : septembre 2006
Messages : 1 688
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 1 688
Points : 5 952
Points : 5 952
Juste une question : tes données sont donc forcément triées, c'est-à-dire que :
32008 482.11226535
42008 474.49172019
Si oui avec un lag et des macro-variables tu peux surement bidouiller quelque chose. En lui demandant d'ajouter +1 si le premier chiffre est inférieur à 4, 0 si égale à 4 et dans ce cas dernier chiffre +1.
__________________
Les balises code
FAQ SAS
Rubrique SAS

Si vous souhaitez contribuer à la rubrique SAS, contactez-moi ou tout autre membre de l'équipe BI par MP.
fafabzh6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2008, 15h13   #6
Invité de passage
 
Inscription : août 2008
Messages : 10
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 10
Points : 1
Points : 1
Les données sont bien triées par trimestre.
Par contre je ne vois pas trop comment faire avec la méthode que tu proposes. La programmation pure n'est pas trop mon domaine, aurais-tu un exemple concret que je puisse mettre en application à mes données ?
uekoner est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2008, 15h18   #7
Responsable SAS
 
Inscription : septembre 2006
Messages : 1 688
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 1 688
Points : 5 952
Points : 5 952
Tu peux consulter la FAQ SAS du site et/ou rechercher dans les anciens topics du forum pour t'aider.
Les mots clés : étape DATA, LAG(), SUBSTR(), MACRO VARIABLE.
__________________
Les balises code
FAQ SAS
Rubrique SAS

Si vous souhaitez contribuer à la rubrique SAS, contactez-moi ou tout autre membre de l'équipe BI par MP.
fafabzh6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2008, 19h10   #8
Candidat au titre de Membre du Club
 
Inscription : mars 2008
Messages : 13
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 13
Points : 13
Points : 13
Bonjour,

Je pense qu'il faut passer par un compteur. Je propose une approche en quatre étapes :
  1. Sauvegarder le numéro de trimestre et l'année dans deux variables différentes
  2. Remplacer les valeurs manquantes pour le trimestre
  3. Remplacer les valeurs manquantes pour l'année
  4. Remettre les informations dans une seule variable.

Dans un premier temps, je te propose des détails sur l'approche. Dans un second temps, tu trouveras le code.

Véronique

_____________________________
Véronique Bourcier
veronique.bourcier@sasreference.fr
www.sasreference.fr
Blog pour se former au logiciel SAS

1. Variables trimestre et année

J'ai assumé que la variable A était numérique puisque les valeurs manquantes sont symbolisées par des points. Si ce n'est pas le cas, il faudra faire appel aux fonctions caractères de SAS pour extraire le trimestre et l'année.

Pour créer la variable TRIMESTRE, je divise le nombre par 10 000 pour n'avoir que le chiffre correspondant au trimestre dans la partie entière et je garde la partie entière avec la fonction FLOOR.

Pour créer la variable ANNEE, j'enlève le numéro du trimestre multiplié par 10 000.

Je n'opère l'opération que pour les valeurs non manquantes de A en utilisant la fonction MISSING.

2. Un compteur pour le semestre.

Si la valeur A est manquante j'ajoute 1 à la dernière valeur lue par SAS.

Si la valeur actualisée est égale à 5 alors, le numéro du trimestre est réinitialisé.

3. Un compteur pour l'année

A chaque fois que A est manquant et que le trimestre est 1, j'ajoute 1 à l'année. Sinon, j'utilise la dernière valeur allouée à la variable ANNEE.

4. Recréer la variable A

La variable A est actualisée : trimestre * 10 000 + annee.
Les variables TRIMESTRE et ANNEE sont supprimées n'étant plus nécessaires.



a. Créer le data set pour l'exemple

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
DATA orig;
   input A B C;
   datalines;
22007 456 451.123
32007 468 466.456
42007 480 474.563
12008 486 484.756
22008 486 486.359
. . 482.865
. . 474.123
. . 496.263
;
run;
b. Les 4 étapes

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DATA final (DROP=trimestre annee);
   SET orig;
   *Etape 1;
   IF NOT missing(a) then 
      do;
         trimestre=floor(a/10000);
         annee=a-trimestre*10000;
      end;
   *Etape 2;
   IF missing(a) then trimestre+1;
   IF trimestre=5 then trimestre=1;
   *Etape 3;
   IF missing(a) AND trimestre=1 then annee+1;
   *Etape 4;
   a=trimestre*10000+annee;
run;
c. Visualiser le résultat

Code :
1
2
proc print DATA=final;
run;
v_bourcier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2008, 08h24   #9
Rédacteur
 
Avatar de Bruno2r
 
Bruno ROMAN-RUIZ
Inscription : décembre 2006
Messages : 2 151
Détails du profil
Informations personnelles :
Nom : Bruno ROMAN-RUIZ
Âge : 57

Informations forums :
Inscription : décembre 2006
Messages : 2 151
Points : 2 564
Points : 2 564
Limpide ! Comme d'habitude. Merci v_bourcier.

Juste une question à uekoner :

Citation:
Envoyé par uekoner Voir le message
Je vous redonne la forme de la table :

22007 456 89 451.61497628
32007 468 90 466.72620758
42007 480 91 474.67348936
12008 486 92 484.11794168
22008 486 93 486.38391315
. . . 482.11226535
. . . 474.49172019
. . . 463.58011042
. . . 449.85770595
On est donc passé à 4 colonnes :
A = TrimestreAn
B = ?
C = N° d'ordre
D = Valeur

C'est quoi cette colonne B ?
__________________
Précisez la VERSION ! Règles du forum Business Objects et FAQ BO
"A vouloir repousser ses limites ... On risque d'en prendre connaissance !!!"
Bruno2r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2008, 10h42   #10
Invité de passage
 
Inscription : août 2008
Messages : 10
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 10
Points : 1
Points : 1
Merci pour toutes vos réponses !!

La colonne B correspond à la valeur réelle du loyer.
La colonne D correspond à la valeur estimée du loyer (que j'obtiens avec la Proc Forecast d'où le problème des trimestres manquants.)
Ce que je veux faire ensuite, c'est de tracer ces deux séries sur un même graphique avec la Proc Gplot.
Par contre, j'ai essayé de transformer la variable des trimestres en une variable SAS DATE de ce format : YYQ6. afin de tracer plus facilement les graphiques et ne pas avoir un problème de légende.
Donc peut-être qu'en utilisant ce format de date, il serait plus facile d'ajouter les trimestres qui manquent ?
uekoner est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2008, 11h39   #11
Membre confirmé
 
Inscription : avril 2008
Messages : 231
Détails du profil
Informations personnelles :
Âge : 36

Informations forums :
Inscription : avril 2008
Messages : 231
Points : 216
Points : 216
Moi, je fais un peu différemment de v_bourcier. Au lieu de vérifier si une clé obtenue dans la boucle présente dans ma table (si oui - passer à la suivante, si non - l'insérer), j'insère toutes les clés avec des zéros. Et à la fin je fais la somme en regroupant par cette même clé. Si la clé était présente, on y ajoute un zéro, sinon - il n'y a que le zéro inséré par la boucle.
green_fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2008, 15h06   #12
Invité de passage
 
Inscription : août 2008
Messages : 10
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 10
Points : 1
Points : 1
En fait, je me suis rendu compte qu'en procédant avec la méthode de Valérie, je n'arrive pas à obtenir les bons graphiques (avec la Proc GPLOT) car sous cette forme, les trimestres ne sont pas considérés par SAS comme triés.

Il faut je pense trouver un bon format pour les trimestres de manière à ce qu'on puisses automatiser l'ajout des trimestres manquant et de manière à obtenir les bons graphiques pour que SAS puisse lire correctement les données en abscisse.
uekoner est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2008, 16h24   #13
Membre Expert
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 244
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 244
Points : 2 240
Points : 2 240
Côté GPLOT, je militerais pour l'utilisation d'un format sur une date. L'utilisation d'un picture défini dans la proc Format doit permettre de faire à peu près exactement ce qu'on veut, à condition de partir d'une date SAS en nombre de jours depuis 1960.
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2008, 17h59   #14
Invité de passage
 
Inscription : août 2008
Messages : 10
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 10
Points : 1
Points : 1
Sinon autre question,

Comment faire pour transformer la série d'observations _N_ en trimestres du type Q1-2008 Q2-2008 en sachant que j'ai une centaine de tables et que pour chaque table, les trimestres ne commencent pas toujours à la même date.
Ceux-ci afin de dessiner des graphiques convenablement.
Merci d'avance..
uekoner est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2008, 18h03   #15
Membre Expert
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 244
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 244
Points : 2 240
Points : 2 240
Avec la fonction INTNX("QUARTER", dateDebut, _N_-1) tu devrais avoir des résultats corrects. Si tu as la date de début à la première obs de chaque table, tu la mets dans une nouvelle variable protégée par un Retain :
Code :
1
2
3
4
5
6
7
 
DATA ... ;
  SET ... ;
  RETAIN dateDebut ;
  IF _N_=1 THEN dateDebut = date ;
  trimestre = INTNX("QUARTER", dateDebut, _N_-1) ;
RUN ;
Est-ce que ça correspond à ton besoin ?
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/09/2008, 11h41   #16
Invité de passage
 
Inscription : août 2008
Messages : 10
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 10
Points : 1
Points : 1
Je n'ai pas réussi à convertir la date avec ta méthode.
Date debut doit correspondre à quoi exactement ?
Les trimestres doivent-ils être en numériques ou en format Date SAS ?
uekoner est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/09/2008, 14h10   #17
Membre Expert
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 244
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 244
Points : 2 240
Points : 2 240
Citation:
Envoyé par uekoner Voir le message
Comment faire pour transformer la série d'observations _N_ en trimestres du type Q1-2008 Q2-2008 en sachant que j'ai une centaine de tables et que pour chaque table, les trimestres ne commencent pas toujours à la même date.
De ton explication, j'imaginais que tu avais pas mal de tables, et que dans chacune, tu avais une observation par trimestre. Comme tu dis que toutes les tables ne commencent pas à la même date, j'imagine qu'il y a un moyen de savoir quel est le trimestre auquel se situe la 1ere obs ? C'est ce que je voyais dans la variable DateDebut, bricolé d'une manière ou d'une autre.
Le code que je t'ai proposé construit une date SAS à partir d'une date de départ (qui correspond au trimestre de la 1e observation de la table) pour indiquer le trimestre correspondant à chaque observation.
Comme toujours, le plus simple pour qu'on soit sûrs de se comprendre, ce serait de poster un exemple de données en entrée et de ce que tu veux en sortie.

Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2008, 14h36   #18
Invité de passage
 
Inscription : août 2008
Messages : 10
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 10
Points : 1
Points : 1
Bonjour,

Serait-il possible de procéder à peu près de la même façon mais en ayant ce format de trimestre (format alphanumérique)? :

2007.2
2007.3
2007.4
2008.1
2008.2
.
.

Merci d'avance

Citation:
Envoyé par v_bourcier Voir le message
Bonjour,

Je pense qu'il faut passer par un compteur. Je propose une approche en quatre étapes :
  1. Sauvegarder le numéro de trimestre et l'année dans deux variables différentes
  2. Remplacer les valeurs manquantes pour le trimestre
  3. Remplacer les valeurs manquantes pour l'année
  4. Remettre les informations dans une seule variable.

Dans un premier temps, je te propose des détails sur l'approche. Dans un second temps, tu trouveras le code.

Véronique

_____________________________
Véronique Bourcier
veronique.bourcier@sasreference.fr
www.sasreference.fr
Blog pour se former au logiciel SAS

1. Variables trimestre et année

J'ai assumé que la variable A était numérique puisque les valeurs manquantes sont symbolisées par des points. Si ce n'est pas le cas, il faudra faire appel aux fonctions caractères de SAS pour extraire le trimestre et l'année.

Pour créer la variable TRIMESTRE, je divise le nombre par 10 000 pour n'avoir que le chiffre correspondant au trimestre dans la partie entière et je garde la partie entière avec la fonction FLOOR.

Pour créer la variable ANNEE, j'enlève le numéro du trimestre multiplié par 10 000.

Je n'opère l'opération que pour les valeurs non manquantes de A en utilisant la fonction MISSING.

2. Un compteur pour le semestre.

Si la valeur A est manquante j'ajoute 1 à la dernière valeur lue par SAS.

Si la valeur actualisée est égale à 5 alors, le numéro du trimestre est réinitialisé.

3. Un compteur pour l'année

A chaque fois que A est manquant et que le trimestre est 1, j'ajoute 1 à l'année. Sinon, j'utilise la dernière valeur allouée à la variable ANNEE.

4. Recréer la variable A

La variable A est actualisée : trimestre * 10 000 + annee.
Les variables TRIMESTRE et ANNEE sont supprimées n'étant plus nécessaires.



a. Créer le data set pour l'exemple

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
DATA orig;
   input A B C;
   datalines;
22007 456 451.123
32007 468 466.456
42007 480 474.563
12008 486 484.756
22008 486 486.359
. . 482.865
. . 474.123
. . 496.263
;
run;
b. Les 4 étapes

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DATA final (DROP=trimestre annee);
   SET orig;
   *Etape 1;
   IF NOT missing(a) then 
      do;
         trimestre=floor(a/10000);
         annee=a-trimestre*10000;
      end;
   *Etape 2;
   IF missing(a) then trimestre+1;
   IF trimestre=5 then trimestre=1;
   *Etape 3;
   IF missing(a) AND trimestre=1 then annee+1;
   *Etape 4;
   a=trimestre*10000+annee;
run;
c. Visualiser le résultat

Code :
1
2
proc print DATA=final;
run;
uekoner est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 20h11.


 
 
 
 
Partenaires

Hébergement Web