lunes, 29 de julio de 2013

Funciones cadenas de caracteres SAS (I). Tratamiento de blancos.

Funciones cadenas de caracteres(I). Tratamiento de blancos.
Iniciamos una serie de entradas con ejemplos sobre funciones de tratamiento de caracteres. Empezamos por el tratamiento de blancos. A continuación un sencillo ejemplo para eliminar blancos, en el que se emplea una u otra función según se quieran eliminar todos los blancos, sólo los de los extremos y funciones para alinear a la derecha o izquierda la cadena resultante.

data prueba1;
length direccion $30.;
direccion = '  C  /  Río Segura, 14    ';
output;
run;

data prueba2;
set prueba1;
direccion1 = left(direccion); /* alinea el texto a la izquierda */
direccion2 = right(direccion); /* alinea el texto a la derecha */
direccion3 = trim(direccion); /* Elimina los blancos iniciales y finales de la cadena de texto */
direccion4 = compress(direccion); /* Elimina todos los blancos que contenga la cadena de caracteres */
direccion5 = strip(direccion);  /* Elimina blancos iniciales y finales y alinea a la izquierda */
direccion6 = left(trim(direccion)); /* Equivalente a strip, con funciones left y trim */
run;

jueves, 25 de julio de 2013

Tratamiento de fechas en SAS (II)

Incluímos otro sencillo ejemplo de tratamiento de fechas. En este ejemplo se obtiene la fecha del sistema, y la fecha inmediatamente anterior y posterior, igualmente se obtiene el día de la semana.

data _null_;
   length dia_sem_hoy $10.;
   format fecha_hoy fecha_ant fecha_pos yymmddn8. ; /* date formats */
   f_hoy="&sysdate"d;
   f_ant=sum(f_hoy,-1);
   f_pos=sum(f_hoy,+1);
   fecha_hoy = input(put(f_hoy,yymmddn8.),8.);
   fecha_ant = input(put(f_ant,yymmddn8.),8.);
   fecha_pos = input(put(f_pos,yymmddn8.),8.);
   dia_s_hoy = weekday(f_hoy);
   select(dia_s_hoy);
  when (1) dia_sem_hoy = 'Domingo';
when (2) dia_sem_hoy = 'Lunes';
when (3) dia_sem_hoy = 'Martes';
when (4) dia_sem_hoy = 'Miercoles';
when (5) dia_sem_hoy = 'Jueves';
when (6) dia_sem_hoy = 'Viernes';
when (7) dia_sem_hoy = 'Sábado';
   end;
   call symput('fecha_hoy',fecha_hoy);
   call symput('dia_sem_hoy',dia_sem_hoy);
   call symput('fecha_ant',fecha_ant);
   call symput('fecha_pos',fecha_pos);
run;

%put fecha actual: &dia_sem_hoy &fecha_hoy, fecha anterior: &fecha_ant, fecha posterior: &fecha_pos;

viernes, 19 de julio de 2013

Recorrer y validar de forma automática todos los campos de una tabla

En ocasiones, puede ser de utilidad en procesos de validación de datos, el introducir una comprobación y acción a tomar para todos los campos de una tabla SAS determinada.

A continuación, un sencillo ejemplo que valida todos los campos numéricos y de tipo carácter buscando valores nulos y sustituyéndolos por un valor que fijemos.

data test;
var1 = 'A';var2 = 1;output;
var1 = '';var2 = .;output;
var2 = 5;output;
var1 = 'B';var2 = .;output;
run;


data test1;
set test;
array vars1(*) _numeric_ ;
array vars2(*) _character_ ;
do i=1 to dim(vars1);
if vars1(i)=. then vars1(i)=0;
if vars2(i) = '' then vars2(i) = '-';
end;
drop i;
run;

martes, 16 de julio de 2013

Macro para recorrer una tabla SAS

A veces resulta útil recorrer una tabla SAS y en base al valor de determinado campo ejecutar un proceso dado. A continuación un sencillo ejemplo para recorrer una tabla cuyo nombre se pasa por parámetro y evaluar el valor de un campo de la tabla que  también se pasa como parámetro. En base al valor de este campo se ejecutaría determinado código.



%macro recorrer_tabla(tabla,campo);

