In Vie de l'entreprise

Les plateformes SAS sont parfois considérées comme des écosystèmes fermés, à tort. Des langages open source (Java, LUA, Groovy) sont intégrés depuis plusieurs années dans le langage SAS, et depuis l’ouverture de son dépôt GitHub, l’éditeur SAS propose des packages pour interagir avec SAS VIYA et SAS 9.4 depuis des environnements Python et R.

Exécuter du code tiers dans SAS

 Java

Apportée par la version SAS 9, l’utilisation de classes Java dans SAS n’est pas nouvelle mais permet d’étendre les possibilités de vos programmes SAS. Cette intégration est rendue possible grâce à une instruction DECLARE JavaObj dans un DATA Step. Cette instruction offre un moyen d’instancier des objets Java et d’appeler leurs méthodes.

Exemple d’appel de la méthode « printHello » de la classe Hello_Class :

data _null_;
  attrib result length=$20;
  declare javaobj j ('Hello_Class');
  j.callStringMethod ('printHello', result);
  j.delete();
  put result=;
run;

Vous pouvez choisir de faire appel à un programme Java pour réaliser une tâche non prise en charge par le langage SAS, comme par exemple chiffrer ou déchiffrer un fichier de données.


Vous trouverez une documentation complète et des exemples d’application sur le site du support SAS.

 

LUA

LUA est un langage de script léger qui a de nombreux domaines d’application : systèmes embarqués, réseau, etc. Il est généralement utilisé pour piloter l’exécution d’autres langages.

Depuis SAS 9.4 M3, SAS implémente un environnement d’exécution LUA 5.2. Dans le cadre d’une plateforme SAS, LUA peut constituer une alternative intéressante au macro langage SAS. LUA prend en charge des structures de données de type listes et dictionnaires, et s’exécute dans le même processus que le code SAS.

Exemple de code LUA :

/* une PROC LUA héberge le code LUA, qui lui-même exécute du code SAS (DATA Step) */
proc lua ;
  submit;
    if not sas.exists("work.cars")
    then
      print "Copie de la table CARS";
      sas.submit [[ data work.cars; set sashelp.cars; run; ]]
    else print "Table CARS déjà présente"
    end
  endsubmit;
run;

Et son équivalent en macro code SAS :

%macro exemple();
  %if not %sysfunc(exist(work.cars))
  %then %do;
    %put Copie de la table CARS;
    data work.cars; set sashelp.cars; run;
  %end;
  %else %put Table CARS déjà présente;
%mend exemple;
%exemple;

Tous les détails pour utiliser LUA dans vos programmes SAS sont dans la documentation SAS, ainsi que de nombreux cas d’usage.

Groovy

Inspiré de Java et Python, Groovy est un langage de script orienté objet tout comme LUA. Groovy s’exécute dans une machine virtuelle Java (JVM) et permet de réutiliser des librairies Java.

Groovy est supporté par SAS depuis la version SAS 9.3 et peut être intégré au code SAS via la PROC GROOVY. Cette instruction permet d’exécuter directement du code Groovy ou créer une classe Java qui pourra être appelée dans un DATA Step avec l’instruction DECLARE JavaObj.

Parmi les usages possibles, Groovy permet d’interagir avec le système d’exploitation pour par exemple lister le contenu d’un répertoire (dans le cas où l’instruction SAS « X » est désactivée), ou lister ou concaténer les fichiers contenus dans une archive ZIP.

/* Contenu d'un répertoire */
proc groovy;
  submit;
    new File('C:/SAS/SASHome').eachFile() {file->println file.getName()}
  endsubmit;
quit;
--- SAS Log ---
deploymntreg
EnhancedEditor
Formats
/.../
/* Contenu d'une archive zip */
proc groovy;
  submit;
    def zipfile = new java.util.zip.ZipFile(new File('C:/test.zip'))
    zipfile.entries().each{entry->println entry.getName() + ' ' + entry.getSize()}
  endsubmit;
quit;
--- SAS Log ---
test_texte_file_01.txt 200
test_texte_file_02.txt 200
test_texte_file_03.txt 200

On pourra également tirer avantage de la gestion native du XML pour créer un DATA Set à partir d’un fichier JSON. Le LIBNAME JSON ayant été porté dans SAS à partir de la version SAS 9.4M5, Groovy fournit un moyen de lire un JSON sur une version antérieure de SAS. Vous trouverez un exemple ici.

Documentation Groovy sur le site du support SAS.

Python

La PROC FCMP est une instruction qui permet de créer des fonctions stockées dans une bibliothèque et qui peuvent être appelées dans un DATA Step. Les fonctions peuvent contenir du code SAS, mais aussi d’autres langages comme Java via l’instruction DECLARE. Depuis la version SAS 9.4 M6 et VIYA 3.5, la PROC FCMP prend en charge Python (instruction « DECLARE Object »). La PROC FCMP est un moyen simple d’exécuter du code Python dans un programme SAS.

Exemple de création d’une fonction FCMP incluant du code Python :

/* Création d'une fonction PROC FCMP qui appelle une fonction Python */
proc fcmp outlib=work.myfuncs.pyfuncs;
  /* Création de la fonction FCMP */
  function TestSquare(int);
    /* Création de la fonction Python */
    declare object py(python);
    result = int*int;
    return(result);
  /* Fin de la fonction FCMP */
  endsub;
run;
/* Appel de la fonction FCMP dans un DATA Step */
options cmplib=work.myfuncs;
data _null_;
  result = TestSquare(3);
  put result=;
run;

