Trucos

Macros SAS. Primer y último día del mes de una fecha SAS

Me debo a vosotros, mis lectores. Y he tenido visitas que buscaban como obtener el primer y el último día de un mes con SAS. Como Análisis y Decisión es una web personalizada voy a dar respuesta a esas búsquedas. Para ello tengo os planteo dos macros de SAS, además nos servirán para entender mejor la función INTNX para operar con fechas. El siguiente ejemplo parte de la necesidad de obtener, dada una fecha, el primer y último día del mes de la fecha dada:

Macros SAS. Hacer 0 los valores missing de un dataset

La siguiente macro de SAS nos permite transformar los valores perdidos (missing) en valor 0 para todas las variables de un dataset. Para todas, para todas las numéricas. Esto es muy importante porque en ocasiones es necesario distinguir el valor 0 del valor missing(.). Pero puede ser muy práctica si vamos a emplear procedimientos que han de distinguir valores perdidos o, simplemente, si deseamos que nuestra tabla tenga otro aspecto.

Truco Excel. Nuestra propia función redondear en Excel

Hay operaciones que pueden ser muy habituales de hacer con Excel y necesitaríamos una función propia que la realizara. A continuación vamos a plantear una situación en la que es especialmente útil crear una función específica y guardarla en el libro de macros personal para utilizarla en nuestras sesiones SAS. En este caso concreto vamos a crear una función que nos redondeé un número a 0 o 0.5, es decir, 6,3 valdría 6 y 6,7 valdría 6,5. Para realizarlo sin una función específica emplaríamos múltiples funciones de Excel, por ejemplo:

Macros SAS. Transformar un numérico a fecha

A continuación vamos a plantear una macro de SAS bastante sencilla que nos permitirá transformar valores numéricos del tipo 20080607, fechas en formato AAAAMMDD pero que son numéricas, a valores fecha en SAS que nos permitirán realizar operaciones. Siguiendo el sistema de todos los mensajes de AyD trabajaremos con ejemplos para estudiar su utilidad.

Partimos de dos fechas en formato AAAAMMDD y desamos realizar una diferencia entre ellas:

data _null_;

 y=20070101;

 m=20080110;

 dif=m-y; put dif;

run;

En el log obtenemos que la diferencia entre estas 2 fechas es 10009, necesitamos transformarlas en variables numéricas pero del tipo fecha. Tenemos múltiples posibilidades para realizar esta transformación, pero en este caso voy a emplear la función de creación de fecha en SAS MDY(mes,día,año). Para conseguir del valor AAAAMMDD el mes, el día y el año emplearemos las funciónes MOD para calcular el módulo e INT para obtener la parte entera de una operación:

Macros SAS. Ordenar alfabéticamente las variables de un dataset

Si deseamos ordenar alfabéticamente las variables de un conjunto de datos SAS porque puede falitarnos la realización de sumatorios de importes, saldos,… y el conjunto de datos SAS está desordenado os planteo una macro bien sencilla y que trabaja con una de las vistas más útiles de la SASHELP. La macro es bien sencilla y nos permite establecer que variables deseamos que aparezcan primero, selecciona los nombres de las variables, los ordena alfabéticamente y mediante un proc append (más rápido que un paso data) crea el fichero SAS con las variables ordenadas:

Truco SAS. Función para contar caracteres

Si deseamos contar cuantas veces aparece un caracter dentro de una cadena en SAS nos encontramos que no existe ninguna función de texto en SAS. Para ello podemos utilizar otras funciones de texto en SAS. La idea es determinar la longitud de la cadena con el caracter en cuestión y restarle la longitud de la cadena sin el caracter. Es decir, ¿cuántas A hay en la frase «Menuda crisis financiera»? Longitud con A y sin espacios= 22, longitud sin A y sin espacios=19, luego 22-19=3 aes. Para este ejemplo no se tienen en cuenta los espacios en blanco, veamos el programa en SAS:

Trucos SAS. Operar con fechas YYYYMM típicas de particiones Oracle

Este truco va orientado a programadores SAS que estén habituados a trabajar con Oracle. El SAS Tip de hoy nos permite parametrizar a la perfección la lectura de tablas históricas particionadas. En estos casos podemos crear parámetros con macrovariables de SAS para leer las tablas Oracle sin necesidad de modificar manualmente las fechas de partición. Un ejemplo:

1. sin parametrizar:

proc sql;

 create table maximo as select

 idcliente,

 max(importe) as importe_semestral

 from ora.tabla

 where f_particion in (200801,200806,200812);

quit;

2. parametrizado:

Truco SAS. Transformaciones de variables con arrays

Hacer ceros los missing en un dataset. Crear una etiqueta «NO DISPONIBLE» en campos carácter sin valores. Cuando trabajamos con SAS es una situación más que habitual. A continuación voy a plantear un par de ejemplos de como podemos usar arrays de variables en SAS para realizar una transformación «masiva» de variables de nuestro conjunto de datos.

Poner missing numéricos a 0:

Lo primero es destacar que no siempre un valor perdido equivale a 0. Cuando realizamos modelos es necesario tener en cuenta que hacemos con los missing, el siguiente ejemplo transforma todos los . de un dataset a 0:

Truco SAS. Macro buscar y reemplazar en texto

A veces hay problemas a la hora de importar un fichero de texto a SAS. Por ejemplo el fichero proviene de Access y tiene los números con formato europeo. El siguiente programa hace un buscar y reemplazar pero con SAS. Partimos de un fichero de texto ubicado en c:\temp\pepin.txt así:

4.497,31 2.776,50
2.555,46 6.782,73
3.752,77 8.791,32
1.599,49 6.903,17
8.584,16 7.050,30
8.061,74 2.605,04
3.666,99 7.319,29
751,63 1.919,96
5.635,12 4.795,78
9.714,18 5.342,31
9.160,85 9.752,27
7.609,17 2.409,43
1.855,36 8.768,07
1.715,74 4.031,63
8.775,23 7.256,52
2.339,50 9.234,67
6.268,95 1.531,50
4.406,24 5.395,50

Truco SAS. Proc contents que genera un dataset

Vamos a introducir los nombres de las variables SAS de un dataset en otro dataset. Esto puede sernos muy útil para realizar documentación, validaciones de los conjuntos de datos generados, automatización de instrucciones,… Es un truco muy sencillo y tan sólo es necesario comprender el funcionamiento del ODS de SAS explicado en otro de los mensajes de este blog. Simplemente empleamos el proc contents de SAS y almacenamos con ODS en un dataset el resultado del listado de las variables:

Truco Excel. Obtener cambio de divisas on-line

El siguiente truco Excel es muy sencillo. Se trata de una consulta web que nos permite obtener el cambio de divisas a Euro casi practicamente on-line. La consulta se realiza sobre la web www.finanzas.com sitio que además quiero recomendar, desde él sigo la imparable caida de mis valores…

La consulta es la siguiente:

Sub cambio_divisas()

'

'

    With Application

        .DecimalSeparator = "."

        .ThousandsSeparator = ","

        .UseSystemSeparators = False

    End With

    With ActiveSheet.QueryTables.Add(Connection:= _

        "URL;http://www.finanzas.com/divisas", Destination:=Range("A1"))

        .Name = "divisas_1"

        .FieldNames = True

        .RowNumbers = False

        .FillAdjacentFormulas = False

        .PreserveFormatting = True

        .RefreshOnFileOpen = False

        .BackgroundQuery = True

        .RefreshStyle = xlInsertDeleteCells

        .SavePassword = False

        .SaveData = True

        .AdjustColumnWidth = True

        .RefreshPeriod = 0

        .WebSelectionType = xlSpecifiedTables

        .WebFormatting = xlWebFormattingNone

        .WebTables = "1"

        .WebPreFormattedTextToColumns = True

        .WebConsecutiveDelimitersAsOne = True

        .WebSingleBlockTextImport = False

        .WebDisableDateRecognition = False

        .WebDisableRedirections = False

        .Refresh BackgroundQuery:=False

    End With

    With Application

        .DecimalSeparator = "."

        .ThousandsSeparator = ","

        .UseSystemSeparators = True

    End With

End Sub

Primero cambiamos los separadores de miles y decimales, posteriormente realizamos la consulta a www.finanzas.com/divisas y ya tenemos tabulada la información. Además no sobreescribimos anteriores consultas, siempre se añadirán gracias a RefreshStyle por lo que podemos hacer un seguimiento del cambio. A mí me ha sido muy útil para seguir el efecto del precio de unos fondos de inversión.

Truco SAS. Uso de filename y pipe

Hoy presento una de las utilidades de FILENAME para interactuar con los file systems en los que creamos tablas SAS. Consiste en emplear FILENAME con la opción PIPE. Lo que hacemos es asignar una referencia a una ejecución del sistema operativo. Por ejemplo en Windows:

filename dir pipe "dir c:\";data uno;

 infile dir;

 input datos $50.;

run;

Creamos una tabla SAS temporal que contiene el resultado de la ejecución en MS DOS de _dir c:_ muy simple. Pero donde de verdad puede sernos de utilidad el uso de PIPE es en ejecuciones con UNIX. A continuación planteo algunos ejemplos:

Trucos Excel. Crear un borrador de correo con Excel

Inicio una serie de mensajes con trucos de Excel que considero pueden ser de utilidad para realizar tareas habituales en nuestro trabajo diario. Este primer truco Excel consiste en una macro que nos permite crear en borradores correos electrónicos. También nos permitiría enviarlos directamente, pero en ese caso habríamos de tener permisos para que otras aplicaciones accedieran a Outlook. Veamos el código que emplea:

Sub Correo()
Dim ol As Object, myItem As Object

Dim adjunto As String
Set ol = CreateObject("outlook.application")

Set myItem = ol.CreateItem(olMailItem)

adjunto = “C:\temp\fichero.xls”