Python y El Análisis de Datos
Python y El Análisis de Datos
Introducción
funcional.
En la presente unidad vamos a realizar una introducción a Python y los requisitos necesarios para su
utilización, además vamos a profundizar en las librerías para el análisis de datos en Python.
s
u .e
ed
a.
ov
nn
r oi
eu
s.
lm
u.
si
siu.lms.euroinnova.edu.es
1 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
Objetivos
s
u .e
ed
a.
ov
nn
r oi
eu
s.
lm
u.
si
siu.lms.euroinnova.edu.es
2 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
Mapa Conceptual
s
.e
u
ed
a.
ov
nn
r oi
eu
s.
lm
u.
si
siu.lms.euroinnova.edu.es
3 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
1. Introducción a Python
las cuales requieren identificar variables vitales de sus consumidores para poder ofrecer mejores
servicios a estos. Como hemos visto, conocer las tendencias del mercado y conocer porqué suceden
ciertas situaciones en las empresas son la base para tomar las decisiones correctas.
[[[Elemento Multimedia]]]
s
Python, por ser un lenguaje muy flexible, ofrece herramientas para realizar el procesamiento de
.e
datos de manera muy precisa. Es un lenguaje de programación interpretado multiparadigma, es
u
decir, soporta la programación orientada a objetos, la programación imperativa y, en menor medida,
ed
la programación funcional. Fue creado por Guido Van Rossum, usa tipado dinámico, es
a.
librerías o módulos para hacer casi cualquier cosa. Su filosofía hace hincapié en una sintaxis que
ov
favorezca un código legible, de ahí que la curva de aprendizaje de este lenguaje de programación
Aunque ya hemos hablado prácticamente de todas ellas, a continuación resumimos algunas de las
en lugar de la sintaxis.
u.
Libre y código abierto: Se puede distribuir libremente, leer su código fuente, hacerle
cambios, etc. Esto ha contribuido a que este lenguaje se haya vuelto tan bueno y estable,
Lenguaje de alto nivel: Abstrae el problema de manejo de memoria u otros detalles de bajo
nivel.
Portable: Por ser Open Source, Python ha sido portado a diferentes plataformas. Todos los
programas podrán ejecutarse en alguna de esas plataformas sin requerir cambio alguno. Se
siu.lms.euroinnova.edu.es
4 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
debe, no obstante, ser cuidadoso de evitar las características con dependencia del sistema.
ejecutar el código fuente, internamente Python convierte el código fuente en una forma
ejecutarlo.
reutilizables.
s
Ampliable: Puede ser modificado por la comunidad en el caso de necesitar nuevas funciones o
.e
mejorar las existentes.
u
Librerías extendidas: Python contiene una gran cantidad de librerías, tipos de datos y
ed
funciones incorporadas en el propio lenguaje, que ayudan a realizar muchas tareas comunes
sin necesidad de tener que programarlas desde cero. Estas librerías pueden ayudas a hacer
a.
varias cosas como expresiones regulares, generación de documentos, evaluación de unidades,
ov
pruebas, procesos, bases de datos, navegadores web, CGI, ftp, correo electrónico, XML, XML-
RPC, HTML, archivos WAV, criptografía, GUI, y otras funciones dependientes del sistema.
nn
parte de un programa.
s.
lm
programadores y empresas que lo utilizan. Google por ejemplo, usa Python como uno de sus
u.
principales lenguajes de desarrollo (otros son Java y C++). También Youtube usa Python en sus
si
sistemas de explotación. Industrial Light & Magic (la empresa de efectos especiales de George
[[[Elemento Multimedia]]]
programación. Entre estas herramientas tenemos editores de texto (que nos permiten escribir
siu.lms.euroinnova.edu.es
5 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
depuradores (que ayudan a detectar errores), analizadores de tiempo de ejecución (para estudiar la
eficiencia de los programas), herramientas para la ejecución de pruebas unitarias (para asegurarnos
asegurarnos de que todo el código ha sido puesto a prueba), generadores de documentación (que
analizadores estáticos (que detectan patrones típicos en código erróneo y nos advierten de
s
problemas potenciales), sistemas de control de versiones (que permiten que varios programadores
.e
colaboren en un mismo programa, recuperar cualquier versión del programa, crear ramas de
u
desarrollo en paralelo…), etc.
ed
Los lenguajes interpretados como Python, suelen ofrecer una herramienta de ejecución interactiva.
a.
Con ella es posible dar órdenes directamente al intérprete y obtener una respuesta inmediata para
cada una de ellas. Es decir, no es necesario escribir un programa completo para empezar a obtener
ov
resultados de ejecución, no obstante cuando tenemos mucho código es preferible guardarlo en un
nn
archivo con extensión .py que posteriormente podemos ejecutar desde nuestro intérprete. El entorno
interactivo es de gran ayuda para experimentar con fragmentos de programa antes de incluirlos en
oi
En algunos lenguajes de programación, las variables se pueden entender como “cajas” en las que se
s.
guardan los datos, pero en Python las variables son “etiquetas” que permiten hacer referencia a los
lm
basado en objetos.
Para cada dato que aparece en un programa, Python crea un objeto que lo contiene. Cada objeto
tiene:
Un identificador único (un número entero, distinto para cada objeto). El identificador permite a
Un tipo de dato (entero, decimal, cadena de caracteres, etc.). El tipo de dato permite saber qué
siu.lms.euroinnova.edu.es
6 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
Así, las variables en Python no guardan los datos, sino que son simples nombres para poder hacer
a=2
s
Python:
u .e
Crea el objeto “2”. Ese objeto tendrá un identificador único que se asigna en el momento de la
ed
creación y se conserva a lo largo del programa. En este caso, el objeto creado será de tipo
a.
Asocia el nombre a al objeto número entero 2 creado.
ov
La variable a es como una etiqueta que nos permite hacer referencia al objeto “2”, más cómoda de
nn
Por otro lado, en Python se distingue entre objetos mutables y objetos inmutables:
r
eu
Los objetos inmutables: son objetos que no se pueden modificar. Por ejemplo, los números, las
s.
Los objetos mutables: son objetos que se pueden modificar. Por ejemplo, las listas y los
lm
Las variables en Python se crean cuando se definen por primera vez, es decir, cuando se les asigna
un valor por primera vez. Para asignar un valor a una variable se utiliza el operador de igualdad (=).
siu.lms.euroinnova.edu.es
7 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
En el ejemplo de la imagen anterior, hemos definido la variable de nombre “x” a la que hemos
asignado el valor decimal 2.5. Si escribimos x en el intérprete y pulsamos Enter, éste nos devuelve el
s
.e
valor de la variable definida. En el caso de que intentemos acceder al contenido de una variable que
u
ed
a.
ov
nn
oi
Una variable puede almacenar diferentes tipos de datos, que veremos más adelante, en el caso de
r
que se desee almacenar una cadena texto dentro de una variable debe escribirse entre comillas
eu
simples (‘) o dobles (“), ya que de lo contrario Python supone que estamos haciendo referencia a otra
El nombre de una variable debe empezar por una letra o por un guion bajo (_) y puede seguir como
más letras, números o guiones bajos. Se debe tener en cuenta a la hora de nombrar las variables que
u.
Python distingue entre mayúsculas y minúsculas. Así mismo, el nombre de las variables puede
si
contener cualquier carácter alfabético y guiones bajos, lo que no puede incluir es espacios en
blanco.
Al igual que en otros lenguajes de programación, en Python existen una serie de palabras
reservadas que no pueden usarse como nombres de variables. Estas palabras reservadas son las
siu.lms.euroinnova.edu.es
8 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
Asignaciones aumentadas
Cuando una variable se modifica a partir de su propio valor, se puede utilizar la denominada
s
asignación aumentada, una notación compacta que existe también en otros lenguajes de
.e
programación.
u
Así tendríamos las siguientes asignaciones aumentadas y su equivalente:
ed
Asignación Aumentada Equivalencia
a.
a += b a=a+b ov
a -= b a=a-b
a *= b a=a*b
nn
a /= b a=a/b
a **= b a = a ** b
oi
a //= b a = a // b
a %= b a=a%b
r
eu
Lo que Python no permite son los operadores de incremento (++) o decremento (--) que sí está
En una misma línea se pueden definir de forma simultánea varias variables, con el mismo valor o con
u.
siu.lms.euroinnova.edu.es
9 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
u .e
ed
a.
Si el número de variables no coinciden con el de valores, Python genera un mensaje de error, como
ov
se muestra a continuación:
nn
r oi
eu
s.
lm
u.
si
Antes de ver los diferentes tipos de datos, cabe destacar comentar que existe una función en python
llamada type (tipo) que nos devuelve el tipo de dato del objeto indicado.
siu.lms.euroinnova.edu.es
10 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
u .e
ed
a.
Tipo de dato numérico ov
En python se pueden representar números enteros, reales y complejos.
nn
Enteros: Los números enteros son aquellos que no tienen decimales, tanto positivos como
oi
negativos (además del cero). En python se pueden representar mediante el tipo int (integer) o
el tipo long (largo). La única diferencia es que el tipo long permite almacenar números más
r
eu
grandes. Es aconsejable no utilizar el tipo long a menos que sea necesario, para no malgastar
memoria.
s.
lm
El tipo int de Python se implementa a bajo nivel mediante un tipo long de C, y dado que python
utiliza C por debajo, el rango de los valores que puede representar depende de la plataforma. En la
u.
mayor parte de las máquinas el long de C se almacena utilizando 32 bits, es decir, mediante el uso
si
de una variable de tipo int de Python podemos almacenar número de -231 a 231-1, o lo que es lo
9.223.372.036.854.7754.807.
El tipo long de Python, permite almacenar números de cualquier precisión, limitado por la memoria
disponible en la máquina.
siu.lms.euroinnova.edu.es
11 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
Cuando asignamos un número a una variable, esta pasará a tener tipo int, a menos que el número
sea tan grande como para requerir el uso del tipo long.
Reales: Los números reales son los que tienen decimales. En Python se expresan mediante el
tipo float, que está implementado a bajo nivel mediante una variable de tipo doublé de C, es
decir, utilizando 64 bits, por lo que en Pythin siempre se utiliza doble precisión, en concreto se
sigue el estándar IEEE 754: 1 bit para el signo, 11 para el exponente, y 52 para la mantisa.
Esto significa que los valores que podemos representar van desde ±2,2250738585072020 x
s
.e
10-308 hasta ±1,7976931348623157 x 10308.
u
ed
Debido a las limitaciones, impuesta por el hardware, en lo que respecta al esquema de
representación interna para el tipo de dato Real, desde Python 2.4 contamos también con un nuevo
a.
tipo Decimal, para el caso de que se necesite representar fracciones de forma más precisa.
ov
Para representar un número real en Pyhton, se escribe primero la parte entera, seguido de un punto
nn
y por último la parte decimal. También se puede utilizar notación científica, y añadir una e (de
Complejos: Los números complejos son aquellos que tienen parte imaginaria. La mayor parte
eu
de lenguajes de programación carecen de este tipo, aunque sea muy utilizado por ingenieros y
científicos en general.
s.
lm
En Python estamos ante el tipo de dato complex, también se almacena usando como flotante, debido
u.
a que estos números son una extensión de los números reales. En concreto se almacena en una
estructura de C, compuesta por dos variables de tipo double, sirviendo una de ellas para almacenar
si
siu.lms.euroinnova.edu.es
12 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
u .e
ed
a.
Operadores aritméticos ov
Se tratan de los operadores por defectos para usar con los tipos de datos numéricos definidos. Para
+ Suma de elementos r = 3 + 2 # r es 5
r
- Resta de elementos r = 4 – 7 # r es -3
eu
- Negación r = -7 # r es -7
* Multiplicación r = 2 * 6 # r es 12
s.
** Exponente r = 2 ** 6 # r es 64
lm
Estos operadores actúan sobre las representaciones en binario de los operadores. Por ejemplo, una
operación como 3 & 2, se traduce como un and entre los números binarios 11 y 10 (la
El operador and (&), devuelve 1 si el primer bit operando es 1 y el segundo bit operando es 1. Se
siu.lms.euroinnova.edu.es
13 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
casos devuelve 0.
El operador xor u or exclusivo (^) devuelve 1 si uno de los operandos es 1 y el otro no lo es.
El operador not (~), sirve para negar uno a uno cada bit; es decir si el operando es 0, cambia a 1 y si
es 1, cambia a 0.
Por último, los operadores de desplazamiento (<< y >>) sirven para desplazar los bits n posiciones
s
.e
hacia la izquierda o la derecha
u
Operador Descripción Ejemplo
ed
& and r = 3 & 2 # r es 2
| or r = 3 | 2 # r es 3
a.
^ xor r = 3 ^ 2 # r es 1
~ not R = ~3 # r es -4
ov
<< Desplazamiento izquierda r = 3 << 1 # r es 6
nn
Las cadenas comienzan y terminan con comillas dobles o simples. Dentro de las comillas se pueden
añadir caracteres especiales escapándolos con ‘|’, como ‘\n’, que es el carácter de nueva línea o ‘\t’,
s.
el de tabulación.
lm
Una cadena puede estar precedida por el carácter ‘u’ o el carácter ‘r’, los cuales indican que se trata
u.
de una cadena que utiliza codificación Unicode o Raw respectivamente. Las cadenas raw se
si
distinguen de las normales en que los caracteres escapados mediante una barra invertida ‘\’ no se
sustituyen por sus contrapartidas, lo que es especialmente útil para las expresiones regulares.
Existen diferentes funciones para trabajar con las cadenas, como por ejemplo la función len(), que se
utiliza para contar los caracteres de una cadena. También podemos acceder a los caracteres de una
cadena mediante [], donde el índice de los caracteres de una cadena comienza en 0 si accedemos
También es posible encerrar una cadena entre triple comillas (simples o dobles). De esta forma
siu.lms.euroinnova.edu.es
14 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
podremos escribir el texto en varias líneas, y al imprimir la cadena, se respetarán los saltos de línea
que introdujimos sin tener que recurrir al carácter \n, así como las comillas sin tener que escaparlas.
El módulo string
El módulo string contiene funciones útiles que manipulan cadenas. Es necesario importar el módulo
s
u .e
ed
a.
ov
nn
r oi
eu
Para averiguar más sobre un objeto de la lista, podemos usar el comando type. Para ello se debe
especificar el nombre del módulo seguido por el objeto usando la notación punto.
s.
lm
u.
si
siu.lms.euroinnova.edu.es
15 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
Como vimos en puntos anteriores, un String es una secuencia de caracteres, así, cada uno de ellos
tiene asociada una posición, a la que podemos acceder mediante []. Así por ejemplo si queremos
s
u .e
ed
a.
ov
nn
r oi
siu.lms.euroinnova.edu.es
16 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
u .e
ed
a.
ov
Función upper(): Convierte la cadena de texto en mayúsculas
nn
r oi
eu
s.
lm
u.
si
Función str(): Con esta función podemos hacer “casting” de variables, lo que nos permite
siu.lms.euroinnova.edu.es
17 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
u .e
ed
a.
+ : Sirve para concatenar cadenas ov
nn
r oi
eu
s.
lm
u.
si
%: Nos permite formatear cadenas. Así por ejemplo, el ‘%s’ indica una variable de tipo String
(de ahí la ‘s’), y con el ‘% (cadena)’ estamos especificando que se trata del String ‘cadena’.
siu.lms.euroinnova.edu.es
18 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
u .e
ed
a.
input(): Nos permite leer datos desde teclado
ov
nn
r oi
eu
s.
lm
u.
si
Una variable de tipo booleano puede tener dos valores: True (cierto) y False (falso). Estos valores
Entre los operadores con los que podemos trabajar con el tipo de dato bool, son los llamados
siu.lms.euroinnova.edu.es
19 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
< ¿es a menor que b? r = 5 < 3 # r es False
.e
<= ¿es a menor o igual que b? r = 5 <= 3 # r es False
u
>= ¿es a mayor o igual que b? r = 5 >= 3 # r es True
ed
Tipo de dato Tuplas
a.
Las tuplas son un tipo de recipiente que contiene una serie de valores separados por comas entre
ov
paréntesis. Las tuplas son inmutables (es decir, no pueden cambiar su contenido una vez creadas).
nn
r oi
eu
s.
lm
u.
si
Las tuplas tienen muchos usos. Por ejemplo: pares ordenados (x,y), registros de empleados de una
base de datos, etc. Como hemos definido al principio, las tuplas, al igual que las cadenas, son
inmutables, esto es que no es posible asignar a los ítems individuales de una tupla. También es
posible crear tuplas que contengan objetos mutables como listas (de las que hablaremos más
adelante).
siu.lms.euroinnova.edu.es
20 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
algunas peculiaridades para estos casos. Las tuplas vacías se construyen mediante un par de
paréntesis vacío; una tupla con un ítem se construye poniendo una coma a continuación del valor.
s
u .e
ed
a.
ov
nn
Un conjunto, es una colección no ordenada y sin elementos repetidos. Los usos básicos de éstos
Soportan entre otras, las operaciones matemáticas como la unión, intersección, diferencia, y
s.
diferencia simétrica.
lm
Para crear un conjunto pueden usarse las llaves {} o la función set(). Se debe tener en cuenta que
para crear un conjunto vacío debe usarse set() y no las llaves {}, ya que esto último lo que crearía
u.
siu.lms.euroinnova.edu.es
21 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
u .e
ed
a.
ov
nn
oi
Las listas en Pythom son variables que almacenan arrays, internamente cada posición puede ser un
Una lista se puede escribir como una lista de valores separados por comas y entre corchetes.
lm
Método Descripción
si
siu.lms.euroinnova.edu.es
22 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
.e
List.copy() Devuelva una copia superficial de la lista. Equivale a a[:]
Estos métodos sobre el tipo de dato lista, hacen que resulte muy fácil usar una lista como una pila,
u
donde el último elemento añadido es el primer elemento retirado (último en entrar, primero en
ed
salir). Para agregar un ítem a la cima de la pila usamos append() y para retirar un ítem de la cima
a.
de la pila usamos pop() si índice explícito. ov
También es posible usar una lista como una cola, donde el primer elemento añadido es el primer
elemento que se retira (primero en entrar, primero en salir); sin embargo, las listas no son eficientes
nn
para este propósito. Agregar y sacar del final de la lista es rápido, pero insertar o sacar del comienzo
oi
de una lista es lento (porque el resto de elementos tiene que ser desplazados uno por uno). La mejor
r
opción para implementar una cola es hacer uso de collections.deque, que fue diseñado para sacar y
eu
siu.lms.euroinnova.edu.es
23 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
u .e
ed
a.
ov
nn
oi
Este tipo de dato, define una relación uno a uno entre claves y valores. Los diccionarios a diferencia
eu
de las tuplas, que se indexan mediante un rango numérico, se indexan con claves, que pueden ser
s.
cualquier tipo inmutable; las cadenas y números siempre pueden ser claves. Las tuplas asimismo
pueden usarse como claves si solamente contienen cadenas, número o tuplas; si una tupla contiene
lm
cualquier objeto mutable directa o indirectamente, no puede usarse como clave. No pueden usarse
u.
Podemos por tanto definir el tipo de dato diccionario como un conjunto no ordenado de pares
clave:valor, con el requerimiento de que las claves sean únicas (dentro de un diccionario particular).
Un par de llaves {}, creará un diccionario vacío. Colocar una lista de pares clave:valor separados
por comas entre las llaves añade esos pares iniciales al diccionario.
Las operaciones básicas sobre los diccionarios son guardar un valor con una clave y extraer ese
valor dada la clave. También es posible borrar un par clave:valor con del. Se puede sobreescribir el
siu.lms.euroinnova.edu.es
24 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
El método keys() de un diccionario devuelve una lista de todas las claves en uso para un
determinado diccionario, en un orden arbitrario (si se quieren ordenadas, será necesario usar el
método sort() sobre la lista de claves). Para saber si una clave está en el diccionario utilizamos in.
s
u .e
ed
a.
ov
nn
r oi
eu
s.
lm
u.
si
siu.lms.euroinnova.edu.es
25 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
2. ¿Qué necesitas?
Como ya hemos visto en el punto anterior, Python es multiplataforma, por lo que funciona tanto en
Los archivos de python tienen la extensión .py, son archivos de texto que son interpretados por el
compilador. Para poder ejecutar programas en Python, necesitamos en primer lugar el intérprete de
s
.e
Se debe tener en cuenta que Python es “case sensitive” lo que quiere decir que diferencia entre
u
mayúsculas y minúsculas.
ed
Sin retroceder a la pestaña anterior, aclara si la siguiente afirmación es
a.
verdadera o falsa: "Los archivos de python tienen la extensión .py, son archivos de
ov
texto que son interpretados por el compilador. Para poder ejecutar programas en
Python, necesitamos en primer lugar el código que queremos ejecutar y en
segundo lugar el intérprete de Python"
nn
Respuesta correcta
r oi
Respuesta incorrecta
eu
s.
lm
2.1. Instalación
u.
Para empezar a trabajar con Python en un entorno de Big Data y Business Intelligence, instalaremos
si
una distribución gratuita llamada Anaconda, que pese a estar disponible solo en inglés, incluye
multitud de utilidades que facilitarán el trabajo y es ideal para empezar en este entorno. Para
instalarla simplemente tendremos que descargar la versión de Anaconda según el sistema operativo
siu.lms.euroinnova.edu.es
26 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
u .e
ed
a.
ov
nn
siu.lms.euroinnova.edu.es
27 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
u .e
ed
a.
ov
nn
Dejamos las opciones marcadas por defecto, ya que son clave para que el sistema pueda invocar a
siu.lms.euroinnova.edu.es
28 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
.e
u
ed
a.
ov
nn
r oi
eu
s.
lm
u.
si
siu.lms.euroinnova.edu.es
29 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
u .e
ed
a.
ov
nn
r oi
eu
s.
lm
u.
si
Tras estos sencillos pasos ya tendremos instalado la versión de Anaconda en nuestro ordenador.
siu.lms.euroinnova.edu.es
30 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
Spyder
s
u .e
ed
a.
ov
Spyder es un entorno de desarrollo en Python, orientado a científicos y con características similares
nn
a MATLAB:
oi
Visualizador de sys.path.
Autocompletado.
Navegador de clases/funciones.
si
Análisis de código.
Autocompletado de código.
IPython
siu.lms.euroinnova.edu.es
31 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
u .e
ed
IPython es un Shell interactivo que añade funcionalidades extra al modo interactivo incluido con
Python, como resaltado de líneas y errores mediante colores, una sintaxis adicional para el Shell,
a.
autocompletado mediante tabulador de variables, módulos y atributos; entre otras funcionalidades.
ov
Actualmente multitud de paquetes utilizan IPython como librería o como intérprete interactivo. Es
nn
multiplataforma, software libre, y debido a la gran comunidad que tiene detrás, está en constante
Autocompletado: El autocompletado es una característica muy útil para no que tener que
si
escribir un código y también, por ejemplo, para inspeccionar objetos rápidamente. Se activa
con la tecla Tab. Funciona tanto con opciones instaladas como con variables definidas propias.
Historial: El historial es una manera de recuperar resultados antiguos que no hemos guardado
en una variable. Como las entradas en IPython están numeradas, no hay más que hacer
siu.lms.euroinnova.edu.es
32 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
u .e
ed
a.
Ayuda: La ayuda de IPython nos permite leer la documentación de objetos, funciones, etc., así
ov
como el código fuente donde se definieron. Se invoca utilizando el signo de interrogación ?.
nn
siu.lms.euroinnova.edu.es
33 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
u .e
ed
a.
ov
nn
r oi
eu
s.
lm
También podemos pedir ayuda de cualquier función o método de IPython de forma similar, por
continuación:
si
siu.lms.euroinnova.edu.es
34 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
Otra forma de llamar a la ayuda rápida de IPython sería con el comando %quickref:
s
u .e
ed
a.
ov
Guardar, editar, cargar: Con IPython también podemos guardar, editar y ejecutar archivos.
De esta forma, podemos aprovechar las ventajas del modo interactivo para llevar un registro de
nn
nuestros progresos.
oi
La función %save recibe como argumentos el nombre del archivo que queremos y las
eu
Carpetas y consola: Podemos navegar en las carpetas con el comando ‘cd’ de la siguiente
si
forma:
siu.lms.euroinnova.edu.es
35 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
u .e
ed
a.
Sin embargo, la política de IPython es que el lenguaje esté primero, por lo cual ‘cd’ puede asignarse
ov
como nombre de una variable lo que provocará que no podamos usar ‘cd’ como comando.
nn
r oi
eu
s.
lm
u.
si
siu.lms.euroinnova.edu.es
36 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
u .e
ed
a.
ov
Otros comando: IPython cuenta con otros comandos especiales:
siu.lms.euroinnova.edu.es
37 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
u .e
ed
a.
ov
ls: Podemos saber que archivos y carpetas hay en la carpeta actual
nn
r oi
eu
s.
lm
u.
si
siu.lms.euroinnova.edu.es
38 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
Jupyter Notebook
s
u .e
ed
a.
ov
nn
r oi
eu
s.
El proyecto Jupyter Notebook, antes conocido como IPython Notebook, proporciona una aplicación
lm
Web que nos permite crear y compartir documentos que contienen código vivo, ecuaciones, textos,
que, por ejemplo, se pueden incluir gráficas que ayuden en el análisis y explicación de los datos. Se
si
Desde la página de inicio de Jupyter Notebook, mostrada en la imagen anterior, se pueden o bien
crear cuadernos nuevos o abrir los existentes. Si hacemos clic en el botón NEW à Notebooks à
siu.lms.euroinnova.edu.es
39 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
u .e
ed
a.
ov
nn
r oi
El área marcada con el mensaje In[]: es el área de entrada y ahí se puede escribir cualquier código
eu
Python válido, que se ejecutará cuando se presione Shift+Enter o se haga clic en el icono de Play (el
s.
Con la tecla Enter normal podremos escribir varías líneas, y con Alt+Enter, pasaremos a un nuevo
bloque. El orden en que se ejecuten las líneas influye en los resultados. Se puede ejecutar todo de
u.
nuevo haciendo click en Cell à Run All. De esta forma todos los cálculos se reiniciarán, permitiendo
si
de una forma muy cómoda hacer modificaciones en los datos iniciales y ejecutar de nuevo todo el
proceso.
siu.lms.euroinnova.edu.es
40 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
u .e
ed
a.
ov
nn
r oi
eu
Nombre del Notebook: Se puede cambiar el nombre haciendo click directamente sobre él. La
Menú: Es el menú de navegación en donde se tienen diferentes opciones para llevar a cabo
con el Notebook
Kernel: Es el nombre del kernel con el que trabaja el notebook actual. Se puede cambiar el
siu.lms.euroinnova.edu.es
41 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
Barra de herramientas: Contiene los iconos para las acciones más comunes.
Jupyter QTConsole
s
u .e
ed
a.
ov
nn
r oi
eu
s.
La consola QT es una aplicación muy ligera que se asemeja en gran medida a un terminal, pero
ofrece una serie de mejoras en una única interfaz gráfica de usuario, tales como figuras en línea,
lm
La consola QT puede usarse con cualquier kernel de Jupyter. Una de las características más
si
interesantes que ofrece la consola QT es, como ya hemos hablado, la posibilidad de incrustar figuras
en línea, éstas pueden representarse con matploit en IPython , o la biblioteca plotting elegida en el
kernel seleccionado.
siu.lms.euroinnova.edu.es
42 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
.e
u
ed
a.
ov
nn
r oi
eu
s.
lm
u.
si
siu.lms.euroinnova.edu.es
43 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
Una de las grandes ventajas que ofrece Python sobre otros lenguajes de programación, es lo grande
con una gran variedad de librerías de primer nivel que extienden las funcionalidades del lenguaje.
Gracias a una serie de librerías que veremos a lo largo del presente punto, Python se utiliza
habitualmente para el cálculo estadístico y la visualización gráfica de los datos para extraer
s
conclusiones y tomar decisiones. Pero lo que hace interesante a Python es que no simplemente un
.e
lenguaje que permite visualizar datos, sino que también tiene una gran capacidad para automatizar
u
procesos, extraer datos o usarlo para aprendizaje automático. Con Python, podremos cambiar
ed
grandes grupos de datos a través de programación sencilla y simplificar la utilización de las APIs
a.
para capturar datos y extraer información.
ov
3.1. Cálculos matemáticos y estadísticos con Numpy y Pandas
nn
Los cálculos matemáticos y estadísticos están íntimamente relacionados con el análisis de datos y la
oi
En Python, existen varias librerías que nos pueden ayudar en estos cálculos, dos de ellas son Numpy
s.
y Pandas, cada una de las cuales está orientada a trabajar con los datos de una manera concreta a
lm
través de las funciones que implementan y que definiremos en mayor profundidad a lo largo del
presente punto.
u.
si
Numpy
Como cualquier otra librería de Python, cuenta con un sitio oficial, a través del cual se generan
actualizaciones y documentación, así como tutoriales relacionados con el uso de las funciones que
Numpy, está pensada fundamentalmente para a computación científica, por lo que implementa
funciones para el manejo de vectores y matrices, así como de algebra linear. Otra característica
resaltable de este módulo, es que permite incorporar código fuente de otros lenguajes programación
siu.lms.euroinnova.edu.es
44 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
Antes de comenzar a trabajar con las funcionalidades ofrecidas por esta librería, debemos
presente unidad didáctica, a partir de su versión 4.2.0 ya se incluye por defecto alrededor de 100 de
paquetes relacionados con el testeo y análisis de datos en Python, entre los que se encuentra la
s
librería Numpy, por tanto si nuestra versión se corresponde con esta o alguna posterior ya lo
.e
tendremos instalado.
u
ed
No obstante, para comprobar si tenemos Numpy integrado basta con abrir un terminal (Anaconda
a.
ov
nn
r oi
eu
s.
lm
u.
si
Si tras la ejecución de la línea “import numpy as np” no nos aparece ningún error en el terminal es
porque tenemos la librería instalada, en caso contrario debemos proceder a su instalación. Por otro
lado, cuando importamos la librería para usar sus funciones dentro de nuestro código, nótese que
creamos una especie de “alias” y la renombramos como np (notación que generalmente se usa por
convenio), con la finalidad de no tener que escribir el nombre completo de la librería cada vez que
Otra forma de comprobar si tenemos no solo esta librería sino cualquier otro paquete de nuestro
siu.lms.euroinnova.edu.es
45 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
interés, instalado para Python en nuestra versión de Anaconda, sería ejecutar en una consola de
conda list
Esto nos devuelve una lista con todos los paquetes y sus versiones que tenemos instalados. A
s
u .e
ed
a.
ov
nn
r oi
eu
s.
lm
u.
si
Como se aprecia en la imagen anterior, nos aparecen por orden alfabético todos los paquetes que
tenemos instalados.
Por último, también podríamos comprobar si tenemos instalado un paquete concreto si ejecutamos
siu.lms.euroinnova.edu.es
46 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
Lo que nos dará como resultado información referente al paquete que estamos buscando en el caso
s
u .e
ed
a.
ov
nn
r oi
eu
s.
lm
u.
si
Si, por el contrario, no tenemos el paquete necesario instalado podemos desde un mismo terminal
siu.lms.euroinnova.edu.es
47 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
u .e
ed
a.
Igualmente, como se observa en la imagen anterior, cuando intentamos instalar un paquete que ya
ov
existe, se mostrará información de este paquete, así como la posibilidad de actualizarlo en el caso de
Como decíamos unas líneas más arriba, Numpy trabaja dentro del ámbito de la computación
oi
científica, en este espacio es muy común tener los datos en archivos escrito en código ASCII o en
r
formato de texto plano, para ello dentro de este módulo de Python, se incorporan varias funciones
eu
que nos permiten la lectura y escritura de estos archivos, facilitando así su manejo. Mostramos a
loadtxt: Es la función usada con más frecuencia para cargar datos en forma matricial. El único
argumento obligatorio es un nombre de archivo desde el que leer los datos. La función leerá
u.
todas las líneas (podemos indicarle que se salte las n primeras con el argumento skiprows),
si
excepto las que empiezan por # (podemos modificar esto utilizando el argumento comments).
Se presupone que los datos a partir de los que crear la matriz están separados por comas (se
de tipo float (también podemos asignar un nuevo tipo mediante el argumento dtype).
siu.lms.euroinnova.edu.es
48 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
load: Esta función nos permite cargar datos que estén en el formato comprimido utilizado por
fromfile: En este caso la función nos permite leer aquellos datos que se encuentren en un
s
fichero con formato binario.
u .e
La sintaxis completa definida para esta función es:
ed
numpy.fromfile(file, dtype=float, count=-1, sep='')
a.
genfromtxt: El uso de esta función es muy similar al de loadtxt, ya que permite también la
ov
carga de datos desde un archivo de texto, pero en este caso genfromtxt nos permite la lectura
de documentos mal formateados o a los que les faltan valores en los datos.
nn
invalid_raise=True, max_rows=None)
lm
Al igual que Numpy nos permite la lectura de datos a partir de archivos, es lógico que tenga
implementada la opción contraria, la de escritura de nuestros datos en ficheros de texto. Para ello se
u.
implementa la función savetxt que de entre todos los argumentos de la que puede ir acompañada
si
sólo dos de ellos son obligatorios: el nombre del archivo y el array que se va a guardar. La sintaxis
Para la creación de arrays a partir de Numpy podemos optar por cuatro formas distintas:
siu.lms.euroinnova.edu.es
49 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
Leyendo los datos desde un fichero como ya hemos visto en el punto anterior.
lo que se consigue a través de los métodos y funciones de la clase ndarray que implementa. A
s
continuación, mostramos un resumen de algunas de las funciones de esta clase.
.e
Atributo Descripción
u
ndim Devuelve el número de dimensiones del array
ed
shape Devuelve la dimensión del array, es decir, una tupla de enteros indicando el tamaño del
array en cada dimensión.
a.
size Proporciona el número total de elementos del array
dtype Es un objeto que describe el tipo de elementos del array
ov
itemsize Devuelve el tamaño en bytes del array
data El buffer contiene los elementos actuales del array.
nn
Entre las funciones para crear arrays, y dependiendo de las necesidades que demande el problema a
oi
Atributo Descripción
eu
siu.lms.euroinnova.edu.es
50 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
u .e
ed
a.
ov
nn
r oi
eu
s.
lm
u.
si
siu.lms.euroinnova.edu.es
51 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
u .e
ed
a.
ov
nn
r oi
eu
Los objetos matriz son un subtipo de array bidimensional de Numpy (ndarray), y por tanto heredan
lm
todos los atributos y métodos de ndarry. La mayor ventaja que presentan las matrices es que
elemento a elemento de los arrays. Un ejemplo de esta diferencia en el producto, lo podemos ver a
si
continuación:
siu.lms.euroinnova.edu.es
52 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
u .e
ed
a.
ov
nn
Como se observa en la imagen anterior, el resultado de multiplicar una matriz definida como un
array bidimensional o como un objeto matriz es diferente, esto es debido a lo que explicábamos unas
oi
líneas más arriba, la forma en que se implementa el producto en cada una de las clases es diferente.
r
Mientras que el producto de arrays multiplica uno a uno los elementos, en matrix el producto es el
eu
A parte del producto, dentro de la clase matrix, podemos hacer uso de todas las funciones del
lm
siu.lms.euroinnova.edu.es
53 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
u .e
ed
a.
ov
nn
Con el paquete linalg podemos calcular el determinante (det), resolver ecuaciones lineales (solve) y
oi
siu.lms.euroinnova.edu.es
54 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
Entre los recursos del módulo dispone de un enlace a una lista de todas las funciones del algebra
Polinomios en Numpy
Como hemos visto hasta ahora Numpy nos permite hacer cálculos de álgebra lineal, para lo que
dispone también de una clase para trabajar con polinomios (numpy.polynomial). Entre los recursos
del módulo encontrará un enlace a todos los objetos más usuales definidos en esta clase. Mostramos
s
a continuación algunos ejemplos de uso.
u .e
ed
a.
ov
nn
r oi
eu
s.
lm
u.
si
Concepto de Broadcasting
Broaadcasting es un mecanismo muy potente que permite a numpy trabajar con arrays de diferentes
dimensiones. Así, si los objetos con los que estamos operando no tienen las mismas dimensiones,
Para llevar a cabo este mecanismo, Numpy alinea los arrays a la derecha y empieza a comprar las
siu.lms.euroinnova.edu.es
55 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
dimensiones por el final. Si son todas compatibles realiza la operación, y si no lanza un error.
Entendemos que dos dimensiones son compatibles si se cumple una de las dos condiciones
siguientes:
Son iguales, 0.
Una de ellas es 1.
Si los objetos no tienen las mismas dimensiones, pero son compatibles, se asume que las restantes
s
.e
son 1 en el array de menor dimensión. Vamos a ver esto mejor con algunos ejemplos.
u
ed
a.
ov
nn
r oi
eu
s.
lm
u.
si
siu.lms.euroinnova.edu.es
56 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
A continuación, se muestran ejemplos de código Python que utiliza Pandas. El código se ejecuta en
import numpy as np
s
.e
a = np.array([1,2,3])
u
print (a)
ed
# más de una dimensión
a.
ov
import numpy as np
nn
print (a)
r oi
import numpy as np
s.
print (a)
u.
si
siu.lms.euroinnova.edu.es
57 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
.e
u
ed
a.
ov
nn
import numpy as np
r
eu
x = np.arange(5)
s.
print (x)
lm
import numpy as np
si
# dtype set
print (x)
import numpy as np
siu.lms.euroinnova.edu.es
58 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
x = np.arange(10,20,2)
print (x)
s
.e
u
ed
a.
ov
nn
r oi
eu
import numpy as np
lm
a = np.array([[1,2,3],[4,5,6]])
u.
print (a.shape)
si
# Redimensionar el array
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
a.shape = (3,2)
print (a)
siu.lms.euroinnova.edu.es
59 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
# Remodelar el array
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
b = a.reshape(3,2)
print (b)
s
.e
u
ed
a.
ov
nn
r oi
eu
s.
lm
u.
import numpy as np
a = np.arange(0,60,5)
a = a.reshape(3,4)
print (a)
siu.lms.euroinnova.edu.es
60 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
print ('\n')
for x in np.nditer(a):
print (x)
s
.e
u
ed
a.
ov
nn
r oi
eu
s.
lm
import numpy as np
si
a = np.arange(0,60,5)
a = a.reshape(3,4)
print (a)
print ('\n')
siu.lms.euroinnova.edu.es
61 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
b = a.T
print (b)
print ('\n')
s
.e
c = b.copy(order = 'C')
u
print (c)
ed
for x in np.nditer(c):
a.
print (x,)
ov
print ('\n')
nn
c = b.copy(order = 'F')
r
eu
print (c)
s.
for x in np.nditer(c):
lm
print (x,)
u.
si
siu.lms.euroinnova.edu.es
62 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
u .e
ed
a.
ov
nn
r oi
eu
s.
Pandas
lm
Pandas es una librería que aporta a Python unas estructuras de datos fáciles de usar y muy flexibles,
u.
que permiten trabajar con la información de forma muy eficiente. Además, implementa un gran
si
Como cualquier otra librería de Python, cuenta con una página oficial desde donde se puede
En concreto, esta librería relacionada con la analítica de datos, funciona especialmente bien cuando
hay que trabajar con datos heterogéneos, series temporales o con grandes volúmenes de datos, pues
siu.lms.euroinnova.edu.es
63 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
Como se comentaba al comienzo, Pandas dispone de unas estructuras de datos muy flexibles con las
que trabajar. Vamos a comentar dos de ellas que serán de utilidad para el análisis de datos.
Series
Estamos ante la estructura de datos más simple que ofrece Pandas, se trata de arrays
unidimensionales con indexación, similar a los diccionarios, de hecho, pueden generarse a partir de
diccionarios o listas.
s
.e
Por tanto, las series nos permiten almacenar arrays o vectores con índice o etiqueta. Si no se asigna
u
una etiqueta o índice, se numerará con un índice de forma interna.
ed
Un objeto definido como una Serie, tiene dos componentes:
a.
ov
Índice
Vector de datos
nn
Internamente, ambos componentes son listas con la misma longitud, de manera que el primer
oi
elemento de la lista de índices se corresponde con el primer elemento de lista de datos y así de
r
eu
forma sucesiva. La lista de índices debe tener por lo general, valores únicos y ordenados pues se
O lo que es lo mismo:
1 Alfonso
siu.lms.euroinnova.edu.es
64 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
2 Clara
3 María
4 Víctor
5 Germán
Dataframes
Son estructuras de datos que crean objetos similares a una tabla de bases de datos relacional. Un
objeto de la clase DataFrame se construye a partir de un objeto de tipo Series, ya que en cada
s
columna de la tabla tenemos un objeto Series que comparten un único índice (lo que sería la clave
.e
principal en una base de datos).
u
ed
Para crear un objeto DataFrame, se puede hacer a partir de listas, diccionarios, diccionarios de
listas o de Series, y podemos especificar tanto el nombre de las filas (index) como de las columnas
a.
(columns). ov
De forma visual, la estructura del tipo de dato DataFrame sería de la forma:
nn
r oi
eu
s.
lm
u.
si
O lo que es lo mismo:
A B C
1 Alfonso Granada Ingeniero
siu.lms.euroinnova.edu.es
65 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
De nuevo, antes de comenzar a trabajar con las funcionalidades que ofrece esta librería de Python,
s
reciente de Anaconda, de nuevo la librería estará instalada por defecto. Podemos comprobarlo
.e
siguiendo los mismos pasos que para la librería Numpy tanto para ver si está instalada como para
u
llevar a cabo su instalación en caso contrario.
ed
Igual que por convenio (de la comunidad de desarrolladores) para la librería Numpy siempre
a.
escribimos el alias np, para Pandas se pone pd como alias.
ov
Extracción y filtrado de datos
nn
Para seleccionar y extraer aquellos datos que nos interesan en un determinado momento, y que
loc : Se utiliza para seleccionar datos a partir de las etiquetas de las filas y las columnas
s.
iloc: Se utiliza para seleccionar datos a partir de la posición de los mismos dentro de la estructura
lm
de datos.
ix: Se utiliza para seleccionar datos tanto a partir de las etiquetas como de la posición de los datos.
u.
si
Cuando trabajemos con Series, los métodos anteriores nos devolverán un único valor, y en el caso de
trabajar con DataFrames puede devolverse tanto una Serie (si sólo indicamos la posición de la fila), o
siu.lms.euroinnova.edu.es
66 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
u .e
ed
a.
ov
nn
r oi
eu
s.
lm
u.
si
Como hemos visto, con los métodos anteriores podemos seleccionar aquellos datos que nos interesan
gracias a la indexación, pero puede también resultar de utilidad el filtrado de los datos, es decir
seleccionar los elementos que cumplan una determinada condición. Para esto, podemos hacer uso de
los filtros booleanos, que permiten la comparación con un valor de referencia. Veamos algunos
ejemplos.
siu.lms.euroinnova.edu.es
67 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
u .e
ed
a.
Visualización de los datos ov
Para ver y explorar los datos con Pandas, podemos usar entre otros los siguientes métodos:
nn
describe: Imprime una tabla resumen de datos estadísticos sobre los valores, como mínimo,
head y tail: Muestran las primeras y últimas ‘x’ filas respectivamente de una tabla, en función del
eu
Se deja como ejercicio que el alumno pruebe los métodos descritos mediante un ejemplo concreto de
si
DataFrame.
Datos NAN
Como hemos comprado, en alguno de los ejemplos anteriores, se nos muestra el tipo de dato NAN
para algunos valores de los objetos creados. Pandas, hace uso de numpy.nan para representar datos
faltantes, es decir, aquellos valores nulos o que aún no se han definido. Se deben tener en
consideración estos valores, ya que algunas operaciones tratan de una forma especial este valor, así
por ejemplo las operaciones aritméticas consideran que NAN = 0, mientras que count (que nos
siu.lms.euroinnova.edu.es
68 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
Existen definidas algunas funciones para trabajar con este tipo de datos, que nos permiten entre
isnull: Devuelve una tabla con valores true o false en función si el valor es nan o no para un
determinado campo.
s
.e
fillna(val): Cambia los valores de nan por el contenido de val.
u
Lectura/escritura de archivos
ed
Pandas dispone de un conjunto muy completo de funciones de lectura y escritura de datos desde
a.
archivos. Soporta formatos como CVS, XLS y bases de datos como MySQL.
ov
Para esto Panda implementa la función read (para lectura de archivos) y to (para escritura).
nn
import pandas as pd
s.
import numpy as np
lm
data = np.array(['a','b','c','d'])
u.
s = pd.Series(data)
si
print (s)
import pandas as pd
import numpy as np
data = np.array(['a','b','c','d'])
siu.lms.euroinnova.edu.es
69 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s = pd.Series(data,index=[100,101,102,103])
print (a)
import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
s
.e
# Recuperamos el primer elemento
u
print (s[0])
ed
# Acceder a la serie por índice o etiqueta
a.
import pandas as pd
ov
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
nn
print (s['a'])
r
eu
print (s[['a','c','d']])
lm
u.
si
siu.lms.euroinnova.edu.es
70 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
.e
u
ed
a.
ov
nn
r oi
eu
s.
import pandas as pd
u.
df = pd.DataFrame()
si
print (df)
data = [1,2,3,4,5]
df = pd.DataFrame(data)
print (df)
siu.lms.euroinnova.edu.es
71 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
import pandas as pd
data = [['Alex',10],['Bob',12],['Clarke',13]]
df = pd.DataFrame(data,columns=['Name','Age'])
print (df)
s
.e
# Crear un DataFrame indexado a partir de un array
u
import pandas as pd
ed
data = {'Name':['Tom', 'Jack', 'Steve', 'Ricky'],'Age':[28,34,29,42]}
a.
df = pd.DataFrame(data, index=['rank1','rank2','rank3','rank4'])
ov
print (df)
nn
r oi
eu
s.
lm
u.
si
siu.lms.euroinnova.edu.es
72 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
.e
u
ed
a.
ov
nn
r oi
eu
s.
import pandas as pd
u.
df = pd.DataFrame(d)
import pandas as pd
siu.lms.euroinnova.edu.es
73 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
df = pd.DataFrame(d)
print (df.loc['b'])
s
.e
import pandas as pd
u
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
ed
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
a.
df = pd.DataFrame(d)
ov
print (df.iloc[2])
nn
r oi
eu
s.
lm
u.
si
siu.lms.euroinnova.edu.es
74 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
.e
u
ed
a.
ov
nn
r oi
eu
import pandas as pd
lm
df = pd.DataFrame(d)
print (df)
siu.lms.euroinnova.edu.es
75 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
del df['one']
print (df)
s
.e
df.pop('two')
u
print (df)
ed
a.
ov
nn
r oi
eu
s.
lm
u.
si
import pandas as pd
siu.lms.euroinnova.edu.es
76 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
df = pd.DataFrame(d)
print (df[2:4])
# Unir filas
s
.e
import pandas as pd
u
df = pd.DataFrame([[1, 2], [3, 4]], columns = ['a','b'])
ed
df2 = pd.DataFrame([[5, 6], [7, 8]], columns = ['a','b'])
a.
df = df.append(df2)
ov
print (df)
nn
# Eliminar filas de un df
oi
import pandas as pd
r
eu
df = df.append(df2)
u.
df = df.drop(0)
print (df)
siu.lms.euroinnova.edu.es
77 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
u .e
ed
a.
ov
nn
r oi
eu
s.
desarrolla técnicas mediante la implementación de una serie de algoritmos, que permiten aprender a
fin de encontrar y reconocer patrones a partir de una información facilitada como ejemplo.
Estos algoritmos de aprendizaje automático (que van desde redes bayesanas, redes neuronales
artificiales, árboles de decisión, etc.), nos van a permitir por tanto ser capaces de “predecir” el
siu.lms.euroinnova.edu.es
78 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
Scikit-learn
Podemos decir que es una de las principales librerías que existen para trabajar con Machine
Learning, entre sus ventajas podemos resaltar que se pueden extraer datos de varios repositorios y
además cuenta con ciertas bases de datos de muestra que ayudan con la práctica en el uso de los
s
Estamos ante una librería que se centra en el modelado de los datos y no en su manipulación, ya que
.e
para esto contamos con Numpy y Pandas. Por otro lado, tiene implementados tanto algoritmo de
u
aprendizaje supervisado como no supervisado, por lo que podemos utilizarla para clasificaciones,
ed
extracción de características, regresiones, agrupaciones, reducción de dimensiones, selección de
modelos o preprocesamiento.
a.
ov
Para comprobar si disponemos de esta librería en nuestro entorno de programación e instalarla en
caso de que no sea así, seguiremos los mismos pasos descritos líneas más arriba para la instalación
nn
de paquetes en Python.
oi
Como cualquier otra librería de Python, tiene una gran comunidad detrás que se encarga de
eu
implementar nuevas funcionalidades, así como actualizar las que ya tiene, por lo que en el momento
s.
de trabajar con scikit-learn lo mejor es revisar antes su sitio oficial y comprobar qué algoritmos tiene
lm
implementados.
u.
Clasificación
Regresión
Clustering
Preprocesamiento
Reducción de la dimensionalidad
siu.lms.euroinnova.edu.es
79 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
iris = load_iris()
X = iris.data
s
y = iris.target
u .e
feature_names = iris.feature_names
ed
target_names = iris.target_names
a.
print("Feature names:", feature_names)
ov
print("Target names:", target_names)
nn
siu.lms.euroinnova.edu.es
80 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
iris = load_iris()
s
.e
X = iris.data
u
y = iris.target
ed
from sklearn.model_selection import train_test_split
a.
X_train, X_test, y_train, y_test = train_test_split(
ov
X, y, test_size = 0.3, random_state = 1)
nn
print(X_train.shape)
r
eu
print(X_test.shape)
s.
print(y_train.shape)
lm
print(y_test.shape)
u.
si
siu.lms.euroinnova.edu.es
81 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
u .e
ed
a.
ov
nn
iris = load_iris()
eu
X = iris.data
s.
y = iris.target
lm
classifier_knn = KNeighborsClassifier(n_neighbors = 3)
siu.lms.euroinnova.edu.es
82 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
classifier_knn.fit(X_train, y_train)
y_pred = classifier_knn.predict(X_test)
value(y_pred)
s
# Providing sample data and the model will make prediction out of that data
.e
sample = [[5, 5, 3, 2], [2, 4, 3, 5]]
u
ed
preds = classifier_knn.predict(sample)
a.
pred_species = [iris.target_names[p] for p in preds]ov
print("Predicciones:", pred_species)
nn
r oi
eu
s.
lm
u.
si
siu.lms.euroinnova.edu.es
83 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
Python dispone de una gran cantidad de módulos para la representación y visualización de los datos,
pero será objeto de estudio el módulo Matplotlib (que permite la creación de gráficos en 2D y 3D)
pues tiene implementada la librería pyplot muy semejante a Matlab, y que nos permitirá una muy
Matplotlib, se integra a la perfección con los módulos descritos hasta el momento para el análisis de
datos, puesto que está implementada y orientada a la generación de gráficos a partir de datos
s
.e
Una vez instalado el módulo (de nuevo siguiendo los pasos descritos en puntos anteriores), para
u
poder usar sus funcionalidades debemos importarlo. Como alias utilizaremos en este caso plt.
ed
Tipos de gráficos con pyplot
a.
Dentro de pyplot disponemos de diferentes tipos de gráficos, aunque los más usuales son:
ov
Gráfico (clásico) de datos 2D: Usamos la función plot
nn
Cuando trabajamos con pyplot se puede hacer de dos formas, en modo interactivo, de manera que
lm
cada vez que modificamos el código relacionado con el gráfico éste se actualiza, o en modo no
interactivo para lo que tendremos que llamar a la función show() o draw() para mostrar el gráfico
u.
modificado. Para conmutar de un modo a otro, podemos usar ion() e ioff(), que permiten activar y
si
desactivar respectivamente el modo interactivo. Para comprobar si está activo el modo interactivo
siu.lms.euroinnova.edu.es
84 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
u .e
ed
a.
Como se aprecia en la imagen anterior, al tener el modo interactivo desactivado (por defecto), hasta
que llamamos a la función show() no se nos muestra el gráfico, el cual nos aparece en una ventana
ov
externa que nos permitirá entre cosas guardar el gráfico como imagen para usarlo después en
nn
Como vemos en la imagen anterior, al activar el modo interactivo no es necesario llamar a ninguna
función adicional para mostrar el gráfico, además de que la consola nos permite seguir
introduciendo código sin necesidad de cerrar la ventana del gráfico, lo que facilita la visualización
siu.lms.euroinnova.edu.es
85 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
Sobreesribiendo gráficos
Una función muy llamativa de pyplot, es que nos permite dibujar varias gráficas en un mismo
gráfico. Por defecto la opción de sobreescribir en mismo gráfico viene activada al iniciar sesión, pero
podemos de nuevo cambiar esta opción, para lo que tenemos las funciones hold() e ishold(). Si
ishold() es false, solo se conservará la última gráfica dibujada, es decir el último plot() que se
s
u .e
ed
a.
ov
nn
r oi
eu
En la imagen anterior, podemos observar que ishold() nos devuelve true, por lo que ambas gráficas
A la representación gráfica que se nos abre en una nueva ventana cuando trabajamos con las
u.
opciones gráficas de pyplot, se le llama figura. Por defecto, el nombre será “Figure#’, ya que las
si
Con la función figure, podemos modificar algunas características de la ventana de gráfico, como el
nombre, tamaño, resolución, etc. Los argumentos que admite la función son:
Argumento Descripción
num = None Numeración de la figura, si num=None las figuras se numeran
automáticamente
figsize = (w,h) W,h tuplas en pulgadas. Define el tamaño de la figura
dpi = x Establece la resolución de la imagen en puntos por pulgada
siu.lms.euroinnova.edu.es
86 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
de recursos para no tener que modificarlos constantemente, ya que lo que cambiaremos con
Pyplot, permite también agregar texto dentro de una figura, para por ejemplo dar nombre a los ejes,
s
un título al gráfico, etc. Para ello se implementan entre otras, las siguientes funciones:
u .e
title(“Nombre del gráfico”): Nos permite dar un título al gráfico representado
ed
xlabel(“Nombre al eje x”): Nos permite dar un título al eje x del gráfico
ylabel(Nombre al eje y”): Nos permite dar un título al eje y del gráfico
a.
ov
Igualmente, podemos incluir la leyenda del gráfico mediante la función legend(). Para usar esta
función, se debe tener en cuenta que previamente hemos debido definir el argumento “label” de la
nn
función de dibujo (por ejemplo en plot()) para establecer el literal de la leyenda a mostrar. Así
oi
mismo, la función legend(), tiene un argumento (loc) que nos permite posicionar la leyenda en
diferentes puntos entorno al gráfico, cuando asignamos algunos de los siguientes valores o una
r
eu
En el ejemplo mostrado en la imagen anterior, hemos dibujado un gráfico al que después hemos
siu.lms.euroinnova.edu.es
87 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
Ahora vamos a crear dos ventanas independientes en las que mostrar gráficos, en cada una de ellas
definiremos una serie de características para las gráficas que contenga, e incluiremos la leyenda.
s
u .e
ed
a.
ov
nn
r oi
eu
s.
lm
u.
si
siu.lms.euroinnova.edu.es
88 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
.e
u
ed
a.
ov
nn
r oi
eu
s.
lm
u.
si
siu.lms.euroinnova.edu.es
89 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
Si en lugar de superponer gráficos en una misma figura, queremos crear gráficos independientes
pero que se nos muestren en la misma ventana, podemos hacer uso del comando subplot(). Esta
función nos permite dividir el área de dibujo por filas y columnas de manera que luego podemos
s
u .e
ed
a.
ov
nn
r oi
eu
s.
lm
u.
si
siu.lms.euroinnova.edu.es
90 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
Podemos establecer diferentes estilos, marcadores y colores para las líneas de un gráfico mediante
s
marker • +, cruz
.e
• ., punto
• o, círculo
u
• *, estrella
ed
• p, pentágonos
• s, cuadrados
• x, tachados
a.
• D, diamantes
• h, hexáganos
• ^, triángulo
ov
color • b, azul
• g, verde
nn
• r, rojo
• c, cyan
• m, magenta
oi
• y, amarillo
• k, negro
r
• w, blanco
eu
siu.lms.euroinnova.edu.es
91 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
u .e
ed
a.
ov
Por último, mostramos a continuación otra serie de métodos de utilidad para trabajar con gráficos:
nn
oi
Para guardar los gráficos también podemos usar la pestaña de guardar de la ventana que se nos
u.
Como hemos visto, el paquete matplotlib y en concreto la librería pyplot, tiene multitud de opciones
para dibujar gráficos que nos permiten visualizar el resultado del análisis de datos. En este punto
hemos hecho una pequeña introducción a este paquete del que se puede obtener más
siu.lms.euroinnova.edu.es
92 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
import numpy as np
y = np.sin(x)
s
.e
plt.plot(x,y)
u
plt.xlabel("angle")
ed
plt.ylabel("sine")
a.
plt.title('sine wave')
ov
plt.show()
nn
r oi
eu
s.
lm
u.
si
siu.lms.euroinnova.edu.es
93 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
x = linspace(-3, 3, 30)
y = x**2
plot(x, y, 'r.')
show()
s
.e
# Gráficas con varios formatos
u
from pylab import *
ed
plot(x, sin(x))
a.
plot(x, cos(x), 'r-')
ov
plot(x, -sin(x), 'g--')
nn
show()
r oi
eu
s.
lm
u.
si
siu.lms.euroinnova.edu.es
94 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
.e
u
ed
a.
ov
nn
r oi
eu
fig,a = plt.subplots(2,2)
u.
import numpy as np
si
x = np.arange(1,5)
a[0][0].plot(x,x*x)
a[0][0].set_title('cuadrado')
a[0][1].plot(x,np.sqrt(x))
a[0][1].set_title('raíz cuadrada')
siu.lms.euroinnova.edu.es
95 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
a[1][0].plot(x,np.exp(x))
a[1][0].set_title('exp')
a[1][1].plot(x,np.log10(x))
a[1][1].set_title('log')
plt.show()
s
.e
u
ed
a.
ov
nn
r oi
eu
s.
lm
u.
# Modificar cuadrícula
si
import numpy as np
x = np.arange(1,11)
siu.lms.euroinnova.edu.es
96 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
axes[0].grid(True)
axes[1].set_title('grid customizada')
s
.e
axes[2].plot(x,x)
u
axes[2].set_title('sin grid')
ed
fig.tight_layout()
a.
plt.show()
ov
nn
r oi
eu
s.
lm
u.
si
# Formatear ejes
siu.lms.euroinnova.edu.es
97 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
import numpy as np
x = np.arange(1,5)
axes[0].plot( x, np.exp(x))
s
.e
axes[0].plot(x,x**2)
u
axes[0].set_title("Escala normal")
ed
axes[1].plot (x, np.exp(x))
a.
axes[1].plot(x, x**2)
ov
axes[1].set_yscale("log")
nn
axes[0].set_xlabel("x axis")
r
eu
axes[0].set_ylabel("y axis")
s.
axes[0].xaxis.labelpad = 10
lm
axes[1].set_xlabel("x axis")
u.
axes[1].set_ylabel("y axis")
si
plt.show()
siu.lms.euroinnova.edu.es
98 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
.e
u
ed
a.
ov
nn
oi
# Gráfico de barras
r
eu
fig = plt.figure()
lm
ax = fig.add_axes([0,0,1,1])
u.
students = [23,17,35,29,12]
ax.bar(langs,students)
plt.show()
siu.lms.euroinnova.edu.es
99 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
.e
u
ed
a.
ov
nn
# Histograma
oi
import numpy as np
eu
fig,ax = plt.subplots(1,1)
s.
lm
a = np.array([22,87,5,43,56,73,55,54,11,20,51,5,79,31,27])
u.
ax.set_title("histogram of result")
ax.set_xticks([0,25,50,75,100])
ax.set_xlabel('marks')
ax.set_ylabel('no. of students')
plt.show()
siu.lms.euroinnova.edu.es
100 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
.e
u
ed
a.
ov
nn
# Gráfico de pie
oi
import numpy as np
eu
fig = plt.figure()
s.
lm
ax = fig.add_axes([0,0,1,1])
u.
ax.axis('equal')
si
students = [23,17,35,29,12]
plt.show()
siu.lms.euroinnova.edu.es
101 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
.e
u
ed
a.
ov
nn
# Surface plot
oi
import numpy as np
y = x.copy().T # transpose
si
z = np.cos(x ** 2 + y ** 2)
fig = plt.figure()
ax = plt.axes(projection='3d')
ax.set_title('Surface plot')
siu.lms.euroinnova.edu.es
102 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
plt.show()
s
.e
u
ed
a.
ov
nn
r oi
eu
s.
lm
u.
si
siu.lms.euroinnova.edu.es
103 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
pequeño repaso de estas dos herramientas de software libre utilizadas en el análisis de datos.
¿Qué es MongoDB? MongoDB es una base de datos NoSQL de software libre, escalable y de alto
base de datos NoSQL CP, es decir contiene una visión consistente de los datos frente a la
s
disponibilidad de las particiones. Estamos ante una de las bases de datos de tipo NoSQL más
.e
populares. Es importante destacar que es una base de datos orientada a documentos, es decir
u
almádena la información en documentos BSON, formato binario de JSON, lo que aporta dinamismo y
ed
flexibilidad. MongoDB almacena cada registro en un documento.
a.
Entre sus características más importantes destacamos: ov
Almacenamiento orientado a documentos BSON, un formato binario de documentos JSON.
nn
Soporte de índices
oi
Escalabilidad horizontal.
s.
GridFS, que permite almacenar ficheros de cualquier tamaño sin necesidad de complicar el
lm
entorno.
¿Qué es Hadoop? Podríamos comenzar comentando que Hadoop nace en el momento en que
Google necesita urgentemente una solución con la que pueda continuar procesando datos al ritmo
que el mercado le demanda, ya que Google en sus inicios creció de forma exponencial. Google
decide buscar entonces una solución basada en un sistema de archivos distribuidos a lo que más
tarde se le conocerá como Hadoop, que se basa en un gran número de pequeños ordenadores, cada
Lo novedoso y la excelencia del sistema, es que a pesar de que cada uno de ellos funciona de forma
siu.lms.euroinnova.edu.es
104 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
dimensiones increíbles. En 2006, Google publica todos los detalles acerca de su nuevo
descubrimiento, compartiendo su conocimiento y experiencia con todos los usuarios. Esto despierta
el interés de la comunidad Open Source, que viendo las nuevas oportunidades que surgirán explotan
Apache Hadoop es por lo tanto un framework de software libre que permite escribir y ejecutar
aplicaciones en sistemas distribuidos para procesar grandes cantidades de datos. Está diseñado para
s
escalar de servidores individuales a miles de máquinas, cada una con el procesamiento y el
.e
almacenamiento local. En lugar de confiar en el hardware para ofrecer alta disponibilidad, el
u
framework en sí está diseñado para detectar y controlar los errores en la capa de aplicación,
ed
facilitando un servicio de alta disponibilidad en la capa superior, haciendo transparente al usuario la
a.
posible caída de un nodo. ov
Python y MongoDB
nn
Como hemos visto MongoDB permite trabajar con una gran cantidad de lenguajes de programación
diferentes para llevar a cabo la explotación de la base de datos. En el caso de estudio que estamos
oi
llevando a cabo, Python ofrece un paquete específico que proporciona un soporte para MongoDB
r
eu
llamado PyMongo, que nos permite interactuar con la base de datos, y que está soportado por
Como cualquier paquete de Python, previamente debemos instalarlo y configurar el controlador para
u.
poder trabajar con MongoDB. PyMongo nos permitirá entre otras cosas conectarnos a una base de
si
Una vez instalado y configurado el entorno de MongoDB, debemos instalar el paquete pymongo.
Para llevar a cabo la instalación podemos acceder al sitio oficial de pymongo para anaconda y desde
allí descargarnos el instalador en función del sistema operativo en el que estemos trabajando, o bien
siu.lms.euroinnova.edu.es
105 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
u .e
ed
a.
ov
nn
r oi
eu
s.
pymongo.
u.
si
siu.lms.euroinnova.edu.es
106 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
u .e
ed
a.
ov
Tras llevar a cabo unas verificaciones, se muestra información de los paquetes que se van a
proceder a descargar para poder llevar a cabo la instalación de pymongo, debemos contestar y (YES)
nn
import pymongo
lm
Si tras la ejecución del comando anterior no nos aparece ningún error es la que la instalación se ha
u.
conectarnos a una base de datos. Para ello, debemos ejecutar en primer lugar el servidor de
MongoDB como ya vimos, para que se permitan conexiones a la base de datos a través del puerto
MongoClient es el cliente de bases de datos que se implementa en pymongo, y a través del que
podremos establecer conexión con la base de datos, así como consultar los datos. Si llamamos a
MongoClient sin argumentos se abre la conexión por defecto en localhost y el puerto 27017 como
siu.lms.euroinnova.edu.es
107 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
u .e
ed
a.
ov
nn
r oi
eu
s.
lm
u.
Como se aprecia en la imagen anterior, en la parte resaltada en rojo, se puede comprobar que se ha
si
abierto una conexión con MongoDB tras la ejecución de las sentencias anteriores en Python. Es
decir, con lo anterior, ya tenemos un objeto con los datos de mongo. Se debe tener en cuenta que la
Como ya vimos, MongoDB emplea el formato JSON para almacenar los datos, en Python usaremos el
tipo de dato diccionario para emular el formato JSON. Una vez que tengamos nuestro documento,
creamos una colección y añadimos dicho documento a la misma, comprobando a continuación que el
siu.lms.euroinnova.edu.es
108 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
documento se ha insertado de manera correcta. En resumen, cuando trabajamos con pymongo cada
tabla de nuestra base de datos será una colección, y como el paquete de MongoDB para Python,
desconoce las clases y objetos Python no podemos pasarle objetos Python a las funciones que nos
permitirán hacer queries. Por esta razón hacemos uso de los “diccionarios” de Python, ya que son
JSON.
Una vez que estamos conectados a MongoDB, podemos ver la lista de bases de datos disponibles y
s
seleccionar una sobre la que trabajar utilizando la sintaxis de atributos o de diccionario.
u .e
ed
a.
ov
nn
r oi
eu
s.
lm
Como podemos ver en la imagen anterior, cuando llamamos a database_names() nos aparece una
lista con todas las bases de datos creadas en MongoDB. En el ejemplo anterior tenemos dos bases de
u.
datos ‘Prestamos’ y ‘local’ esta última es la creada por defecto por MongoDB. El método
si
Algunas de las funciones que nos permiten trabajar con una base de datos en MongoDB desde el
Función Descripción
conex.nombredb Nos permite conectarnos a una base de datos concreta que de
no existir se creará.
Ejempl: db = conex.Prestamos
siu.lms.euroinnova.edu.es
109 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
Ejemplo: collection.update()
.e
find() Realizamos búsqueda de documentos, lo que nos permitirá crear
consultas sobre la base de datos
u
Ejemplo: collection.find({“name”:”Pepe”})
ed
remove() Borramos documentos
Ejemplo: collection.remove({“name”:”Pepe”})
a.
count() Nos permite contar todos los documentos de una colección:
Ejemplo collection.count()
ov
drop() Borramos todos los documentos de una colección
Ejemplo: collection.drop()
nn
Resumiendo, para trabajar con una base de datos en MongoDB desde pymongo, se debe conocer
cómo están estructuradas las bases de datos NoSQL para saber que función utilizar con qué
r
eu
elementos. En líneas generales cuando se habla de colección se hace referencia a una tabla de la
base de datos y cuando hablamos de documentos estamos referenciando a los elementos de una
s.
Veamos a continuación algunos ejemplos prácticos con lo que entender mejor estos conceptos, pero
u.
como siempre para conocer en profundidad todas las funcionalidades que conseguimos con pymongo
si
debemos consultar su sitio oficial. Para los ejemplos trabajaremos con el documento biblioteca.py
que se encuentra entre los recursos del módulo, que permite crear una base de datos de gestión de
siu.lms.euroinnova.edu.es
110 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
Como podemos observar tras crear la base de datos Prestamos y comprobar si esta ha sido creada
s
.e
en MongoDB, nos encontramos con que únicamente tenemos la base de datos ‘local’ y no hay rastro
de la que acabamos de crear, esto es debido a que hasta que no creemos alguna de las “colecciones”
u
ed
(tablas) de la base de datos e insertemos “documentos” (filas) en las mismas, ésta no nos aparecerá.
a.
ov
nn
r oi
eu
s.
lm
u.
si
Como se aprecia, con find() podemos ejecutar consultas sobre la base de datos en base a las
siu.lms.euroinnova.edu.es
111 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
Finalmente, vamos a conectar con la base de datos de ítems creada en la unidad anterior.
s
.e
> from pymongo import MongoClient
u
> client = MongoClient()
ed
También podemos hacer lo siguiente:
a.
> client = pymongo.MongoClient()
ov
Mostramos las bases de datos del cliente:
nn
> client.list_database_names()
r oi
eu
s.
lm
u.
si
siu.lms.euroinnova.edu.es
112 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
> db=client.DBPruebas
> db.list_collection_names()
> items=db.items
s
u .e
ed
a.
ov
Mediante el método pprint(), mostramos el primer elemento de la colección:
nn
> pprint.pprint(items.find_one())
r
eu
s.
lm
u.
si
siu.lms.euroinnova.edu.es
113 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
Python y Hadoop
Como hemos vistos, son muy diversas las tecnologías que hoy en día podemos integrar dentro de Big
Data, pero si hubiera que destacar una de ellas por encima de las demás, sin duda habría que
apuntar al desarrollo del modelo de programación MapReduce. Antes de ver cómo podemos
implementar este concepto en Python para Hadoop, recordemos brevemente en qué consiste.
MapReduce
s
.e
para poder distribuir el procesamiento de los datos y los cálculos entre diferentes máquinas, con el
u
fin de reducir el tiempo de estas operaciones, surge el modelo MapReduce. Este modelo, además es
ed
lo suficientemente genérico como para ser aplicado a varios problemas.
a.
A grandes rasgos, tan solo hay que detallar dos funciones en este modelo, la función map: que
transforma los datos iniciales en pares claves-valor, y la función reduce: que reagrupa los pares
ov
clave-valor resultantes de map para producir el resultado final. De esta forma, los datos en el clúster
nn
de Hadoop son divididos en pequeñas piezas llamadas bloques y distribuidas a través del clúster con
HDFS y posteriormente las funciones map y reduce pueden ser ejecutadas en pequeños
oi
volúmenes de datos.
eu
¿Cómo implementamos esta idea en Python? El ecosistema Apache Hadoop está primariamente
s.
implementado en/para Java, es decir, que el modelo MapReduce se espera que esté escrito en Java.
lm
No obstante, con idea de hacer Hadoop un sistema más portable a la comunidad científica, se
permite escribir el código map/reduce en otros lenguajes de programación, como Python, c/c++,
u.
Hadoop streaming es una utilidad que viene en la distribución de Hadoop y que permite crear y
ejecutar trabajos Map/Reduce con cualquier archivo ejecutable o script con el mapeador y/o el
reductor, canalizando los datos a los scripts. Para Python, tanto el mapeador como el reductor son
secuencias de comandos (en Python) que leen desde la entrada estándar (stdin) y emiten los
resultados por la salida estándar (stdout). Entendemos, por tanto, en este ámbito a Hadoop
reductor desde scripts en Python. Una de las desventajas de usar Streaming directamente es que
siu.lms.euroinnova.edu.es
114 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
mientras las entradas en el reductor se agrupan por clave, éstas continúan siendo iteradas línea por
Por tanto, para trabajar con Hadoop Streaming desde Python, únicamente necesitamos hacer uso de
sys.stdin para leer desde la entrada y sys.stdout para imprimir por la salida estándar los datos,
teniendo en cuenta que Straming tiene algunas convenciones (configurables) que permiten entender
los datos devueltos, lo más importante que se debe tener en cuenta es que por defecto se supone
s
.e
Implementaremos para nuestros trabajos de MapReduce dos scripts en Python, uno que contenga el
u
código para el mapeador y otro con el código para el reductor, que posteriormente pasaremos como
ed
parámetros al comando de Hadoop encargado de ejecutar el trabajo.
a.
Retomamos un ejemplo de MapReduce de temas anteriores, que implementaremos en Python,
ov
haciendo uso de la utilidad Hadoop Streaming, para entender mejor estos conceptos.
Hay que implementar un contador de palabras, tomando como muestra el siguiente texto:
nn
“En un lugar de la Mancha, de cuyo nombre no quiero acordarme, no ha mucho tiempo que vivía un
oi
hidalgo de los de lanza en astillero, adarga antigua, rocín flaco y galgo corredor”
r
eu
Para llevar a cabo el ejercicio, asumiremos que cada una de las líneas se envía a una tarea de Mapeo
siu.lms.euroinnova.edu.es
115 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
u .e
ed
a.
ov
nn
r oi
eu
s.
lm
u.
El código para mapeo sería el siguiente (el archivo lo tiene disponible entre los recursos con el
si
nombre de mapper.py)
siu.lms.euroinnova.edu.es
116 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
s
.e
El código para reducir sería el siguiente (el archivo lo tiene disponible entre los recursos con el
u
nombre de reducer.py)
ed
a.
ov
nn
r oi
eu
s.
lm
u.
si
Antes de ejecutar Hadoop, debemos asegurarnos de que los scripts que hemos realizado para
mapear y reducir, funcionan correctamente, para ello haremos una pequeña prueba desde la línea
de comandos con el texto del quijote (que tenemos almacenado en .txt). Debemos por tanto abrir el
Anaconda Prompt y ejecutar la siguiente línea desde el directorio en el que tengamos los archivos:
siu.lms.euroinnova.edu.es
117 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
donde:
s
sort à ordena por oden alfabético la salida de mapper
.e
python reducer.py à Ejecuta el reducer tomando como entrada la salida ordenada de mapper
u
ed
a.
ov
nn
r oi
eu
s.
lm
u.
si
Una vez que hemos comprobado que nuestros scripts en Python funcionan como se esperaba,
podemos llevar a cabo MapReduce desde Hadoop Streaming, para ello debemos ejecutar el archivo
jar Hadoop Streaming. Este archivo hadoop-streaming-X.Y.Z.jar (donde X,Y,Z corresponde al número
siu.lms.euroinnova.edu.es
118 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
hadoop \
jar/$HADOOP_HOME/contrib/streaming/Hadoop-streaming-X.Y.Z.jar \
-input “contador/quijote.txt” \
-output “contador/salida \
-file mapper.py \
s
.e
-file reducer.py
u
Nótese en el comando anterior que mapper.py y reducer.py deben especificarse en dos ocasiones, la
ed
primera vez para indicar los ejecutables (-mapper y –reducer), mientras que la segunda vez se le
indica a Hadoop que distribuya los ejecutables por todos los nodos en el cluster.
a.
ov
Se debe haber cargado previamente el texto de entrada quijote.txt dentro de HDFS de Hadoop, para
Existen diferentes herramientas implementadas en Python que nos permiten hacer MapReduce
lm
desde Hadoop Streaming. Estos módulos, simplifican el proceso de envío de trabajos sobre los que
u.
mapear/reducir.
si
mrjob
Es un framework open-source de Python, que envuelve Hadoop Streaming y desarrollado por Yelp.
Puesto que Yelp opera totalmente dentro de Amazon Web Services, la integración de mrjob con EMR
es bastante sencilla. Trabaja en una interfaz de MapReduce abstracta, permite manejar objetos
Python de carácter complejo, está disponible para flujos de trabajo MapReduce de pasos múltiples y
Mrjob solo es necesario tenerla instalada en el nodo cliente donde se presenta el trabajo.
siu.lms.euroinnova.edu.es
119 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
hadoopy
Estamos ante otro contenedor de Python para Hadoop Streaming escrito en Cython. Cabe destacar
en este caso su facilidad para la depuración, ya que se pueden escribir mensajes directamente a
Su interfaz es similar a la API de Hadoop (con patrones de diseño utilizables entre interfaces
Python/Java) y permite ser utilizado en clústers de Hadoop sin Python o acceso de administrador.
s
.e
Una característica interesante es que permite lectura/escritura de archivos TypeBytes directamente
a HDFS desde Python (con readtb y writetb ) y funciona en los clústers sin ningún tipo de
u
instalación extra.
ed
Desde hadoopy, hay dos maneras de lanzar trabajos:
a.
ov
launch: Requiere que Python/hadoopy se instale en cada nodo del clúster, pero no genera
launch_frozen: No es necesario que Python esté instalado en los nodos, pero conlleve una
oi
funcione, tiempo que puede ser mitigado con la optimización y trucos de almacenamiento en
r
eu
caché.
s.
Por tanto, los trabajos en hadoopy se deben lanzar desde dentro de un programa en Python, es decir
lm
siu.lms.euroinnova.edu.es
120 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
Recuerda
empresas, las cuales requieren identificar variables vitales de sus consumidores para poder
Los lenguajes interpretados como Python, suelen ofrecer una herramienta de ejecución
interactiva. Con ella es posible dar órdenes directamente al intérprete y obtener una respuesta
s
inmediata para cada una de ellas. Es decir, no es necesario escribir un programa completo para
.e
empezar a obtener resultados de ejecución, no obstante cuando tenemos mucho código es
u
preferible guardarlo en un archivo con extensión .py que posteriormente podemos ejecutar
ed
desde nuestro intérprete.
Los archivos de python tienen la extensión .py, son archivos de texto que son interpretados por
a.
el compilador. Para poder ejecutar programas en Python, necesitamos en primer lugar el
ov
intérprete de Python, y en segundo lugar el código que queremos ejecutar.
IPython es un Shell interactivo que añade funcionalidades extra al modo interactivo incluido
nn
con Python, como resaltado de líneas y errores mediante colores, una sintaxis adicional para el
oi
funcionalidades.
eu
siu.lms.euroinnova.edu.es
121 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
Autoevaluación
s
u .e
Devuelve una lista con todas las claves, en un orden arbitrario, del diccionario
ed
a.
2. ¿Qué significa que Python es un lenguaje interpretado?
ov
Abstrae el problema de manejo de memoria u otros detalles de bajo nivel
nn
oi
funcional”
Verdadero.
Falso.
siu.lms.euroinnova.edu.es
122 / 123
[AFO0289D6] Diplomado en Análisis de Datos
[MOD0248BW] Análisis de Datos
[UDI150Y2C] Python y el análisis de datos
list
Una lista con todos los paquetes y sus versiones que tenemos instalados.
s
disponibles para su descarga
u .e
5. ¿Qué tipo de gráfico podemos crear con la función quiver de pyplot?
ed
a.
Gráfico de datos 2D ov
Gráfico de campos de vectores
nn
oi
siu.lms.euroinnova.edu.es
123 / 123