%let dsid = %sysfunc (open(&tabla));   
%let nobs = %sysfunc (attrn(&dsid, NOBS));
%if &nobs > 0 %then %do;
    %do i = 1 %to &nobs;    
        %let rc = %sysfunc(fetch(&dsid));
                                                                                                                                                                                                                                              
        %let valor = %sysfunc (getvarc(&dsid,%sysfunc(varnum(&dsid,&campo))));       
        %put valor &i = &valor;
        /* Logica a ejecutar en base al valor */
    %end;
%end;
%let rc = %sysfunc (close(&dsid));

%mend recorrer_tabla;


%let tabla = prueba;
%let campo = mes;
%recorrer_tabla(&tabla,&campo);

data prueba;
mes = '201301';output;mes='201302';output;mes='201303';output;
run;

lunes, 15 de julio de 2013

Uso del procedimiento 'proc format'

El procedimiento 'proc format' resulta muy útil para crear formatos personalizados. Es común utilizarlo para crear tablas de realación. Son bastante fáciles de usar y su rendimiento es muy aceptable.A continuación un sencillo ejemplo.

proc format library=work;
value  $ciudad 'M'='Madrid'
             'B'='Barcelona'
             'V'='Valencia'
              other = 'No disponible';
run;

data prueba1;
campo1 = 'M';
output;
campo1 = 'B';
output;
campo1 = 'V';
output;
campo1 = 'J';
output;
run;


data prueba2;
set prueba1;
campo2=put(campo1,$ciudad.);
run;

domingo, 14 de julio de 2013

Soluciones analíticas in-database. Caso SAS - Teradata

Dentro de las soluciones de SAS enfocadas a la mejora de rendimientos y tiempos de respuesta en entornos analíticos destaca el esfuerzo realizado con la propuesta SAS In-Database. Esta propuesta va acompañada de otro tipo de soluciones high-performance como son SAS Grid Computing y SAS In-memory, que igualmente mejoran rendimiento, ayudan a gestionar la carga de trabajo y facilitan la escalabilidad de los entornos analíticos.
La solución SAS In-Database reduce la necesidad de mover grandes volúmenes de datos entre las soluciones SAS y los SGBD. Realizar el tratamiento de datos, los procesos analíticos o de reporting dentro de la base de datos donde reside esta información reduce movimientos de datos innecesarios y facilita las funciones de data governance. Por otra parte, permite aprovechar la arquitectura MPP de las bases de datos y entornos data Warehouse para mejorar la escalabilidad y el rendimiento de los procesos.
En particular, destaca la integración de SAS con Teradata. Este acuerdo ha creado SAS and Teradata Analytic Advantage Program, combinando la potencia analítica de SAS con las prestaciones en entornos data warehouse de Teradata.  
La solución reduce los costes en la preparación de datos para los procesos analíticos y mejora los tiempos en la obtención de los resultados analíticos. Optimiza la creación de modelos analíticos, convirtiendo los modelos SAS en objetos de base de datos. Se reduce el movimiento de datos, la redundancia y los problemas de refresco de datos.
El programa ofrece tres niveles, en función de las necesidades analíticas de la organización:
Express: Un primer nivel para facilitar el uso de estadística para resolver cuestiones de negocio. Integra los módulos de SASSAS Analytics Pro, SAS/ACCESS Interface to Teradata y SAS Enterprise Guide.
Advanced: Ofrece más soluciones de in-database analytics, como rápida creación y entrenamiento de modelos estadísticos. Integra los módulos de SAS: SAS SAS Analytics Pro, SAS/ACCESS Interface to Teradata y SAS Enterprise Miner y SAS Scoring Accelerator for Teradara.
Entreprise: Una solución completa que ofrece un completo portfolio de modelos analíticos. Centraliza la creación, desarrollo, implantación y gestión de modelos. Automatiza los procesos analíticos de apoyo a la toma de decisiones en cualquier nivel de la organización. ntegra los módulos de SAS: SAS SAS Analytics Pro, SAS/ACCESS Interface to Teradata y SAS Enterprise Miner, SAS Model Manager y SAS Scoring Accelerator for Teradara.
Como ejemplo sencillo de integración de los procedimientos SAS en Teradata, la documentación de SAS, nos ofrece el siguiente caso:
Un procedimiento de uso bastante extendido en SAS es el procedimiento PROC FREQ. Este procedimiento realiza una estadística descriptiva sencilla en base a un set de datos de SAS.
Veamos un caso:
proc freq data=customer.credit_data;
table state * credit_score;
La especificación DATA= indica al procedimiento PRO FREQ que la tabla de entrada es custormer.credit_data, donde customer indica el esquema de base de datos. credit_data es el nombre de la tabla de la BBDD de Teradata. El procedimiento obtiene estadísticas de los valores de la columna credit_score agrupados por el campo state.
Para obtener los resultados, los valores únicos de la columna crédito_score de la tabla crédito_data deben ser contados por el campo state. El procedimiento PROC FREQ obtiene   también los valores mínimos y máximos.
Para obtener estos mismos resultados in-database, se genera dinámicamente el SAS SQL equivalente al procedimiento PROC FREQ. Esta SQL es enviada al módulo SAS/ACCESS que a su vez lo envía al motor de la base de datos Teradata
select count(*) as f1, state, min(state) as f2, credit_score,
min(credit_score) as f3, max(credit_score) as f4
from customer.credit_score group by state, credit_score

