martes, 8 de diciembre de 2020

Curso de introducción a la analítica de datos con Pandas


Curso de introducción a la analítica de datos con Python y Pandas.

Enlace de descarga: https://drive.google.com/file/d/1kbLhRG5idWq9qtkVl_YcPDsmM-522vEG/view 

Contenido

  • Introducción:
  • DataFrames:
    • Series
    • DataFrames
    • Crear un DataFrame desde una lista
    • Crear un DataFrame desde un diccionario
    • Crear un DataFrame desde una lista de diccionarios
    • Índices en un DataFrame
    • Propiedades de un DataFrame:
      • axes 
      • dtypes
      • values
      • shape
      • size
      • empty
      • columns
    • Información de un DataFrame (info())
    • Descripción del DataFrame (describe())
  • Importación de datos:
    • desde un archivo CSV
    • desde un archivo Excel
  • Selección:
    • Selección de columnas
    • Selección de filas
    • Selección condicional
    • Selección condicional y de columnas
    • Selección usando números
  • Columnas:
    • Añadir columnas
    • Insertar columnas
    • Eliminar columnas
    • Renombrar columnas
  • Datos:
    • Iteración sobre los datos
    • Valores nulos
    • Valores perdidos
    • Sustituir valores perdidos
    • Sustituir valores perdidos por columnas
    • Reemplazar valores
    • Borrado de filas
    • Borrado de filas duplicadas
    • Borrado de filas con valores perdidos
    • Ordenar los datos
    • Agrupar los datos
    • Iterar sobre datos agrupados
    • Seleccionar grupos
    • Agregación sobre un grupo
    • Datos de texto
    • Datos de fecha/hora
  • Mezcla de datos (merge)
  • Guardado de datos:
  • Visualización de datos:
    • Gráficos de Área
    • Gráficos de Línea
    • Gráficos de Barra
    • Gráficos de Histograma
    • Gráficos de Dispersión
    • Gráficos de Caja
    • Otros tipos de Gráficos
  • Anexos



jueves, 12 de noviembre de 2020

Curso de analítica de datos con NumPy


NumPy es una poderosa librería de Python que permite realizar analítica de datos, gracias al uso eficiente de arrays multidimensionales.

El contenido del curso es el siguiente:

  • Introducción
  • Conceptos básicos:
    • Arrays con NumPy
    • Multidimensionalidad
    • Redimensionamiento y transposición
    • Arrays por defecto
    • Indexación
    • Indexación avanzada de columnas
    • Indexación y slicing avanzado
    • Indexacion boolean
    • Usos de indexación boolean
  • Matemáticas:
    • Matemáticas entre arrays
    • Potencias entre arrays
    • Broadcasting
    • Operaciones con un valor
    • Suma
    • Producto
    • Máximo y mínimo
    • Diferencia entre el máximo y el mínimo
    • Media aritmética
    • Mediana
    • Desviación estándar
    • Percentil
  • Operaciones avanzadas:
    • Valores nan
    • Redondeo
    • Agregar columnas
    • Arrays de datos estructurados
    • Concatenación de arrays
    • Ordenación de arrays
    • Ordenación invertida
    • Valores únicos
    • Guardar y cargar datos en ficheros

Enlace al curso:

sábado, 7 de noviembre de 2020

What Artificial Intelligence is?


Cool things that computers can't do?

 This topic has been always overcome in the last years. Finally, an algorithm can imitate and do these cool things that we considered as intelligent. Machines imitating intelligent human behavior?
Any imitation is based on procedures resolved previously with (human) intelligence. Therefore, why not consider this imitation as intelligent? We, the human being, are living imitating and repeating constantly procedures from other humans.  

