Cursos gratis de para empezar en Big Data y Machine Learning

Tras asistir al Big Data Spain 2018 el pasado 14 y 15 de Noviembre en Madrid se me han reactivado las neuronas responsables del autoaprendizaje. En la convención pude ver como el futuro está ahí, el concepto de Business Intelligence ha evolucionado a Data Science. Ya no solo basta con construir y mantener modelos de datos, y generar reporting para los usuarios de negocio (otro día hablaré de la 4ª generación de los datos de la que tanto se habla ahora y mantra del Data Revolution Tour organizado por Qlik este año). En nuestro departamento estamos preocupados por dar ese paso del BI tradicional al nuevo ecosistema de conceptos sexys que toda empresa inmersa en su transformación digital desea abanderar: machine learning, chatbots, cloud computing, data visualization, IA… pero vayamos por pasos. En primer lugar, ¿por dónde empezamos? Las distintas tecnologías que conforman la arquitectura de un entorno Big Data no podemos contarlas con los dedos de la mano… Spark, Hadoop, Apache Hive, MapReduce… por otro lado tenemos el Machine Learning y análisis predictivo donde entran en juego otras como Python, R…

He decidido compartimentar toda esta nueva marabunta de tecnología en varias fases para no atragantarme. Si queréis comenzar a bucear sin invertir mucho dinero, podéis echar un ojo a cursos online gratuitos de Big Data como el introductorio de la UOC : Fundamentos  y usos de Big Data y si queréis ir un poco más allá, la Universidad Rey Juan Carlos I acaba de cerrar la 5ª convocatoria del curso online Técnicas de Análisis de Datos y Big Data (5ª edición).

Por otro lado, como lo que realmente me gusta es picar código, he empezado un curso de Python 3 en Codeacademy. Aunque esta plataforma ofrece muchos cursos gratis (de hecho, tienen uno de Python 2), este en concreto sólo está disponible en la versión PRO desde 19,99$ mensuales. La idea es en un futuro continuar con Data Science Path del catálogo de Codeacademy donde se profundiza en Python y su uso en machine learning.

1 Comentario

Cargar variables desde excel en Qlikview

Si trabajáis con documentos de Qlikview con decenas de variables llegaréis a la conclusión de que la forma más óptima de su mantenimiento es utilizar un excel (por cierto, aprovecho para reivindicar a Qliktech que den una vuelta al diseño del panel de variables, bastante arcaico para la gestión…). La forma de cargar variables desde un excel a Qlikview es muy sencilla, sólo necesitamos dos cosas:

  • Fichero excel con una tabla en la que indiquemos nombre de la variable y valor
  • Modificar el script de carga del documento Qlikview

 

Excel con variables Qlikview

Como ejemplo práctico, imaginad que necesitáis utilizar la misma paleta de colores en todos los documentos Qlikview de la compañía. Lo más ágil es almacenarlos en variables, y un paso más allá, mantenerlo desde un fichero excel de forma que si en un futuro decidimos cambiar algún color, tendremos centralizado el cambio. La hoja excel deberá tener una tabla con al menos dos columnas, una para el nombre y otra para el valor o expresión (podemos añadir cuantas columnas querramos para complementar, luego no las cargaremos). En nuestro caso práctico, la columna A será el nombre de cada variable y la B la expresión que define los colores (utilizamos la función RGB de Qlikview). La columna C la usamos internamente, no se carga.

Cargar variables desde excel en Qlikview

 

Carga en script

El segundo paso será cargar las variables automáticamente en el script de Qlikview. Como la idea es dejar el mantenimiento de las variables únicamente en el excel, prepararemos un algoritmo que recorra todas las filas con contenido, así si en un futuro añadimos un nuevo color, no tendremos que modificar el script en n documentos.

Con un simple loop de tipo for recorremos las filas con contenido de nuestro excel y almacenamos el contenido de la columna B “Expression” en una variable con el nombre indicado en la columna a “Variable”. Os marco en rojo los parámetros que debéis modificar para personalizar el script en vuestro sistema.

 

/******* LIBRO DE ESTILOS COLORES *******/
Variables:
LOAD Variable,
Expression
FROM
[MiServidor\Libro Estilos\LIBRO_ESTILOS_QV.xlsx]
(ooxml, embedded labels, table is Hoja1);
Let vNumberOfRows = NoOfRows(‘Variables‘);
For vI = 0 to (vNumberOfRows – 1)
Let vVariable_Name = Peek(‘Variable’,vI,’Expression‘);
Let [$(vVariable_Name)] = Peek(‘Expression’,vI,’Expression‘);
Next
/*****************************************/

