Archive pour la catégorie ‘Formation Programmeur SAS’

Comment tester si une variable alphanumérique ne contient que du numérique.

Besoin fonctionnel simple mais néanmoins possible, on souhaite par exemple dans une entreprise du secteur assurance automobile éliminer toutes les lignes d’une table des assurés dont le numéro de police, variable alphanumérique, contient au moins une lettre. Cas par exemple des assurances de type x plus.

Le programme SAS ci-dessous vous fournit une des possibilités offerte par la programmation SAS dans Lire la suite de cette entrée »

SAS – Détection des doublons.

Le but ici est de vous fournir un programme simple pour vous permettre de rechercher les doublons que vous pourriez avoir dans une de vos table SAS.  

Nous utilisons pour cela la proc SQL de SAS.  

On commence par afficher les informations de la table avec deux petites particularités :  

On regroupe les observations sur un critère que vous devez déterminer, ici on à choisi : « Nom, prenom, ville, region, pays » c’est l’objet de la partie GROUP BY.  

Ensuite on demande à SAS de nous retourner toutes les lignes aggrégées de la table dont le nombre de tuples « Nom, prenom, ville, region, pays » est supérieur à 1. C’est la clause HAVING. Lire la suite de cette entrée »

Limiter les étapes DATA

Dans la série optimisation et tuyaux, voici le premier d’une série de conseil pour l’optimisation de vos programme SAS.

Pour des raisons de simplification et de méconnaissance du produit SAS, nous avons tous débuté en créant une multitude d’étape data inutiles. Ces étapes sont coûteuses aussi bien en terme de CPU qu’en terme d’I/O (accès disques entrée/sorties ou Input/Output).

Quand une table est d’une grande volumétrie, essayez de ne la lire qu’une seule fois et de créer toutes les tables dépendantes en un seul passage, vous gagnerez toutes les lectures successives de cette table SAS.

/* ****************************************** */
/* Site : http://www.formations-sas.fr - 2009 */
/*                                            */
/* Tuyaux - Performances, Optimisation SAS    */
/* GAIN : CPU - IO                            */
/*                                            */
/* Auteur : Pascal MAUBERT                    */
/* ****************************************** */

/* ACCEPTABLE */
data tablea;
 set db.master;
 if flag1;
run;

data tableb;
 set db.master;
 if flag1 and age < 21;
run;

data tablec;
 set db.master;
 if flag1 and age >= 21;
run;

/* PLUS EFFICACE */
data tablea tableb tablec;
 set db.master;
 if flag1 then do;
    output tablea;
    if age < 21 then output tableb;
    else             output tablec;
 end;

run;

/* ****************************************** */
/* Site : http://www.formations-sas.fr - 2009 */
/* Auteur : Pascal MAUBERT                    */
/* ****************************************** */

Exemple de programme SAS SPDE (SPDS)

Avant Propos.

Le but de cet article n’est pas de se substituer à une formation appliquée de SAS SPDE, mais de présenter ce fabuleux produit, même si les techniciens SAS avancés seront surement capable de s’en contenter pour comprendre, assimiler et utiliser SAS SPDE.

Cet article ne prétends pas non plus à se substituer à la documentation officielle de SAS Institute sur SAS SPDE, un lien vers celle-ci (documentation en anglais) se trouve en bas de la page.

Description générale de SAS SPDE

SAS SPDE est un moteur de gestion de données SAS, SAS SPDS est un serveur à part entière de gestion des données et au fonctionnant proche de SAS SPDE. SAS SPDE est intégré au module SAS Base comme moteur de gestion des données .

Aujourd’hui intégré au produit / module SAS Base, son nom à été changé en SAS SPDE.

Ce moteur de données SAS offre des performances exceptionnelles et trouve sa raison d’être dans le besoin de performances accrues lors de requêtes sur des tables de très gros volumes. C’est à dire des tables allant de 512 méga à plusieurs terra octets.

En synthèse, si on souhaite pouvoir lancer une requête contenant plusieurs critères sur une table de plusieurs terra octets et obtenir une réponse en quelques secondes, alors la solution SAS SPDE  est une solution appropriée.

SAS SPDE est donc l’un des procédé d’optimisation, il en existe bien d’autre,  pour l’accès à des données décisionnelles, données d’entreprise, de fortes volumétrie et nécessitant des performances accrues en terme de temps de réponse à des requêtes.

Description technique de SAS SPDE

Pourquoi SAS SPDE est encore plus rapide que SAS Base, qui déjà offre des performance hors du commun ?

Lire la suite de cette entrée »

Changer une variable Caractère en Numérique SAS.

Ce problème est un problème très simple, il est souvent rencontré lors des développements en SAS. Les informations nécessaires sont généralement fournies lors des formations SAS AVC1 (avancé I) et bien souvent oubliées par les stagiaires.

Donc voici un rappel de la méthode « propre », du changement d’une variable de type caractère en variable de type numérique.

Utilisation pour la démonstration, d’une table SAS « COMPANY » fournie en standard dans le libname « SASHELP » : sashelp.company.

Nous allons changer ici la variable « DEPTHEAD » de type caractère et de longueur 15 en une variable de type numérique et d’une longueur de 3, sans changement du nom de la variable.

Par défaut une variable numérique en SAS fait 8 de longueur et cela n’est pas toujours nécessaire, aussi si vous avez beaucoup de variable numérique et un nombre d’observation important, il est de bon ton, pour des raisons d’optimisation, de dimensionner correctement les variables numériques.

L’instruction length permet d’effectuer cela.

Théoriquement impossible, nous allons voir que la solution est assez facile à mettre en œuvre.

/* ****************************************** */
/* Site : http://www.formations-sas.fr - 2009 */
/* SAS V9                                     */
/*                                            */
/* Comment convertir une variable caractère   */
/* en numérique.                              */
/*                                            */
/* Procéder en trois étapes :                 */
/* 1 Utilisez l'option dataset RENAME         */
/* 2 Utilisez la fonction de changement de    */
/*   type                                     */
/* 3 Supprimez la variable intermédiaire      */
/*                                            */
/* Auteur : Pascal MAUBERT                    */
/* ****************************************** */

data test_change_type(drop=new_var);
 set sashelp.company(rename=(DEPTHEAD=new_var));
 length DEPTHEAD 3.;
 DEPTHEAD=input(new_var,$15.);
run;

/* ****************************************** */
/* Site : http://www.formations-sas.fr - 2009 */
/* Auteur : Pascal MAUBERT                    */
/* ****************************************** */

Changer une variable Numérique en Caractère en SAS.

Ce problème est un problème très simple, il est souvent rencontré lors des développements en SAS. Les informations nécessaires sont généralement fournies lors des formations SAS AVC1 et bien souvent oublié par les stagiaires.

Donc voici un rappel de la méthode « propre », du changement d’une variable de type numérique en variable de type caractère.

Utilisation pour la démonstration, d’une table SAS « COMPANY » fournie en standard dans le libname « SASHELP » : sashelp.company.

Nous allons changer ici la variable « N » de type numérique et de longueur 8 en une variable de type caractère et d’une longueur de 12, sans changement du nom de la variable.

Théoriquement impossible, nous allons voir que la solution est assez facile à mettre en œuvre.


/* ****************************************** */
/* Site : http://www.formations-sas.fr - 2009 */
/* SAS V9                                     */
/*                                            */
/* Comment convertir une variable numérique   */
/* en caractère ?                             */
/*                                            */
/* Procéder en trois étapes :                 */
/* 1 Utilisez l'option dataset RENAME         */
/* 2 Utilisez la fonction de changement de    */
/*   type                                     */
/* 3 Supprimez la variable intermédiaire      */
/*                                            */
/* Auteur : Pascal MAUBERT                    */
/* ****************************************** */

data test_change_type(drop=new_var);
 set sashelp.company(rename=(n=new_var));
 n=put(new_var,12.);
run;

/* ****************************************** */
/* Site : http://www.formations-sas.fr - 2009 */
/* Auteur : Pascal MAUBERT                    */
/* ****************************************** */

SAS Optimisation Transaction Ajout et Mise à jour

Avant propos