Autonomous and adaptive systems? 
Autonomy is achieved with a certain intelligence. Adaptation is an intelligent evolution of the current species. From a certain point of view, we can consider as intelligent any system that can be work autonomously and can be adapted and adjusted automatically depending on new factors and scenarios. On my opinion
Who can be in possession of the true and the reason describing the intelligence? Why cannot exist many types of intelligence? What determines the concept of intelligence? I consider intelligence as any behavior than respond to the environment solving the problem or overcoming adversity with an optimal and profitable result. Depending on the degree achieved with that result, we can consider a best or a worst intelligence. The above description could be the definition of simplistic intelligence. If we introduce the capacity of that intelligence to self learn from the experience and adapt this experience to new scenarios, this intelligence is more advanced and complex. Finally, intelligence can grow in complexity and make relations with other types of intelligence that are capable to solve other specific tasks. When these types of intelligence are joined to face new unknown challenges, collective intelligence achieves a very high level of intelligence. Consciousness could be, at the moment, the top level of intelligence, the limit, or the frontier between the human being and the machines.

miércoles, 4 de noviembre de 2020

Curso gratuito de Introducción a Python


Este curso gratuito es un tour completo y sencillo a los conceptos básicos de Python. 

  • Datos básicos:
    • int
    • float
    • str
    • bool
    • type()
    • Variables
    • print()
    • Operadores con cadenas de texto
    • Operadores con datos numéricos
    • Precedencia de los operadores
    • Conversión entre tipos de datos
  • Ejecución condicional:
    • Expresiones boolean
    • Operadores lógicos
    • Condiciones mediante if/else
    • Condiciones anidadas
    • Condiciones encadenadas (elif)
  • Excepciones:
    • try
    • except
  • Funciones:
    • Desarrollo de funciones
    • Funciones estándar
    • Librerías de funciones
    • Funciones matemáticas
    • Funciones para números aleatorios
  • Bucles:
    • Bucle while
    • Bucles infinitos
    • Sentencia break
    • Sentencia continue
    • Bucle for
    • Rangos
  • Cadenas de texto:
    • Cadenas como listas de caracteres
    • Slicing de cadenas
    • Operaciones con cadenas (funciones)
    • Formateo de datos en cadenas
  • Listas:
    • Conceptos básicos
    • Operadores de listas
    • Métodos de listas
    • Usando funciones estándar en listas
    • Listas y cadenas
  • Tuplas:
    • Conceptos básicos
    • Usos especiales de las tuplas
  • Diccionarios:
    • Conceptos básicos
    • Diccionarios y tuplas
    • Tuplas como claves
  • Programación orientada a objetos:
    • Conceptos básicos
    • Consultar características de un objeto
    • Constructor y destructor
    • Herencia


El curso está repleto de ejemplos, y contiene enlaces a recursos interesantes: enlaces oficiales, documentación, libros, entornos de desarrollo, frameworks, librerías, etc.

Enlace al curso: Curso de introducción a Python 

domingo, 31 de mayo de 2020

El mejor código que puedes programar es el que mejor puedan entender los demás.- Rafael Hernampérez

miércoles, 6 de mayo de 2020

Utiliza bases de datos en tus proyectos web sin servidores

EFEMem Web Database
¿Imaginas poder usar una base de datos en tu web de forma exclusiva y sin necesidad de hacer llamadas remotas, como una API?
EFEMem DB es una base de datos NoSQL ultra ligera, rápida, sencilla y eficiente, basada en clave-valor, que se ejecuta enteramente en memoria. Está enteramente escrita en JavaScript, y se puede ejecutar directamente en el front-end, a través de páginas web, aplicaciones PWA (Progressive Web Applications) o aplicaciones móviles híbridas (desarrolladas con Ionic, React Native, Nativescript, Xamarin, etc).

Casos de uso

