Como abrir proyectos de Enterprise Guide corruptos o de una versión anterior

Septiembre 3rd, 2010 por rvaquerizo

Muchos hemos sufrido este error trabajando con Enterprise Guide de SAS:

Unable to open file as a valid project file

Además de la pantalla:

eguide-version-2.PNG

De este modo "tan sencillo" podemos recuperar los códigos de nuestro proyecto de Enterprise Guide siempre que sean proyectos *.egp y no *.seg. Por cierto, para abrir proyectos de versiones anteriores tenemos el Migration Wizard de Guide, da algunas pegas prefiero este método. Un gran truco de http://www.dnmca.com 

Tags: ,

Trucos R. Establecer la configuración local de una fecha

Septiembre 2nd, 2010 por rvaquerizo

Cuando manejamos datos las fechas nos producen muchos quebraderos de cabeza, por ejemplo cuando tenemos que transformar un caracter a fecha. En mi opinión R es una de las herramientas las flexibles y rápidas para trabajar con fechas, claro que acostumbrado a SAS cualquier otra herramienta me parece perfecta. A lo que vamos, imaginemos la siguiente situación :


?as.Date
x <- c("1jan1960", "2jan1960", "31mar1960", "30jul1960")
z <- as.Date(x, "%d%b%Y")
z
[1] NA NA "1960-03-31" "1960-07-30"

Se trata de transformar un texto a fecha en R. El formato del texto es d mes en inglés año con 4 cifras. Para transformar a fecha tenemos la función as.Date que recibe como parámetros el objeto y el formato de la fecha, el más habitual sería %d/%m/%Y 10/09/1976. Para meses en formato nombre empleamos %b pero en este caso "1jan1960" nos produce un valor perdido sin embargo "31mar1960" si se transforma correctamente ¿Por qué motivo sucede esto?


Sys.setlocale("LC_TIME")
[1] "Spanish_Spain.1252"

Nuestra configuración de fecha es spanish, luego january no es reconocido por R, tendremos que hacer:


x <- c("1ene1960", "2ene1960", "31mar1960", "30jul1960")
z <- as.Date(x, "%d%b%Y")
z
[1] "1960-01-01" "1960-01-02" "1960-03-31" "1960-07-30"

Ya funciona correctamente. Si deseamos modificar nuestra configuración tendremos que hacer lo siguiente:


Sys.setlocale("LC_TIME", "English")
x <- c("1jan1960", "2jan1960", "31mar1960", "30jul1960")
z <- as.Date(x, "%d%b%Y")
z

Ya tenemos los datos como deseábamos. Muy sencillo y fácil de recordar. Saludos.

Trucos SAS. Porque hay que usar objetos hash

Septiembre 1st, 2010 por rvaquerizo

Quiero trabajar un poco con objetos hash en SAS. Pero antes quería demostraros con una comparativa de código muy sencilla y muy rápida la necesidad de trabajar con estos objetos en SAS. La problemática es muy habitual en nuestro trabajo diario. Tenemos una tabla SAS muy grande, con millones de registros y tenemos que cruzarla con otra tabla SAS muy pequeña para quedarnos sólo con los registros que aparezcan en la tabla pequeña. Tenemos unos clientes que han recibido un contacto comercial y hemos de quedarnos con sus saldos históricos en determinados productos. Veamos los distintos métodos que planteo para machear registros, conjuntos de datos de partida:

options fullstimer;
*CONJUNTO DE DATOS GRANDE, EXISTE LA
POSIBILIDAD DE QUE TENGA DATOS REPETIDOS;
data grande;
do i=1 to 20000000;
idcliente=int(ranuni(0)*1000000);
drop i;
output;
end;
run;
*CONJUNTO DE DATOS PEQUEÑO, NO TIENE
REGISTROS DUPLICADOS;
data pequenio;
do i=1 to 2000000;
idcliente=int(ranuni(34)*1000000);
drop i;
if mod(idcliente,1132)=0 then output;
end;
run;
proc sort data=pequenio nodupkey; by idcliente;quit;

Tenemos que cruzar el dataset grande con el pequeño, 20 millones frente a unos miles. En mi larga (muy larga) experiencia trabajando con SAS casi todo el mundo (menos Sonia) con el que he coincidido haría:

*OPCION 1: ORDENACION Y MERGE;
proc sort data=grande; by idcliente;
proc sort data=pequenio; by idcliente; run;
data machea;
merge grande (in=a) pequenio (in=b);
by idcliente;
if a and b;
run;

Ordenamos los dos conjuntos de datos SAS y realizamos un merge, también es habitual ver el outer join. Este tipo de cruces, con los datos empleados, en un equipo local poco potente tarda algo más de 1 minuto. Mi amiga Sonia y yo hasta hace unos meses hubiéramos hecho:

*OPCION 2: CREACION DE FORMATOS;
proc sort data=pequenio out=selec nodupkey; by idcliente;
data selec;
set selec;
fmtname="selec";
label="1";
start=idcliente;
run;
proc format cntlin=selec;quit;
proc delete data=selec;quit;
*********************************;
data machea2;
set grande;
if put(idcliente,selec.)="1";
run;

El empleo de formatos para los cruces de tablas SAS aumentó mi productividad exponencialmente y permitió que fuera una de las personas más productivas en una gran entidad bancaria. Este cruce tarda aproximadamente unos 10 segundos en realizarse. Tiene una limitación cuando realizamos cruces con valores repetidos, a ver si algún lector identifica el problema, poco habitual pero que limita este tipo de cruces. Por último quería acercaros al uso de objetos hash con SAS. Puede que escriba largo y tendido sobre el tema pero hoy sólo un ejemplo:

*OPCION 3: MANEJO DE OBJETOS HASH;
data machea3 ;
set pequenio point = _n_ ;
declare hash objhh (dataset: 'pequenio') ;
objhh.DefineKey ( 'idcliente' ) ;
objhh.DefineDone () ;
do until ( fin ) ;
set grande end = fin ;
if objhh.find () = 0 then output ;
end ;
stop ;
run ;

Con el mismo equipo este proceso tarda en ejecutarse 4 segundos. ¿Merece o no la pena aprender a trabajar con objetos hash? Podéis ser aun más productivos, algo que en algunos casos no repercute en vuestra calidad laboral, si eres más productivo y más riguroso tendrás más trabajo, si no eres productivo y fallas constantemente mejor haces poco trabajo, eso sí, tu hora de salida siempre ha de ser posterior a la del responsable. En fin, dudas, sugerencias, salir a las 15 horas en rvaquerizo@analisisydecision.es

Tags: ,

Detalles técnicos del seguro de crédito. El factor de uso del importe concedido

Agosto 31st, 2010 por rvaquerizo

El seguro de crédito me sigue pareciendo muy interesante técnicamente y de vez en cuando hay que dedicarle alguna entrada en el blog. Voy a recordar viejos tiempos escribiendo sobre el factor de uso del importe concedido. Nos ponemos en antecedentes, en el seguro de crédito el riesgo es el impago de una transacción comercial. Las empresas que lo contratan tienen que disponer de información muy exacta de las ventas a crédito a sus clientes a los que llamaremos deudores. Esta información ha de estar en posesión de la compañía aseguradora que cubre la operación ya que en caso de siniestro define la cantidad máxima a indemnizar al asegurado (importe siniestral). Es decir, el asegurado "comunica" a la aseguradora el importe de la venta a su deudor y la aseguradora asume el riesgo de impago sobre un porcentaje del total, tiene un porcentaje garantizado. Un inciso, las aseguradoras de crédito, además, ofrecen información sobre deudores, gestión de recobros,... Pero la función fundamental del seguro de crédito es asumir el riesgo de impago de las transacciones de los deudores con sus asegurados; esta función es imprescindible para el desarrollo de un país, así de claro.

Pero las compañías aseguradoras de crédito se encuentran con un "problema", es casi imposible ajustar el importe concedido a los deudores con el importe real de la venta. La aseguradora dispone de ventas globales de los asegurados, no por deudor. Además es común entre los asegurados vender por un importe menor del importe concedido, ¿por qué? porque la aseguradora garantiza un porcentaje del importe de la venta, no el total. Si no se produce el impago no conocerá el importe de la venta, la tendencia de los asegurados es asegurar ventas mayores para, en el caso de impago de su deudor, el porcentaje garantizado sobre la venta cubra la práctica totalidad de la venta. Es un poco lioso pero es una postura "muy española", un ejemplo para facilitar la comprensión del problema:

A vende a B, C y D por valor de 100.000 € al año. La aseguradora tiene un % de garantía de las ventas del 80%. A cubre con nuestra compañía las ventas a B por 30.000 € el resto de operaciones no las cubre, luego tiene un importe concedido de 30.000 €. Si A tiene un siniestro por impago de B tendría que recibir 30.000x80% = 24.000 €, sin embargo A "miente" en sus ventas y vende por valor de 25.000 €, es decir, en realidad usa el 83% del importe condedido. A este % lo llamaremos factor de uso del importe concedido. Técnicamente es una medida de gran importancia para el seguro de crédito, ya que es una medida del importe expuesto al riesgo en las transacciones  imprescindible para la estimación de los importes siniestrales. De ahí su importancia técnica ¿Cómo calcular este factor de uso? Esto es lo problemático, si el concepto puede ser duro su estimación provoca el llanto a más de un técnico. Algún día contaré como nos podemos aproximar a este factor de uso. Saludos.

Tags: , ,

Trucos Excel. Gráficos con caracteres

Agosto 13th, 2010 por rvaquerizo

piramide-poblacional-excel.png

Quería plantear hoy un truco Excel que no es un truco como tal, si no más bien una idea para que podáis hacer más vistosos vuestros informes con gráficos de caracteres, sobre todo para aquellos dinosaurios que hagáis muchos ranking o puntuaciones. La idea es muy sencilla se trata de emplear la función REPETIR de Excel pero "con talento". =REPETIR("|";E12) nos repite el pipe | tantas veces como le indiquemos en la casilla E12. Pero hay algo que si tiene importancia, la fuente que elijamos para el pipe:

fuentes-pipe-excel.png

Aquí tenéis algunos ejemplos de como veríamos el pipe en nuestros gráficos de caracteres. Yo recomiendo que no empleéis fuentes que sean más grandes que las que las usadas para escribir. Con este sencillo truco podemos hacer gráficos más complejos, siempre tenemos el motor de Excel, pero me parece interesante dar algunos apuntes. Si este método lo combinamos con formatos condicionales podemos obtener resultados muy interesantes. Espero que sea de utilidad.

 

Trucos SAS. Matrices de adyacencia con SAS

Agosto 5th, 2010 por rvaquerizo

SAS no está pensado para el cálculo matricial, pero hay ocasiones en las que hemos de trabajar con ellas. Uno de los casos típicos es la matriz de adyacencia. Se trata de partir de estos datos:

a b
a e
b c
b e
c e
d a

Crear:
  a b c d e
a 0 1 0 1 1
b 1 0 1 0 1
c 0 1 0 0 1
d 1 0 0 0 0
e 1 1 1 0 0

Yo planteo la siguiente metodología:


*CONJUNTO DE DATOS DE PARTIDA;
data original;
input nodo1 $ nodo2 $;
datalines;
a b
a e
b c
b e
c e
d a
;run;
*A <-> B;
data original2;
set original original(rename=(nodo1=nodo2 nodo2=nodo1));
run;
*MAXIMOS DE PRESENCIA;
proc sql noprint ;
select distinct 'max(nodo2="'||compress(nodo2)||'") as '||compress(nodo2)||' '
into: instr separated by ","
from original2
order by 1;
*HACEMOS LOS MAXIMOS;
create table matriz as select
nodo1,
&instr.
from original2
group by 1;
quit;

Un método muy sencillo que busca en la matriz de partida el nodo de inicio y el nodo de fin. Creo que se entiende muy bien por eso, y porque estoy casi de vacaciones, no voy a entrar en detalles. Si alguien necesita esos detalles que contacte. Saludos.

Tags: ,

Bootstrap con SAS sin complicaciones

Agosto 3rd, 2010 por rvaquerizo