Tras recargar el documento, vemos que las variables se han grabado correctamente:

Cargar variables desde excel en Qlikview

Sin Comentarios

Jefe o líder: la batalla interminable entre poder y liderazgo

Sin Comentarios

Optimización módulos Qlikview

Días atrás comentamos cómo optimizar un servidor de Qlikview para mejorar el rendimiento y consumo de memoria RAM. En esta ocasión, os mostramos recomendaciones para un correcto desarrollo del script y diseño de interfaces de usuario.

Optimización qlikview

Buenas prácticas en desarrollo de módulos en Qlikview

  • Eliminar claves sintéticas del modelo de datos
  • Eliminar loops del modelo de datos
  • Utilizar QVDs cuando sea posible y con el parámetro OPTIMIZED
  • Utilizar campos numéricos para cruzar tablas
    Mediante tablas maestras o lookup en el modelo
  • “Autonumber” para reemplazar claves concatenadas (claves combinando campos para romper tablas sintéticas).
    Esta función genera una clave numérica única por cada valor diferente de un campo. En el caso de claves concatenadas, asigna a cada par un número determinado. Se utiliza pasando como parámetro los campos concatenados, por ejemplo: autonumeric(COD_CAMPO_1 + COD_CAMPO_2)
  • Eliminar la hora de los campos de fecha
    Formateando desde el script estos campos como DATE en lugar de DATETIME. Desde SQL con la sentencia CAST(XXXX as DATE) y en Qlikview DATE(XXX) o FLOOR(XXX). Si es necesaria la hora, se puede mostrar en otro campo.
  • Eliminar campos y tablas lookup no utilizados del modelo de datos
  • Usar flags numéricos cuando sea posible
    Primar el uso de booleanos (1 o 0) en lugar de “S”/”N” o “SI”/”NO”
  • Evitar usar SELECT * en queries
    En su lugar, recuperar sólo los campos de BD que vayamos a leer en el script.
  • Utilizar variables para expresiones recurrentes
  • Reducir expresiones con “count distinct”
    Una alternativa es reemplazarla por un SUM() de un flag configurado a nivel de script.
  • Reducir uso de IF anidados
    Los IF anidados suponen un uso intensivo de memoria y CPU. Intentar trasladar esta lógica a nivel de script o reducir las evaluaciones.
  • Evitar IF en expresiones de Gráficos o tablas
    Es importante evitar utilizar los IF en los títulos de tablas, CONDITIONS para mostrar un objeto y textbox.
  • Reducir comparativa entre campos de tipo texto
    Utilizando siempre que sea posible tablas lookup o bien fabricar una clave numérica con la función autonumeric.
  • Eliminar o reducir uso de MACROS
  • Reducir uso de Show Frequency (Presentation)
    Se utiliza normalmente en los MultiBox y ListBox.
  • Reducir el número de objetos de cada hoja
    Eliminar objetos redundantes u ocultos. Administrar correctamente el uso de charts, textbox, etc.
  • Minimizar uso de Set Analysis en tablas grandes
  • Reducir uso de tablas pivotantes en aplicaciones grandes
  • Evitar funciones al vuelo como “inmonth”, etc
  • Utilizar cargas de datos binarias de periodos históricos o datos no sensibles a cambio
  • Reducir número de CHART abiertos en cada hoja
    En su lugar, mostrarlos minimizados si es posible.
  • Calculate Condition para limitar datos en tablas y charts
  • Utilizar variables o set analysys en lugar de cálculos complejos en las expresiones

 

Recomendaciones: expresiones

Count ( Distinct ‘FieldName’)

Reemplazar el count() por un sum() y el cualificador “distinct” por el valor número 1 para cada ocurrencia distinta del campo.

Load
Alfa,
if (peek(‘Alfa’)=Alfa,0,1) as Flag1,
Num
resident table_1
order by Alfa Asc;

En este caso, la función PEEK compara cada valor del campo “Alfa” con el valor leído anteriormente. Si los valores son iguales, se asigna un 0, si son diferentes, se asigna un 1. El número de valores distintos será sum(Flag1). Es importante que la tabla esté ordenada por el campo Alfa.

Otra alternativa es una query sencilla con los distintos valores:

Load
Distinct Alfa,
Alfa as AlfaDist
resident table_1;

 

If ( Condition(Text),…..)

Mapear los campos de tipo texto a números. Por ejemplo, utilizando la función Autonumber. La expresión de esta forma sería: If (Alfa= ‘ABC’, ‘ABC’, left (Alfa, 2)).

Load
*,
Alfa = ‘ABC’, 1, 0) as Flag
resident table_1 ;

La expresión cambiaría a  If ( Flag = 1,’ABC’, left (Alfa, 2))

 

Sum ( If (Condition, ‘FieldName’…))

En este caso la agregación se hace en tiempo de ejecución y repercute en el consumo de memoria. Si es posible, es preferible hacer el cálculo a nivel de SCRIPT.

 

If ( Condition1, Sum(‘FieldName’),

La lógica de IF anidados es conceptualmente sencilla, pero normalmente es complicado administrarla. Una gran cantidad de IF anidados supone un uso intensivo de CPU y memoria. Es recomendable revisar los IF anidados para intentar reducir el número de anidaciones. Otra opción es cuando sea posible, sustituir los IF por variables, por ejemplo Quantity*Price donde Price es una variable.

 

Sort text

QV automáticamente evalúa si un campo debe tratarse como número, texto o “general”. Los campos evaluados como texto se ordenan como text, que es la forma más lenta. Esto puede reemplazarse manualmente desde el script.

 

Dynamic captions and text objects

Se pueden utilizar expresiones en prácticamente cualquier objeto que permita introducir texto. Una expresión se evalúa en función de su entorno, por ejemplo, si están definidas en un gráficos o tablas (pivotantes o straight) sólo se calculan cuando estos objetos están activos (no cuando están minimizados). Por otro lado, si tenemos expresiones en el título de un objeto, en el show o calculation condition se evalúan cada vez que se hace una selección.

 

Macro triggers ( “on change” )

Cuidado con lanzar macros en cascada o de forma recursiva generando bucles.

 

Checklist de optimización módulos Qlikview

En uno pdf de documentación oficial de Qlikview se distribuye una hoja excel muy útil para el equipo de desarrollo a modo de checklist de los elementos que hay que revisar para garantizar una buena optimización de un módulo. Podéis descargar la versión traducida al castellano desde aquí.

Checklist optimización módulo qlikview

 

Sin Comentarios

9 estrategias para que tus reuniones sean muy eficaces

9 estrategias para que tus reuniones sean muy eficaces
Infografía ofrecida por Wrike – Gestor Proyectos Online

Sin Comentarios

Crea una web dinámica sin programar

Hasta ahora, si querías una página web y no sabías programar, podías utilizar gestores de contenido como Wix que ofrecen una plantilla, multitud de funcionalidades extra y un gestor muy amigable para introducir y personalizar el contenido. Sin embargo, si el proyecto es un poco más ambicioso, este tipo de herramientas se quedaba a medio camino. ¿Te gustaría publicar tu colección completa de videojuegos o de un grupo de música? ¿gestionar listados de usuarios o clientes? ¿ofrecer a los usuarios que se registren en tu boletín de noticias? Para este tipo de funcionalidades web es imprescindible utilizar bases de datos, pero el conocimiento técnico va un poco más allá del HTML y CSS. Necesitarás conocer herramientas de gestión de base de datos para construir un modelo relacional de tablas en MySQL o PostgreSQL (por mencionar algunas). Cómo acceder a la información almacenada mediante queries e incluso interactuar con ésta mediante scripts DML para modificar, crear o borrar datos. Como veis, ya no sólo tendríamos que enfrentarnos a pintar el contenido en una web, si no a cómo administrar la información. Por suerte para muchos, Wix ha lanzado recientemente una mejora sustancial de su entorno de desarrollo que simplifica y facilita enormemente esta tarea: WIX Code. Sin tener conocimientos de programación avanzados y de base de datos, ahora sabrás cómo hacer una página web dinámica fácilmente.

Crea una web dinámica sin programar

Para explicar cómo funciona esta herramienta, vamos a centrarnos en un ejemplo práctico que precisamente fue la primera página que tuve que diseñar hace años para un vecino: quería publicar en una web toda su colección de cassettes, discos y vinilos LP / 7” del cantante Raphael (estamos hablando de más de 400 discos en varios idiomas). Mi vecino quería que cada disco tuviera su portada, datos del mismo (año de publicación, idioma, etc) así como todas las canciones que lo componían. Por aquel entonces, sin conocimientos de acceso a base de datos, tuve que picar a mano una a una todas las páginas. Tarea monstruosa, especialmente cuando había que hacer algún cambio que afectaba a todas las páginas.

¿Cuál hubiera sido la forma ideal de hacerlo? Guardar toda la información de los discos y las canciones en una base de datos. Diseñando una única página de contenido dinámico, se pintarían los datos de cada disco en función de los parámetros recibidos. Pero sin conocimientos avanzados de programación, esto es imposible. Si por aquel entonces hubiera existido Wix Code, lo podría haber hecho en menos de la mitad de tiempo y con un mantenimiento posterior ínfimo.

Lo que ofrece esta nueva herramienta es un entorno de trabajo en el que gestionaremos la información de forma amigable a través de una interfaz similar a una hoja de cálculo tipo Excel, aunque por detrás y de forma transparente al usuario, se almacena en una tabla de base de datos. Dentro del entorno de Wix Code, podremos crear Colecciones (lo que serían tablas en una BBDD convencional). Una colección es una hoja de cálculo en la que las columnas especifican el tipo de información y las filas serían cada elemento. En nuestro caso práctico, crearíamos una colección donde las columnas podrían ser Nombre, Año de publicación, Tipo, Idioma y Canciones. En las filas introduciríamos los datos de cada disco. Respecto a las Colecciones, comentar que podemos configurarlas para que además del propio administrador, cualquier usuario pueda interactuar con los datos (modificando, borrando o creando nuestros registros).

Una vez tenemos los datos almacenados en nuestra colección, los utilizaremos para poblar una página de contenido dinámico. A través del asistente, crearemos este tipo de página  y la asignaremos la colección de discos.  En este punto, debemos especificar un valor único que identifique de forma unívoca cada disco para generar su propia dirección URL. Para ello podríamos utilizar el título, o para ser más eficientes, en el proceso de creación de la colección crearíamos un campo numérico incremental que usaremos como “identificador” (1, 2, 3…). Dentro de la página de contenido dinámico, diseñaremos una plantilla para pintar el contenido de cada disco (imagen, título, canciones, etc).

Crea una web dinámica sin programar

Pero Wix Code no sólo ofrece esto. Imaginaros otro caso práctico con el que me topé hace muchos años cuando administraba un foro. Queríamos organizar un boletín de noticias semanal con información relevante para los usuarios, pero por ley de protección de datos sólo podíamos enviar la comunicación a los que hubieran concedido explícitamente su permiso. Para ello diseñamos un formulario en el que los usuarios introducían su e-mail y nos llegaba un correo con la solicitud. Manualmente lo introducíamos en un fichero Excel y cuando había que enviar la comunicación, copiábamos los correos electrónicos de la lista. ¿Principal problema? Que sólo había un Excel, ubicado en mi ordenador. Si otro administrador quería utilizar la lista, tenía que enviársela actualizada. Al igual que en el caso anterior, si hubiera tenido conocimientos más avanzados de programación, en lugar de mandar por correo electrónico la solicitud, hubiera guardado los e-mails de los usuarios en una base de datos que explotaría en el momento de enviar las comunicaciones. Con Wix Code podemos hacer esto sin tocar nada de código. Crearemos una colección para almacenar la información (por ejemplo, nombre y e-mail del usuario) que vincularemos con un form diseñado en el entorno de desarrollo de Wix. De esta forma, podremos mantener nuestro boletín de una forma mucho más eficiente. Un paso más allá, sería aprovechar la propia tecnología de Wix Code para generar una sección de backend desde donde podremos gestionar los datos de la colección. A través de una pantalla podríamos añadir, borrar o modificar datos.

Otra de las posibilidades que ofrece la herramienta son las interacciones con el usuario mediante acciones javascript (cuando se pulse un botón que se pinte un tooltip, por ejemplo). En realidad, utiliza el framework jQuery, que facilita enormemente el uso de javascript, como el acceso DOM a los elementos web. Es cierto que para estas opciones es necesario tener ligeros conocimientos de programación, pero el entorno de desarrollo de Wix Code está preparado para ofrecer dinámicamente una serie de opciones utilizando una práctica habitual en IDEs de desarrollo: pulsando CTRL+espacio aparecerá una ventanita con los métodos o acciones disponibles para el objeto con el que estemos trabajando.

Como veis, por suerte ahora tenemos a nuestra disposición herramientas que facilitan el acceso al diseño de páginas web complejas y elaboradas sin necesidad de tener conocimientos específicos de programación.

 

 

Sin Comentarios