¿Cuáles son los escenarios ideales para usar una base de datos en un proyecto web?. He aquí algunos casos:
  • Pérdida conexión. Tu aplicación puede seguir funcionando cuando no tienes conectividad con el servidor. Cuando recuperes la conexión, puedes volcar toda la información recopilada al servidor. Esta característica asegura la alta disponibilidad de tu aplicación.
  • Juegos HTML. Los datos de las partidas se guardan en cada navegador o dispositivo.
  • Datos de sesión de usuario
  • Datos exclusivos de la aplicación web
  • Datos de configuración. Permite cambios "en caliente", eliminando la característica de datos estáticos.
  • Monitorización de datos. Puedes, por ejemplo, conectar tus dispositivos IoT a tu web, y almacenar un rango fijo de datos cíclicos (por ejemplo, las últimas 24 horas).
  • Datos caché de uso frecuente
  • Datos maestros


Características principales

Los puntos fuertes de EFEMem DB son los siguientes:
  • NoSQL. Olvídate de la complejidad de relaciones de tablas o esquemas estrictos. Utiliza pares de clave-valor.
  • Acceso ultra-rápido de lectura y escritura (unos pocos nanosegundos)
  • No requiere de instalación en un servidor ni de un canal de sockets. Es una librería JavaScript que trabaja directamente con los datos.
  • Configuración en caliente. Puedes cambiar la configuración sin reiniciar el motor de base de datos.
  • Modo de datos reciclados. Mediante este modo se puede configurar un máximo de claves. Cuando se alcanza este límite, el siguiente dato se guardará tras eliminar, automáticamente, la cave más antigua.
  • Datos con tiempo de vida. Puedes guardar un dato que expire en un tiempo concreto (expresado en segundos).
  • Comandos poderosos. Puedes gestionar tus datos mediante unos pocos y sencillos comandos.
  • Persistencia. Puedes guardar los datos de forma permanente. Para ello, utiliza localStorage y restaurarlo al iniciar la base de datos o cuando quieras.
  • Espacios. Puedes organizar tus claves mediante espacios. Esto permite tener claves con el mismo nombre y distinto valor, en diferentes espacios. También ayuda a localizar e identificar las claves.
  • Patrones de nombre. Puedes buscar y acceder de forma eficiente a multitud de espacios y claves utilizando patrones de nombre, en lugar de acceder uno a uno.
  • Riqueza de tipos de datos. Puedes usar números enteros o reales, cadenas de texto, valores booleanos, arrays u objetos JSON


Comandos básicos

Lo mejor para entender cómo funciona EFEMem DB es el ejemplo.

Importar la librería

Lo primero es descargar la librería efememdb.js, que contiene todo el motor de la base de datos. Se encuentra en el repositorio Github: https://github.com/efememdb/EFEMemDB
Una vez descargado, en nuestro código HTML, importamos la librería:
<SCRIPT src="[/path/]efememdb.js"></SCRIPT>


/ Una vez importado, el motor de EFEMem DB entra en funcionamiento. Si hubo datos persistidos, automáticamente se cargarán estos para su uso.

Guardar datos con set()

Comencemos con el comando set(). Este comando guarda una clave y su valor:
<SCRIPT> var result = efemem.set("saludo", "Hola Mundo"); </SCRIPT>


Si no se especifica un nombre de espacio, asumirá el espacio 'public' por defecto.
Si el espacio y la clave no existen, se creará esta nueva clave en dicho espacio. Si ya existía previamente el espacio y la clave, el valor de ésta se actualizará con el nuevo valor.
El resultado de este comando sería el siguiente:
{   "ok":true,   "cmd":"set(key, value[,space[,due]])",   "data":{     "key":"saludo",     "space":"public",     "value":"Hola Mundo",     "due":"9999-12-31T22:59:59.000Z" },   "msg":"Key 'saludo' saved successfully in space 'public'",   "affected":1,   "time":"< 1 ms" }


Si se produjese un error, la respuesta de cualquier comando de EFEMem DB sería la siguiente:
{   "ok":false,   "msg":"[mensaje de error]", }


Recuperar datos con get()

El comando get() permite recuperar datos a través de la clave:
<SCRIPT> result = efemem.get("saludo"); </SCRIPT>