Cet article à pour de présenter une démarche d’optimisation pour un traitement de type Transaction pour l’ajout ou la mise à jour de données SAS.

Ce genre de problématique étant récurrent, il m’a semblé utile de vous fournir l’exemple détaillé ci-dessous.

Cet exemple se base sur des faits réels rencontrés lors d’une mission d’optimisation pour le compte du client « La Redoute », lors de mon passage au service Consulting de chez SAS Institute. Le chiffres fournis sont approximatifs et n’engage en rien la responsabilité de qui que ce soit.

Problème :

Redoute : 25 000 000 de lignes de commandes par jour et un temps de traitement sous SAS MVS avoisinant les 22 heures.

Bien sur, panique et demande d’intervention pour un audit d’optimisation.

Étude cynématique : par téléphone, par courrier et par internet réception des lignes de commande stockées dans DB2. La nuit Unload DB2 vers un fichier plat pour incorporation dans SAS. Lecture des lignes de commandes, tentative de mise à jour de la base SAS avec les lignes de commandes et en cas de rejet ajout de celles-ci dans la base SAS. Temps de traitement abominable.

Synthèse des Solutions

Deux cas se présentent :

  1. On connait sous DB2 la nature de la transaction « ligne de commande » ajout ou modification
  2. On ne la connait pas

Dans ces deux cas une solution performante existe.

La première la plus simple, ne sera pas détaillé dans cet article, simplement on transmet issu de DB2 dans l’unload une variable de type flag avec A pour ajout et M pour mise à jour. Sous SAS on éclate le fichier en deux tables SAS une pour les ajouts qui seront traités par la PROC APPEND et l’autre pour les mises à jour qui seront traités avec une étape DATA / MERGE.

Pour le deuxième cas un peu plus pointu, voici ci-dessous un exemple de programme Lire la suite de cette entrée »

Longueur utilisée d’une variable SAS : Numérique, Alphanumérique.

Dans la problématique d’optimisation des applications SAS, des traitements et de la charge machine, nous sommes parfois amené à effectuer des recherches afin d’optimiser les programmes SAS et les bases de données SAS.

Un des points important est la volumétrie que représentent ces données. En effet, lorsque des bases de données stockent de grande quantité de données, des dizaines voire des centaines de millions de lignes, il devient très rentable et judicieux de se pencher sur l’optimisation des traitements, programmes SAS, mais également sur les bases de données SAS.

Or si SAS nous fournit une gestion simplifiée de la création et de la gestion de ses tables, il n’en demeure pas moins, qu’un peu de travail d’optimisation reste à la charge du concepteur de l’architecture des données. Cela devient encore plus vrai dans le monde du décisionnel, monde dans lequel les données, stockées sous forme de data Warehouse ou de datamarts, atteignent des volumes très important et ou le temps d’analyse est conséquent.

Hormis les problématiques de bien fondé de telle ou telle variable dans une table, de la normalisation des tables qui n’est pas Lire la suite de cette entrée »

Parmi les nouvelles fonctions en SAS V9.

SAS V9 – Les fonctions de concaténation.

Habitué en SAS, dans les étapes DATA, à utiliser les opérateurs de concaténation « !! » ou encore « || », (les seconds n’étant pas portables sur toutes les plate-formes SAS, par exemple sur MVS, Z/OS …, nous vous déconseillons leur usage), le Système SAS change la donne en nous offrrant aujourd’hui une série de trois nouvelles « fonction de concaténation » de chaîne de caractère, appelées : « CAT, CATS, CATX« .

Plus riche et permettant une gestion plus élaborée de la concaténation de variable, ces nouvelles fonctions, en SAS V9, permettent même d’ajouter des caractères séparateur entre les variables concaténées.

Plutôt qu’un long discours, voici un ensemble de portions de code SAS, mettant en scène les différentes possibilitées offertes en terme de concaténation de variables de type caractère avec le Système SAS V9.

Dans les exemples qui vous sont proposés ci-dessous, vous trouverez quatre cas d’utilisation de chacune des fonctions de concaténation, systématiquement, la quatrième (a4), présente le résultat qui serait obtenu lors de l’utilisation des trois précédentes (a1, a2, a3). Cette approche vous permettra de voir plus rapidement le résultat qui sera produit par les instructions SAS V9 sans devoir exécuter le code ci-dessous.

/* ****************************************** */
/* Site : http://www.formations-sas.fr - 2009 */
/* SAS V9                                     */
/* Fonctions de concaténation de chaines de   */
/* caractères.                                */
/*                                            */
/* Fonctions : CAT, CATS, CATX                */
/*                                            */
/* Auteur : Pascal MAUBERT                    */
/* ****************************************** */

/* Tronc Commun */

data test_cat;
 length cas $ 10 a1 a2 a3 a4 $ 45 x y z $ 15;
 x="Pays";
 y="FR";
 z="2009";
/* Exemple d'utilisation des nouvelles fonctions SAS de concaténation */
 /* SAS Version 9 */
 /* portions de code par groupe de 4 instructions équivalentes,
 la 4 a pour but de montrer le résultat */

 a1 = trim(x) !! ' ' !! trim(y) !! ' ' !! z ;
 a2 = 'Pays' !! '  FR  ' !! '2009';
 a3 = 'Pays ' !! trim(y) !! ' ' !! z ;
 a4 = 'Pays FR 2009';
 cas="Cas 1";
 output;

/* le symbole "!!" peut remplacer le "||", toutefois cela est déconseillé,
 si vous avez des besoins de portabilité, par exemple, pouvoir utiliser
 votre code sous MVS ou Z/OS */
/* Sans blanc aux extrémités */
/* Concatenates character strings and removes leading and trailing blanks  */

 a1 = cats(x,y,z) ;
 a2 = cats('Pays','  FR  ','2009');
 a3 = cats('Pays',y,z);
 a4 = 'PaysFR2009';
 cas="Cas 2";
 output;

/* Ajouter un séparateur et supprimer les blancs de début et de fin de chaine */
/* Concatenates character strings, removes leading and trailing blanks,
 and inserts separators */

 a1 = catx('-',x,y,z) ;
 a2 = catx('-','Pays','  FR  ','2009');
 a3 = catx('-','Pays',y,z);
 a4 = 'Pays-FR-2009';
 cas="Cas 3";
 output;

/* Garder tous les blancs */
/* Concatenates character strings without removing leading or trailing blanks  */

 a1 = cat(x,y,z) ;
 a2 = cat('Pays','  FR  ','2009');
 a3 = cat('Pays',y,z);
 a4 = 'Pays  FR  2009';
 cas="Cas 4";
 output;

/* Enlever les blancs de fin uniquement */
/* Concatenates character strings and removes trailing blanks  */

 a1 = catt(x,y,z) ;
 a2 = catt('Pays','  FR  ','2009');
 a3 = catt('Pays',y,z);
 a4 = 'Pays  FR2009';
 cas="Cas 5";
 output;
run;

/* ****************************************** */
/* Site : http://www.formations-sas.fr - 2009 */
/* Auteur : Pascal MAUBERT                    */
/* ****************************************** */

A vos claviers ;-) !

Ou copier / coller directement dans votre fenêtre programme SAS.

Programme Exemple SAS : Extraction Aléatoire sans Doublon

 

La problématique est la suivante, réaliser une pannélisation, pour des raisons de performance.

 

Afin d’appliquer un modèle prédictif sur une représentation limitée de population, ou afin d’optimiser les performance lors de l’écriture de programme SAS en effectuant des tests sur une petite portion d’une base de données, nous avons la possibilité avec le système SAS de réaliser très simplement une extraction de données, de type aléatoire et bien sur, cerise sur le gâteau : sans doublons.

 

Dans le programme SAS suivant, il vous suffit de renseigner les macros variables, entre le signe ‘=’ et le signe ‘;’ : PCT, contenant le pourcentage de lignes de la table à extraire et DS1, donnez lui le nom complet de la table SAS source, soit libname.tablename, ensuite lancer le programme SAS et voilà c’est tout.

 

Programme exemple SAS : Extraction aléatoire sans doublon.

Lire la suite de cette entrée »