El bootstrap es una técnica de muestreo que, a partir de la simulación, crea sucesivas muestras con reemplazamiento que teóricamente son una buena aproximación al universo muestral. Por aquí podéis encontrar información y bibliografía al respecto. Lo que yo quería comentaros hoy es algo a lo que ya hizo referencia la comunidad de SAS en español. Hacer bootstrap con SAS no es complicado. Cuando buscas información ves unas macros que dan miedo y piensas “esto es un software”, sin embargo el tema no es tan difícil y con un paso DATA ya podemos poner a funcionar esta técnica. Veamos el ejemplo, partimos de un conjunto de datos SAS que obtenemos en esta web interesantes ejemplos verdad. Nos bajamos el archivo a una ubicación de nuestra máquina o leemos la url y comenzamos a trabajar:

Data poissonreg;
  infile "c:\temp\poissonreg.csv" delimiter="," firstobs=2;
  input id school male math langarts daysatt daysabs;
run;

Tenemos un dataset con 7 variables, el id alumno, la escuela, el sexo, la nota en matemáticas, la nota en lenguaje, los días en clase y los días ausentes en clase. El dataset tiene 316 observaciones, se trata de crear 100 muestras de tamaño el 90% del dataset de partida y estudiar la nota media por escuela y sexo de las muestras extraídas. En total tendremos que tener 285*100 observaciones Lee el resto de esta entrada »

Tags: , ,

Lecciones de economía de un ignorante. Cosas que no comprendo

Agosto 3rd, 2010 por rvaquerizo

Jose Manuel de Prada escribió esto en ABC. Y Yo he conocido a un tipo de Indra que es su doble.  Pero siguiendo el hilo de este opinador hay otra cosa que tampoco comprendo, el BBVA obtiene unos "buenos y sólidos resultados superando expectativas en ingresos" incluido un escandaloso aumento de las comisiones, harina de otro costal. Bueno, pues tras obtener estos resultados con unos márgenes brutos asombrosos, va y emite unos bonos con un diferencial (no decir spread que es de catetos) con respecto al Euribor a 3 meses (por favor no decir mindswap)  muy por encima de anteriores emisiones.

El caso es que el BBVA tiene vencimientos de deuda para los próximos 5 años por valor de un cerro de miles de millones. ¿BOP? ¿Base de la pirámide?

Lecciones de economía de un ignorante. La privatización de las cajas será una chapuza

Agosto 2nd, 2010 por rvaquerizo

Interesante noticia leída en el cincodias.

La Ley de Cajas, el FROB y otros artificios se han hecho exclusivamente para la rápida privatización de las Cajas de cara a evitar un posible corralito. Se está pasando de puntillas sobre el tema porque es una verdadera chapuza. Los principales puntos sobre los que se quería incidir con todas estas leyes ad-hoc pensadas a la hora de la comida por nuestros representantes políticos en un restaurante vegetariano que hay detrás del Congreso son:

  • Una fundación apaña el "carácter social" de las Cajas
  • A ver si podemos despolitizarlas y meter a nuestros amigos en los consejos de administración. Dejan la política y les ponemos un puestecito
  • Creamos algo que llamamos SIP (Sistemas Integrales de Protección) que al final es un banco y así puede salir a bolsa, si entran firmas de capital riesgo... "no queremos ser intervencionistas"

Y con estas 3 premisas ya apañamos el problema de las cajas. Las malas se unen con las buenas y así creamos bancos. Las acciones serán todas las emisiones que nos ha dejado hacer MAFO para evitarse el corralito y presumir de la buena salud del sistema financiero español. Con esto dejamos de pagar los cupones a los ahorradores y nos evitamos unos intereses que no se los creía nadie. A todo esto, ¿alguien ha pensado en los trabajadores de las cajas ante el escenario que planteo? Por aquí no sigo que me caliento.

Tags: ,

David gana a Goliat. La sentencia del caso SAS frente a WPS

Julio 30th, 2010 por rvaquerizo

Estaba esperando que saliera la sentencia. Además cabía la posibilidad de pertenecer a Goliat y tenía la boca cerrada. Y resulta que tenemos una de las sentencias más interesantes en cuanto a software se refiere:

http://www.bailii.org/ew/cases/EWHC/Ch/2010/1829.html

Yo no soy capaz de leerme eso en inglés pero el traductor de Google me ha ayudado:

Por las razones anteriormente expuestas, llego a la conclusión de la siguiente manera:i) Si bien no estoy convencido de que Pumfrey J se equivocó al concluir en Navitaire que, sobre la correcta interpretación del artículo 1 (2) de la Directiva sobre el software, derechos de autor en los programas de ordenador no protege a los lenguajes de programación de la copia, estoy de acuerdo con él que se trata de una cuestión sobre la que se requiere la orientación de la Tribunal de Justicia (véanse los párrafos 211-218 supra).

ii) Aunque yo no estoy convencido de que Pumfrey J se equivocó al concluir en Navitaire que, sobre la correcta interpretación del artículo 1 (2) de la Directiva sobre el software, derechos de autor en los programas de ordenador no protege a las interfaces que se copie en que esto puede lograrse sin descompilar el código objeto, considero que esta es también una cuestión sobre la que se requiere la orientación de la Tribunal de Justicia (véanse los párrafos 219-227 supra).

iii) Aunque yo no estoy convencido de que Pumfrey J se equivocó al concluir en Navitaire que, sobre la correcta interpretación del artículo 1 (2) de la Directiva sobre el software, derechos de autor en los programas de ordenador no protege a las funciones de los programas de la copia, y aunque su decisión sobre ese punto fue confirmada por el Tribunal de Apelación de Nueva, considero que esta es también una cuestión sobre la que se requiere la orientación de la TJCE (véanse los párrafos 228-238 supra).

iv) En el supuesto de que la interpretación Pumfrey J del artículo 1 (2) de la Directiva sobre el software era correcta, WPL no ha vulnerado los derechos de autor de SAS Institute en los componentes de SAS mediante la producción de WPS (véanse los párrafos 245-250 supra).

v) considero que el razonamiento que sustenta la interpretación Pumfrey J del artículo 1 (2) de la Directiva sobre el software también se aplica el artículo 2 (a) de la Directiva sobre Sociedad de la Información, pero de nuevo se trata de una cuestión sobre la que se requiere la orientación de la TJCE (véanse los párrafos 251-256 supra).

vi) En el supuesto de que el artículo 2 (a) de la Directiva sobre Sociedad de la Información debe ser interpretado de la misma manera en que el artículo 1 (2) de la Directiva sobre el software, WPL no ha vulnerado los derechos de autor SAS Institute en los Manuales de SAS mediante la producción o pruebas WPS (véanse los párrafos 257-267 supra).

vii) la utilización WPL de la edición de SAS aprendizaje queda fuera del alcance de los términos de las licencias pertinentes (véanse los párrafos 276-290 supra).

viii) La interpretación del artículo 5 (3) de la Directiva sobre el software es otra cuestión sobre la que se requiere la orientación de la Tribunal de Justicia (véanse los párrafos 291-311 y 314 supra).

ix) En la interpretación del artículo 5 (3), que estoy a favor, use WPL de la edición de aprendizaje es en el artículo 5 (3), y en la medida en que los términos de la licencia evitar que esto son nulos y sin valor, con el resultado de que ninguno de los actos WPL se quejó de un incumplimiento de contrato o de la violación del derecho de autor excepto, quizá, un (véanse los párrafos 313-315 arriba).

x) WPL ha infringido los derechos de autor en los Manuales de SAS de forma sustancial a la reproducción en el Manual de WPL (véanse los párrafos 317-319 supra).

xi) WPL no ha vulnerado los derechos de autor en los Manuales de SAS mediante la presentación de las Guías de WPS (véanse los párrafos 320-329 supra).

Atención a la frase la Directiva sobre el software era correcta, WPL no ha vulnerado los derechos de autor de SAS Institute en los componentes de SAS mediante la producción de WPS. Bueno, pues parece que al gigante le ha salido un duro competidor pero sobre todo hay una sentencia muy interesante sobre "la apertura del código cerrado".

Sin duda alguna la noticia del verano.