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 :

Encadrement d'une date par borne superieure et inférieure


Sujet :

SAS Base

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Testeur application logicielle
    Inscrit en
    Octobre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Testeur application logicielle

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4
    Points : 5
    Points
    5
    Par défaut Encadrement d'une date par borne superieure et inférieure
    Bonjour,
    voici le problème : J'ai une table contenant 3 champs au départ : maturite_oop (date) , maturite_fut (date) et prix fut (numérique) dont les valeurs ne sont pas continues et un champ rassemblant toutes ces dates maturity de manière unique et numlo: numero de ligne de maturite_oop ;
    Voici le jeu de données:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    data interpolation ;
    input  maturity_date maturite_oop numlo maturite_fut        prix_fut ;
    cards;
    20160601	 20160601		        1       . 			 	.	
    20160701  	20160701		        2       20160701			100	
    20160801 	20160801		        3          .				.	 
    20160901 	20160901		        4          .				.	 
    20161001 	20161001		        5      20161001			98	
    20161015 	.			        .      20161015			95	
    20161101 	20161101		        6      . 			 	.	
    20161201 	20161201		        7      . 			 	.	
    ;
     
    run;
    Je cherche à déterminer et sauvegarder pour chaque maturite_oop, les valeurs immédiatement inférieure et supérieure de maturite_fut (dt_inf et dt_sup) , et le prix_fut correspondant (prix_inf, prix_sup) .

    Le résultat attendu est en PJ avec données initiales en jaune (si problème de mise en page) et ci dessous
    Resultat attendu.xls
    maturity_date maturite_oop maturite_fut prix_fut dt_inf prix_inf dt_sup prix_sup
    20160601 20160601 . . . . 20160701 100
    20160701 20160701 20160701 100 . . 20161001 98
    20160801 20160801 . . 20160701 100 20161001 98
    20160901 20160901 . . 20160701 100 20161001 98
    20161001 20161001 20161001 98 20160701 100 20161015 95
    20161015 . 20161015 95 . . . .
    20161101 20161101 . . 20161015 95 . .
    20161201 20161201 . . 20161015 95 . .

    J'ai essayé avec une boucle sur la maturite_oop et la fonction lag avec tri dans les 2 sens pour borner ma valeur de maturite_oop mais les trous de valeur sont fatals au résultat attendu.Je n'arrive pas à maintenir la valeur "précédente" tant qu'il y a un manque. Je ne sais pas si je suis claire...


    Ci joint un bout du programme qui bien sûr ne permet pas d'obtenir le résultat attendu, pour les divers cas qui m'occupe (données initiales).
    Auriez vous une idée pour encadrer ces dates de maturite_oop de manière sûre car là je suis paumée après tous les essais déjà effectués et je ne suis pas une pro de SAS?
    D'avance merci de votre aide.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur en SAS/ Statisticien
    Inscrit en
    Janvier 2013
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur en SAS/ Statisticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 483
    Points : 1 552
    Points
    1 552
    Par défaut
    Bonjour,
    Quel est le nombre total d'observations, aux vraies données, contenues dans la base ?
    Ward

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Testeur application logicielle
    Inscrit en
    Octobre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Testeur application logicielle

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Je ne suis pas sûre de comprendre la question. En fait, je travaille sur peu de données, environ 100.

    J'ai modifié une partie de mon programme pour déterminer la borne inférieure , hors macro cette fois (désolée, je ne sais pas comment faire pour recopier le programme avec la mise en forme (couleurs ...) sans faire une PJ) .

    Le nœud du problème, c'est de pouvoir sauver les dernières valeurs précédentes non manquantes, genre dans une variable globale (dt_prec_neo, prix_prec_neo) et de les "recopier" dans dt_prec et pric_prec quand ils sont manquants (eq .) Bref il y a un problème d’écriture. (en PJ resultat attendu 2: c'est une partie du resultat attendu global ne traitant que la borne inf)

    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
     
    %Let dt_prec_neo =.;
    %Let prix_prec_neo =.;
    %let nbli=8; /*nombre de ligne de la table*/
     
     
    data interpolation;
    set interpolation;
     
          num_ligne1 = _N_  ;
          if  num_ligne1 =1 		 then do; dt_inf=.; prix_inf=.; end;  
          if  num_ligne1=&nbli 	         then do; dt_sup=.; prix_sup=.; end;   
     
        run;
     
    data interpolation ;
          set interpolation ; 
    	  %put &dt_prec_neo;
              %put &prix_prec_neo;
    	  do i=2 to &nbaex;
    	  	if num_ligne1=i  then do; 
    	   						dt_prec=lag(num_maturite_future);
    	 						prix_prec=lag(prix_fut);
     
    							if dt_prec ne . then do; call symput('dt_prec_neo',dt_prec) ; call symput('prix_prec_neo',prix_prec); end;
     * sauvegarde dernières valeurs  non vides de futures; 
    							else ; if &dt_prec_neo ne . then do; dt_prec=&dt_prec_neo; prix_prec=&prix_prec_neo; end;          
      * recopie des valeurs de futures non vides de var globales;
     
    							prix_inf=prix_prec;  
    							dt_inf=dt_prec;
    						end;
          end;	
     
      run;
    Fichiers attachés Fichiers attachés

  4. #4
    Futur Membre du Club
    Femme Profil pro
    Testeur application logicielle
    Inscrit en
    Octobre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Testeur application logicielle

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    J'ai une solution avec des lag (il y en a certainement des plus judicieuses avec des array, index ...mais cela fonctionne) dont je livre la substantielle moelle pour ceux qui seraient intéressés par la recherche d'une borne inférieure notamment pour faire une calcul d'interpolation ensuite ; pour la borne supérieure, il suffit de trier la table "interpolation" ici dans le sens inverse et d'appliquer le même algorithme.
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    %let nbaex=8;
     
    /* initialisation*/
     
    data interpolation ;
    set interpolation ;
     
          num_ligne1 = _N_  ;
          if  num_ligne1 =1             then do; dt_inf=.; prix_inf=.; end;  
          if  num_ligne1=&nbaex  		then do; dt_sup=.; prix_sup=.; end;   
     
     
                  dt_prec	=lag(maturite_future);
                  prix_prec	=lag(prix_fut);       
     
        run;
     
     
    %Macro borne_inf;
     
    data interpolation ;
    Set interpolation ;
     
    dt_prec1	=lag(dt_prec); 
    prix_prec1	=lag(prix_prec);
     
    if dt_prec = . then do;  
                                 dt_prec 	=dt_prec1; 
                                 prix_prec	=prix_prec1;  
                            end;   
    run;
     
    %Do i=2 %to &nbaex;
     
    data interpolation&i ;
    Set interpolation%eval(&i-1) ;
     
    dt_prec&i	=lag(dt_prec); 
    prix_prec&i	=lag(prix_prec);
     
                 if dt_prec = . then do;  
                                 dt_prec 	=dt_prec&i; 
                                 prix_prec	=prix_prec&i;  
     
                            end;   
    run;
     
    data interpolation;
    set interpolation&i;
    run;
     
    proc datasets library = work  ;
    delete interpolation%eval(&i-1) ;
    run;
     
    proc datasets library = work  ;
    delete interpolation%eval(&nbaex-1) ;
    run;
     
    %end;
       data interpolation;
        set interpolation;
    if maturite_oop = . then do;
     
    if maturite_oop ne . then do;
    	                     prix_inf	=prix_prec;  
                             dt_inf		=dt_prec;  
    end;
    else do;     
    	prix_inf=.;  
    	dt_inf=.;
    end; 
     
    keep maturity_date maturite_oop maturite_future prix_fut dt_prec prix_prec dt_inf prix_inf ; 
     
    run;
    %MEND borne_inf;
    %borne_inf;

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

Discussions similaires

  1. incrémenter une date par une période de temps
    Par bilouk dans le forum VBA Access
    Réponses: 22
    Dernier message: 16/06/2023, 10h43
  2. Réponses: 2
    Dernier message: 21/03/2007, 16h06
  3. charger une date par défaut avec sql Loader
    Par top-dogg dans le forum SQL*Loader
    Réponses: 15
    Dernier message: 18/12/2006, 10h59
  4. Réponses: 7
    Dernier message: 22/11/2006, 09h14
  5. Mettre une date par defaut dans une textBox.
    Par yaumme dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 01/12/2005, 22h39

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