Vous pouvez approfondir le sujet avec la documentation globale de la PROC FCMP, et la documentation spécifique à l’utilisation des objets Python.

Interagir avec SAS depuis un environnement Python ou R

Jusqu’à présent nous avons vu comment intégrer du code d’un langage open source tiers (Java, LUA, Groovy, Python) dans un programme SAS. Il est également possible d’utiliser les services des plateformes SAS à partir d’un environnement de programmation R ou Python. Le dépôt GitHub regorge de packages qui étendent les possibilités d’interactions avec les plateformes SAS 9.4 et SAS VIYA.

Plateforme VIYA – SWAT

VIYA est la dernière génération de plateforme analytique proposé par SAS. Elle fournit une solution conçue pour le Cloud, pouvant facilement être mise à l’échelle et ouverte sur les langages open source Python et R. Les interfaces de visualisation et de calcul de SAS VIYA s’appuient sur le moteur In-Memory et distribué Cloud Analytic Services (CAS).

Le moteur CAS est accessible à partir d’une session SAS lancée dans l’IDE SAS Studio de la plateforme VIYA, ou dans un client SAS Enterprise Guide d’une plateforme SAS 9.4. Il est également possible d’ouvrir une session CAS à partir d’un environnement Python ou R grâce au package SAS Scripting Wrapper for Analytics Transfer (SWAT). Ce package se connecte au moteur CAS directement via un protocole binaire (Python binary protocol) ou via l’API REST afin d’exécuter des CAS Actions.

Exemple de connexion à CAS (binary protocol) avec SWAT :

import swat
sess=swat.CAS(cashost, casport, casuser, caspassword)
sess
CAS('host.domain.com', 5570, 'myusername', protocol='cas', name='py-session-1', session='5de9cb7a-a006-ab4e-bf53-5d0f4aa83cb6')
out = sess.serverstatus()
NOTE: Grid node action status report: 5 nodes, 104 total actions executed.

Au travers de SWAT, l’utilisateur peut manipuler les données en mémoire sous forme de CASTable. Comme SWAT s’inspire du package Python Pandas, la plupart des fonctions de l’API Pandas se retrouvent dans le package de SAS et sont applicables aux CASTables.

Pour retrouver les instructions de mise en œuvre et d’utilisation de SWAT, rendez-vous sur les pages du dépôt GitHub SAS :

Plateforme VIYA – DLPy

Le module SAS Visual Data Mining and Machine Learning (VDMML) de VIYA offre une interface pour créer et exécuter des modèles. Toutes les fonctions de VDMML peuvent être appelées sous forme de CAS Actions.

Le package SAS Deep Learning Python (DLPy) fournit une API pour accéder à toutes les fonctions de VDMML au travers d’un environnement Python. Ce package supporte le format ONNX afin de facilement importer et exporter des modèles entre différents environnements.

Le package DLPy et sa documentation sont disponibles sur la page DLPy du dépôt GitHub SAS

Plateforme SAS 9.4

La plateforme SAS 9.4 n’a pas été oubliée, et dispose également d’un package Python : SASPy. A partir d’un environnement Python, ce package s’appuie sur une JRE (version 1.7 minimum) et les binaires SAS SASDeploymentManager et SASVersionedJarRepository pour se connecter à une plateforme SAS 9.4 et instancier un Workspace.

L’utilisateur peut agir sur les tables SAS en utilisant les méthodes des objets Python ou en soumettant du code SAS :

import saspy
# On créé la session à partir de la connexion 'winiomlinux' préalablement renseignée dans la configuration
sas1 = saspy.SASsession(cfgname='winiomlinux')
# On référence la table SAS existante sashelp.class dans un objet SASdata
tabclass=sas1.sasdata('class','sashelp')
# On affiche des stats descriptive sur cette table avec une méthode Python
tabclass.means()
# Ou avec du code SAS :
results_dict  = sas1.submit("""
proc means data=sashelp.class;
run;
""")

SASPy permet notamment d’échanger facilement des données entre des DATA Set SAS hébergés sur le Workspace SAS et des Pandas DataFrame de l’environnement Python.

# Création d’un Pandas Dataframe class_pd à partir de la table SAS référencée par l’objet tabclass :
class_pd= tabclass.to_frame()
# Création d’un SAS DATA Set work.class référencé par l’objet class_sas à partir du Dataframe class_pd :
class_sas = sas1.df2sd(class_pd,'class','work')

A noter, l’option « Teach_me_SAS » qui permet d’afficher le code SAS correspondant à une méthode d’un objet Python

# Dans la session « sas1 », on active l'option teach_me_SAS
sas1.teach_me_SAS(True)
# Une fois l'option activée, l'appel à une méthode affiche le code SAS correspondant
tabclass.means()
proc means data=sashelp.class stackodsoutput n nmiss median mean std min p25 p50 p75 max;run;

La Page GitHub de SASPy contient toutes les informations et les exemples nécessaires pour mettre en œuvre ce package

Et bien d’autres API…

Beaucoup d’autres projets sont publiés par SAS, comme le package SASCTL qui facilite la communication entre VIYA et Python, ou ESPPy, qui permet de se connecter à un serveur SAS ESP (Event Stream Processing) avec Python. A la rédaction de ces lignes, la page GitHub de SAS recense 145 dépôts.

Code open source exécuté dans les programmes SAS ou services SAS accessibles à partir d’environnements Python ou R, le choix est vaste pour enrichir notre utilisation de SAS. A vous de découvrir, et de jouer !

Recent Posts
AVISIA