Entradas

Mostrando entradas de julio, 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(…

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'…

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;

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='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;

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 propuestaSAS 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 acue…

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;

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_finyymmddn8.;       dif=intck('month',f_ini,f_fin); call symput('num_meses',dif); run;

%do n=0%to

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.