Tratamiento de fechas en SAS (I)

Voy a ir publicando una serie de entradas, que contendrán ejemplos sencillos sobre tratamiento de fechas en SAS. Es una práctica habitual y tener ejemplos sencillos a mano, puede ayudar.

En esta ocasión muestro un ejemplo para transformar en un paso data un campo númerico con contenido de fecha a campo tipo fecha y viceversa.

                     numérico YYYYMMDD  <--> date


/* Creamos una tabla ejemplo con variables numérica con contenido de fecha y con formato yyyymmdd */

data prueba;
length fecha_num 8.;
fecha_num = 20130601; output;
fecha_num = 20130630; output;
run;

/* Transformamos la variable numérica con contenido fecha yyyymmdd a variable tipo fecha */

data prueba1;
set prueba;
fecha_date = mdy((mod((int(fecha_num/100)),100)),(mod(fecha_num,100)),(int(fecha_num/10000)));
run;

/* Partiendo de una variable tipo fecha que contiene la fecha del día, la convertimos en un
numérico con formato yyyymmdd */

data prueba2;
fecha_date = today();
fecha_num = input(put(fecha_date,yymmddn8.),8.);
run;

sábado, 13 de julio de 2013

Creación de bucles basados en rango fechas (macros SAS)

Es habitual encontrarse la necesidad de ejecutar determinado proceso para un determinado rango de fechas. Para ello es muy útil el uso de macros de SAS que incluyan estructuras iterativas que nos permitan ejecutar un determinado código para un rango determinado de fechas. En el ejemplo que se muestra a continuación se muestra el esqueleto de una macro que permite ejecutar un código para un determinado rango de meses, en formato yyyymm.




%macro recorrer_meses(mes_ini, mes_fin);


      data _null_;


      f_ini=input(PUT(&mes_ini.01,8.),yymmdd8.);
      f_fin=input(PUT(&mes_fin.01,8.),yymmdd8.);
      format f_ini f_fin  yymmddn8.;
      dif=intck('month',f_ini,f_fin);
      call symput('num_meses',dif);
      run;


      %do n=0 %to &num_meses.;
                      %let mes=%sysfunc(intnx(month,%SYSFUNC(INPUTN(&mes_ini.01,YYMMDD8.)),%EVAL(+&n)),yymmn6.);


            %put Procesando  mes: &mes;


             /* INCLUIR CODIGO A EJECUTAR PARA CADA ITERACION */
    


      %end; 


%mend;


/* Ejemplo llamada a la macro */


%recorrer_meses(201201, 201307);

Objetivo del blog

El objetivo de este blog es proporcionar y compartir utilidades, ejemplos y documentación sobre las herramientas de tratamiento de datos: SAS y R.
Iremos publicando ejemplos claros y sencillos que puedan servir de base para procesos más complejos, buscando ser  de utilidad para perfiles TI que usen SAS o R (programadores, analistas, consultores, administradores) o perfil de negocio con una importante componente estadística o de análisis de datos tales como áreas de Business Intelligence, Riesgos, Marketing, Control de Gestión, etc..que usen SAS o R. Igualmente pueden ser de utilidad para temas de formación o preparación de cursos. El blog está totalmente abierto a comentarios y aportaciones.