Si no se especifica un nombre de espacio, por defecto todos los espacios existentes. Lo mismo ocurre si no se especifica un nombre de clave. El comando get() (al igual que otros comandos), utilizan patrones de nombre para referirse a un espacio o a una clave. El nombre que se pase, se tomará como "parte del nombre". Es decir, que la cadena de caracteres especificada se utilizará como parte del nombre, ya sea al principio, en el medio o al final, muy similar a los patrones o comodines utilizados en un sistema operativo. Si se especifica un patrón 'al', es como si se especificara '*al*', con lo que buscaría cualquier nombre que empiece por 'al', termine en 'al' o que contenga 'al' en cualquier parte del nombre.
El resultado de este comando retorna un array o lista con todas las claves encontradas:
{   "ok":true,   "cmd":"get(key[,space])",   "data":[     {"key":"public~saludo","value":"Hola Mundo"}   ],   "msg":"1 values found",   "affected":1,   "time":"1 ms" }


Lista de comandos

Los comandos set() y get() son los comandos más básicos y utilizados de EFEMem DB. Pero tienes a tu disposición un conjunto de comandos que te ayudarán a gestionar de forma eficiente tu base de datos:
  • copy(): Copia claves de un espacio a otro
  • delete(): Elimina claves en los espacios indicados
  • get(): Recupera claves y valores de los espacios indicados
  • getConfig(): Recupera el valor de un parámetro de configuración
  • info(): Muestra la información sobre el uso de EFEMemDB
  • keys(): Retorna las claves definidas en los espacios indicados
  • memory(): Muestra la memoria utilizada por las claves de los espacios indicados
  • move(): Mueve claves de un espacio a otro
  • persist(): Guarda o persiste los datos actuales
  • rename(): Cambia el nombre de una clave
  • restore(): Carga o recupera los datos persistidos
  • set(): Guarda una clave en un espacio
  • setConfig(): Crea o modifica un parámetro de configuración
  • spaceInfo(): Muestra la información de un espacio dado
  • spaces(): Retorna la lista de espacios utilizados


Enlaces de interés

Imagen original en pxfuel: https://www.pxfuel.com/en/free-photo-elhvj

domingo, 23 de febrero de 2020

Cómo servir archivos o ficheros desde NodeJS y Express

El uso habitual de Express y NodeJS es la publicación de servicios que respondan con un conjunto de datos, habitualmente en formato JSON.

Pero, ¿cómo podemos responder con un fichero, como un PDF, una imagen o una hoja de cálculo?

La respuesta está en el siguiente código:

const express = require('express');
const path = require('path');
const fs  = require('fs');

const app = express();

app.get('/repository/:file'function (reqres) {
   const filePath = path.join(__dirname, `docs/${req.params.file}`);
   const stat = fs.statSync(filePath);

   res.writeHead(200, {
       'Content-Type''application/pdf',
       'Content-Length'stat.size
   });

   var readStream = fs.createReadStream(filePath);
   
   readStream.pipe(res);
});

app.listen(3000function () {
  console.log('Example app serving files on port 3000!');
});

El servicio atenderá a la siguiente URL:

http://:3000/repository/

La segunda línea, define la ruta de acceso al fichero. En este caso, la ruta será, partiendo de la ruta del código, añadirá la carpeta docs, en la cual se alojan los archivos.

/docs

La tercera línea obtendrá el número de bytes del fichero a enviar.

A continuación, se prepara la cabecera de la respuesta (mediante res.writeHead), indicando que el archivo a enviar será de tipo PDF (atributo Content-Type), junto con el número de bytes que se envía (atributo Content-Length).

Después, se crea un stream de lectura del fichero (mediante createReadStream), al que se le conecta un pipe a la respuesta. Esta operación lee el fichero y envía los datos a la respuesta. Resumiendo, el flujo de lectura del fichero estará conectado al flujo de escritura en la respuesta del servicio.

Enlaces de interés: