Análisis de datos
Contents
Análisis de datos#

Análisis de datos con diferentes tecnologías
Índice
Anaconda#
Para instalar Anaconda primero instalamos las siguientes dependencias:
sudo apt install libgl1-mesa-glx libegl1-mesa libxrandr2 libxrandr2 libxss1 libxcursor1 libxcomposite1 libasound2 libxi6 libxtst6
Vamos a https://www.anaconda.com/products/individual#Downloads descargamos e instalamos.
Tras la instalación nos preguntará «Do you wish the installer to initialize Anaconda3 by running conda init?» -> decimos yes.
Cerramos la terminal para que se actualicen los cambios.
Ejecutamos en terminal:
anaconda-navigator
Abrimos Jupyter y podemos trabajar con un cuaderno nuevo.
Jupyter#
JupyterLab#
Si tan solo queremos Jupyter en nuestro equipo podemos instalarlo de la siguiente forma:
Instalar JupyterLab:
pip install jupyterlab
Ejecutar desde terminal:
jupyter-lab
De este modo se abrirá Jupiter lab que contiene una serie de herramientas entre ellas Notebook.
Solo Jupyter Notebook#
Con esta instalación tendremos tan solo el notebook de jupyter:
Instalar Jupyter Notebook:
pip install notebook
Ejecutar Notebook:
jupyter notebook
Pandas#
Pandas es la librería para trabajar con DataFrames.
Comprobar versión:
1# Se importa pandas como pd:
2import pandas as pd
3
4# de pd se irá ejecutando las distintas funciones:
5pd.show_versions() # como ver la versión a detalle.
DataFrames#
Los dataframes son conjuntos de datos ordenados por filas y columnas:
Crear un DataFrame a partir de Listado de objetos#
1import pandas as pd
2
3# Creamos un listado con varios diccionarios:
4amigos = [
5 {'nombre': 'Alfredo', 'apellidos': 'Ramirez Alberti'},
6 {'nombre': 'Laura', 'apellidos': 'Plutarco Pitágoras'},
7 {'nombre': 'Ernesto', 'apellidos': 'Granada Aferez'}
8]
9
10# Con esta función se crea un dataframe:
11pd.DataFrame(amigos)
Nota
Pandas asocia las keys de cada diccionario como título de columna y cada diccionario es una fila en el DataFrame
Crear un DataFrame a partir de archivo CSV#
Tenemos el siguiente archivo CSV llamado amigos.csv:
nombre,apellidos
Alfredo,Ramirez Alberti
Laura,Plutarco Pitágoras
Ernesto,Granada Aferez
Lo leemos con Pandas y este lo convierte a DataFrame:
1import pandas as pd
2
3# Ejecutamos la lectura del csv:
4pd.read_csv(r'amigos.csv')
Nota
Se puede saltar filas añadiendo el parametro skiprows y el valor que queramos pd.read_csv(r’amigos.csv”, skiprows=3), esto vale para el resto de funciones read_*.
Ver información del DataFrame#
1import pandas as pd
2
3amigos = [
4 {'nombre': 'Alfredo', 'apellidos': 'Ramirez Alberti'},
5 {'nombre': 'Laura', 'apellidos': 'Plutarco Pitágoras'},
6 {'nombre': 'Ernesto', 'apellidos': 'Granada Aferez'}
7]
8
9tabla_amigos = pd.DataFrame(amigos)
10
11# mostrará una información detallada:
12tabla_amigos.info()
Averiguar dimensión dataframe#
Para averiguar la dimensión de un dataframe:
1import pandas as pd
2
3amigos = [
4 {'nombre': 'Alfredo', 'apellidos': 'Ramirez Alberti'},
5 {'nombre': 'Laura', 'apellidos': 'Plutarco Pitágoras'},
6 {'nombre': 'Ernesto', 'apellidos': 'Granada Aferez'}
7]
8
9# Se guarda el dataframe:
10tabla_amigos = pd.DataFrame(amigos)
11
12# Y ahora podemos medir su tamaño:
13tabla_amigos.shape
Esto devuelve 3 filas y 2 columnas.
Ver los primeros registros#
1import pandas as pd
2
3amigos = [
4 {'nombre': 'Alfredo', 'apellidos': 'Ramirez Alberti'},
5 {'nombre': 'Laura', 'apellidos': 'Plutarco Pitágoras'},
6 {'nombre': 'Ernesto', 'apellidos': 'Granada Aferez'}
7]
8
9tabla_amigos = pd.DataFrame(amigos)
10
11# ver los 5 primeros:
12tabla_amigos.head()
13
14# ver los primeros que queramos:
15tabla_amigos.head(100)
Ver los últimos registros#
1import pandas as pd
2
3amigos = [
4 {'nombre': 'Alfredo', 'apellidos': 'Ramirez Alberti'},
5 {'nombre': 'Laura', 'apellidos': 'Plutarco Pitágoras'},
6 {'nombre': 'Ernesto', 'apellidos': 'Granada Aferez'}
7]
8
9tabla_amigos = pd.DataFrame(amigos)
10
11# ver los 5 últimos:
12tabla_amigos.tail()
13
14# ver los últimos que queramos:
15tabla_amigos.tail(25)
Ordenar Registros#
1import pandas as pd
2
3amigos = [
4 {'nombre': 'Alfredo', 'apellidos': 'Ramirez Alberti'},
5 {'nombre': 'Laura', 'apellidos': 'Plutarco Pitágoras'},
6 {'nombre': 'Ernesto', 'apellidos': 'Granada Aferez'}
7]
8
9tabla_amigos = pd.DataFrame(amigos)
10
11# Ordenar los registros:
12tabla_amigos.sort_values(by=['nombre'])
13
14# Ordenar por varios criterios y en orden descendente:
15tabla_amigos.sort_values(by=['apellidos', 'nombre'], ascending=False)
Buscar registros por un valor#
1import pandas as pd
2
3amigos = amigos = [
4 {'nombre': 'Alfredo', 'apellidos': 'Ramirez Alberti', 'edad': 19},
5 {'nombre': 'Laura', 'apellidos': 'Plutarco Pitágoras', 'edad': 25},
6 {'nombre': 'Ernesto', 'apellidos': 'Granada Aferez', 'edad': 22}
7]
8
9tabla_amigos = pd.DataFrame(amigos)
10
11# Recuperar todos los registros con el nombre alfredo:
12tabla_amigos[tabla_amigos['nombre'] == 'Alfredo']
Buscar registros por multiples valores#
1import pandas as pd
2
3amigos = [
4 {'nombre': 'Alfredo', 'apellidos': 'Ramirez Alberti', 'edad': 19},
5 {'nombre': 'Laura', 'apellidos': 'Plutarco Pitágoras', 'edad': 25},
6 {'nombre': 'Ernesto', 'apellidos': 'Granada Aferez', 'edad': 22}
7]
8
9tabla_amigos = pd.DataFrame(amigos)
10
11# Recuperar todos los registros con el nombre alfredo:
12tabla_amigos[(tabla_amigos['nombre'] == 'Alfredo') & (tabla_amigos['apellidos'] == 'Ramirez Alberti')]
Buscar registros que sean mayores o menores#
1import pandas as pd
2
3amigos = [
4 {'nombre': 'Alfredo', 'apellidos': 'Ramirez Alberti', 'edad': 19},
5 {'nombre': 'Laura', 'apellidos': 'Plutarco Pitágoras', 'edad': 25},
6 {'nombre': 'Ernesto', 'apellidos': 'Granada Aferez', 'edad': 22}
7]
8tabla_amigos = pd.DataFrame(amigos)
9
10# Recuperar todos los amigos mayores de 20:
11tabla_amigos[tabla_amigos['edad'] > 20]
Nota
Del mismo modo podemos sacar los registros menores a.. con <
Eliminar un registro#
Para eliminar un registro basta con saber su fila:
1import pandas as pd
2
3amigos = [
4 {'nombre': 'Alfredo', 'apellidos': 'Ramirez Alberti'},
5 {'nombre': 'Laura', 'apellidos': 'Plutarco Pitágoras'},
6 {'nombre': 'Ernesto', 'apellidos': 'Granada Aferez'}
7]
8
9tabla_amigos = pd.DataFrame(amigos)
10
11# Recuperar todos los registros con el nombre alfredo:
12tabla_amigos = tabla_amigos.drop(1)
13
14tabla_amigos
Nota
Si queremos eliminar una columna: tabla_amigos = tabla_amigos.drop('apellidos', axis=1)
Comprobar valores nulos#
1import pandas as pd
2
3amigos = [
4 {'nombre': 'Alfredo', 'apellidos': 'Ramirez Alberti', 'edad': None},
5 {'nombre': 'Laura', 'apellidos': 'Plutarco Pitágoras', 'edad': 25},
6 {'nombre': 'Ernesto', 'apellidos': 'Granada Aferez', 'edad': None}
7]
8tabla_amigos = pd.DataFrame(amigos)
9
10# Averiguar valores nulos:
11tabla_amigos.isnull()
Borrar registros con campos nulos#
1import pandas as pd
2
3amigos = [
4 {'nombre': 'Alfredo', 'apellidos': 'Ramirez Alberti', 'edad': None},
5 {'nombre': 'Laura', 'apellidos': 'Plutarco Pitágoras', 'edad': 25},
6 {'nombre': 'Ernesto', 'apellidos': 'Granada Aferez', 'edad': None}
7]
8tabla_amigos = pd.DataFrame(amigos)
9
10# Eliminar valores que contengan campos nulos:
11tabla_amigos.dropna()
Reemplazar campos nulos por un valor por defecto#
1import pandas as pd
2
3amigos = [
4 {'nombre': 'Alfredo', 'apellidos': 'Ramirez Alberti', 'edad': None},
5 {'nombre': 'Laura', 'apellidos': 'Plutarco Pitágoras', 'edad': 25},
6 {'nombre': 'Ernesto', 'apellidos': 'Granada Aferez', 'edad': None}
7]
8tabla_amigos = pd.DataFrame(amigos)
9
10# Rellenar valores nulos con otro valor como 0 o '':
11tabla_amigos.fillna('')
Series#
Las series son definidas en el DataFrame como las columnas de una tabla.
Si queremos acceder a una columna:
1import pandas as pd
2
3amigos = [
4 {'nombre': 'Alfredo', 'apellidos': 'Ramirez Alberti'},
5 {'nombre': 'Laura', 'apellidos': 'Plutarco Pitágoras'},
6 {'nombre': 'Ernesto', 'apellidos': 'Granada Aferez'}
7]
8
9# Se guarda el dataframe:
10tabla_amigos = pd.DataFrame(amigos)
11
12# se llama a la serie:
13tabla_amigos['nombre']
14
15# también se puede hacer con notación de punto:
16tabla_amigos.apellidos
17
18# O las series que queramos a la vez:
19tabla_amigos[['nombre','apellidos']]
Contar registros#
1import pandas as pd
2
3amigos = [
4 {'nombre': 'Alfredo', 'apellidos': 'Ramirez Alberti'},
5 {'nombre': 'Laura', 'apellidos': 'Plutarco Pitágoras'},
6 {'nombre': 'Ernesto', 'apellidos': 'Granada Aferez'}
7]
8
9tabla_amigos = pd.DataFrame(amigos)
10
11# Hará un desglose de cuantas veces se repite cada elemento en una Serie:
12tabla_amigos['nombre'].value_counts()
Ordenar Series#
1import pandas as pd
2
3amigos = [
4 {'nombre': 'Alfredo', 'apellidos': 'Ramirez Alberti'},
5 {'nombre': 'Laura', 'apellidos': 'Plutarco Pitágoras'},
6 {'nombre': 'Ernesto', 'apellidos': 'Granada Aferez'}
7]
8
9tabla_amigos = pd.DataFrame(amigos)
10
11# Ordenará una serie de datos:
12tabla_amigos['nombre'].sort_values()
Indexación booleana#
1import pandas as pd
2
3amigos = [
4 {'nombre': 'Alfredo', 'apellidos': 'Ramirez Alberti'},
5 {'nombre': 'Laura', 'apellidos': 'Plutarco Pitágoras'},
6 {'nombre': 'Ernesto', 'apellidos': 'Granada Aferez'}
7]
8
9tabla_amigos = pd.DataFrame(amigos)
10
11# Mostrará la posición de la serie junto a True o False si coincide el valor buscado:
12tabla_amigos['nombre'] == 'Alfredo'
Gráficos#
Ejemplo gráfico estandar:
1import pandas as pd
2
3import pandas as pd
4
5ventas = [
6 {'tomates': 23, 'lechugas': 44, 'zanahorias': 172},
7 {'tomates': 434, 'lechugas': 156, 'zanahorias': 127},
8 {'tomates': 222, 'lechugas': 32, 'zanahorias': 142}
9]
10
11tabla_ventas = pd.DataFrame(ventas)
12
13# Imprime un gráfico en Jupyter:
14tabla_ventas.plot() # esto equivale por defecto a tabla_ventas.plot(kind='line')
Tipos de gráficos#
Modificando el parámetro kind obtendremos distintos gráficos:
Tenemos el siguiente gráfico:
1import pandas as pd
2
3ventas = [
4 {'cantidad': 23, 'beneficio': 1280},
5 {'cantidad': 123, 'beneficio': 640},
6 {'cantidad': 11, 'beneficio': 380}
7]
8
9tabla_ventas = pd.DataFrame(ventas)
10tabla_ventas.plot(kind='line')
bar: gráfico de barras.
barh: barras horizontales.
pie: gráfico circular o de queso. Funciona con series.
tabla_ventas['beneficio'].plot(kind='pie')
scatter: gráfico de dispersión, requiere valores x e y para poder dispersar.
Nota
Se puede ajustar un gráfico con dos valores de referencias por ejemplo en x la cantidad y en Y el beneficio:
tabla_ventas.plot(kind='bar', x="cantidad", y="beneficio")
Colores#
Para personalizar colores en los gráficos le pasamos a plot() el parámetro color seguido de un color hexadecimal o referencial:
1import pandas as pd
2
3ventas = [
4 {'cantidad': 23, 'beneficio': 1280},
5 {'cantidad': 123, 'beneficio': 640},
6 {'cantidad': 11, 'beneficio': 380}
7]
8
9tabla_ventas = pd.DataFrame(ventas)
10
11# ponemos las barras amarillas:
12tabla_ventas.plot(kind='bar', color="yellow", x="cantidad", y="beneficio")
Mapa de colores#
Se pueden usar varios colores con colormap:
1import pandas as pd
2
3ventas = [
4 {'producto': 'Zanahorias', 'categoria': 'verduras', 'cantidad': 23, 'beneficio': 1280},
5 {'producto': 'Puerros', 'categoria': 'verduras', 'cantidad': 123, 'beneficio': 640},
6 {'producto': 'Lechugas', 'categoria': 'verduras', 'cantidad': 11, 'beneficio': 380},
7 {'producto': 'Galletas', 'categoria': 'desayunos', 'cantidad': 11, 'beneficio': 380},
8 {'producto': 'Cereales', 'categoria': 'desayunos', 'cantidad': 11, 'beneficio': 380},
9 {'producto': 'Coca cola', 'categoria': 'refrescos', 'cantidad': 11, 'beneficio': 380},
10 {'producto': 'desinfectante', 'categoria': 'limpieza', 'cantidad': 11, 'beneficio': 380}
11]
12
13tabla_ventas = pd.DataFrame(ventas)
14
15# Vamos a usar value_counts() para contear todos los valores de una serie:
16tabla_ventas['categoria'].value_counts().plot(kind='pie', colormap="hot")
Tamaño del gráfico#
Se puede definir un tamaño de gráfico con figsize:
1import pandas as pd
2
3ventas = [
4 {'producto': 'Zanahorias', 'categoria': 'verduras', 'cantidad': 23, 'beneficio': 1280},
5 {'producto': 'Puerros', 'categoria': 'verduras', 'cantidad': 123, 'beneficio': 640},
6 {'producto': 'Lechugas', 'categoria': 'verduras', 'cantidad': 11, 'beneficio': 380},
7 {'producto': 'Galletas', 'categoria': 'desayunos', 'cantidad': 11, 'beneficio': 380},
8 {'producto': 'Cereales', 'categoria': 'desayunos', 'cantidad': 11, 'beneficio': 380},
9 {'producto': 'Coca cola', 'categoria': 'refrescos', 'cantidad': 11, 'beneficio': 380},
10 {'producto': 'desinfectante', 'categoria': 'limpieza', 'cantidad': 11, 'beneficio': 380}
11]
12
13tabla_ventas = pd.DataFrame(ventas)
14
15# ponemos las barras amarillas:
16tabla_ventas['categoria'].value_counts().plot(kind='line', figsize=(10, 5))
Indexación#
La indexación por defecto se establece por fila, pero podemos cambiarla.
Elegir columna como índice#
Se puede elegir una columna que reemplazará los valores de fila:
1import pandas as pd
2
3ventas = [
4 {'producto': 'Zanahorias', 'categoria': 'verduras', 'cantidad': 23, 'beneficio': 1280},
5 {'producto': 'Puerros', 'categoria': 'verduras', 'cantidad': 123, 'beneficio': 640},
6 {'producto': 'Lechugas', 'categoria': 'verduras', 'cantidad': 11, 'beneficio': 380},
7 {'producto': 'Galletas', 'categoria': 'desayunos', 'cantidad': 11, 'beneficio': 380},
8 {'producto': 'Cereales', 'categoria': 'desayunos', 'cantidad': 11, 'beneficio': 380},
9 {'producto': 'Coca cola', 'categoria': 'refrescos', 'cantidad': 11, 'beneficio': 380},
10 {'producto': 'desinfectante', 'categoria': 'limpieza', 'cantidad': 11, 'beneficio': 380}
11]
12
13tabla_ventas = pd.DataFrame(ventas)
14
15# cambiamos índice por categoria:
16tabla_ventas.set_index('categoria')
Nota
set_index() solo imprime valores, si queremos que se guarde el nuevo índice tenemos que pasarle el parámetro inplace=True:
tabla_ventas.set_index('categoria', inplace=True)
Atención
Si hemos guardado los índices podemos resetearlos ejecutando el método:
tabla_ventas.reset_index(inplace=True)
Ordenar índices#
Los índices nuevos tienen el mismo orden de fila, para cambiarlo usamos sort_index():
1import pandas as pd
2
3ventas = [
4 {'producto': 'Zanahorias', 'categoria': 'verduras', 'cantidad': 23, 'beneficio': 1280},
5 {'producto': 'Puerros', 'categoria': 'verduras', 'cantidad': 123, 'beneficio': 640},
6 {'producto': 'Lechugas', 'categoria': 'verduras', 'cantidad': 11, 'beneficio': 380},
7 {'producto': 'Galletas', 'categoria': 'desayunos', 'cantidad': 11, 'beneficio': 380},
8 {'producto': 'Cereales', 'categoria': 'desayunos', 'cantidad': 11, 'beneficio': 380},
9 {'producto': 'Coca cola', 'categoria': 'refrescos', 'cantidad': 11, 'beneficio': 380},
10 {'producto': 'desinfectante', 'categoria': 'limpieza', 'cantidad': 11, 'beneficio': 380}
11]
12
13tabla_ventas = pd.DataFrame(ventas)
14
15tabla_ventas.set_index('categoria', inplace=True)
16
17# ordenando por índices:
18tabla_ventas.sort_index(inplace=True)
19
20tabla_ventas
Nota
Si queremos ponerlos en orden descendiente le pasamos el parámetro ascending=False
a sort_index()
Buscar grupos por su índice#
Al tener un índice personalizado podemos recuperar solo los registros que queramos:
1import pandas as pd
2
3ventas = [
4 {'producto': 'Zanahorias', 'categoria': 'verduras', 'cantidad': 23, 'beneficio': 1280},
5 {'producto': 'Puerros', 'categoria': 'verduras', 'cantidad': 123, 'beneficio': 640},
6 {'producto': 'Lechugas', 'categoria': 'verduras', 'cantidad': 11, 'beneficio': 380},
7 {'producto': 'Galletas', 'categoria': 'desayunos', 'cantidad': 11, 'beneficio': 380},
8 {'producto': 'Cereales', 'categoria': 'desayunos', 'cantidad': 11, 'beneficio': 380},
9 {'producto': 'Coca cola', 'categoria': 'refrescos', 'cantidad': 11, 'beneficio': 380},
10 {'producto': 'desinfectante', 'categoria': 'limpieza', 'cantidad': 11, 'beneficio': 380}
11]
12
13tabla_ventas = pd.DataFrame(ventas)
14
15tabla_ventas.set_index('categoria', inplace=True)
16
17# Localizar solo aquellos que sean desayunos:
18tabla_ventas.loc['desayunos']
Hojas de cálculo#
Cargar datos desde hoja local#
Se puede abrir una hoja de calculo estableciendo su ruta y convertirla a DataFrame:
Tenemos la siguiente hoja llamada amigos.xlsx:
Nombre |
Apellidos |
Edad |
---|---|---|
Antonio |
Flores Caracas |
23 |
Laura |
Salazar Piraña |
34 |
Iñigo |
Xavier Aguirre |
47 |
Para generar un DataFrame:
1import pandas as pd
2
3# podemos abrir un excel con pandas:
4excel = pd.ExcelFile('amigos.xlsx')
5
6# Elegimos la hoja del excel que queremos trabajar:
7dataframe = excel.parse('Hoja 1')
8
9dataframe
Guardar DataFrame en Excel local#
1import pandas as pd
2
3ventas = [
4 {'producto': 'Zanahorias', 'categoria': 'verduras', 'cantidad': 23, 'beneficio': 1280},
5 {'producto': 'Puerros', 'categoria': 'verduras', 'cantidad': 123, 'beneficio': 640},
6 {'producto': 'Lechugas', 'categoria': 'verduras', 'cantidad': 11, 'beneficio': 380},
7 {'producto': 'Galletas', 'categoria': 'desayunos', 'cantidad': 11, 'beneficio': 380},
8 {'producto': 'Cereales', 'categoria': 'desayunos', 'cantidad': 11, 'beneficio': 380},
9 {'producto': 'Coca cola', 'categoria': 'refrescos', 'cantidad': 11, 'beneficio': 380},
10 {'producto': 'desinfectante', 'categoria': 'limpieza', 'cantidad': 11, 'beneficio': 380}
11]
12
13total_ventas = pd.DataFrame(ventas)
14
15# creamos un archivo excel:
16excel = pd.ExcelWriter('ventas_agosto.xlsx')
17
18# Pasamos el dataframe al excel (archivo excel, nombre hoja, índice si/no):
19total_ventas.to_excel(excel, 'Agosto 2020', index=True) # con el tercer parametro definimos si queremos añadir nuestro propio indice o no.
20
21# guardar el dataframe en el pc:
22excel.save()
Recorrer dataframe con for#
Este es un ejemplo de como convertir un dataframe en JSON:
1import pandas as pd
2
3ventas = [
4 {'producto': 'Zanahorias', 'categoria': 'verduras', 'cantidad': 23, 'beneficio': 1280},
5 {'producto': 'Puerros', 'categoria': 'verduras', 'cantidad': 123, 'beneficio': 640},
6 {'producto': 'Lechugas', 'categoria': 'verduras', 'cantidad': 11, 'beneficio': 380},
7 {'producto': 'Galletas', 'categoria': 'desayunos', 'cantidad': 11, 'beneficio': 380},
8 {'producto': 'Cereales', 'categoria': 'desayunos', 'cantidad': 11, 'beneficio': 380},
9 {'producto': 'Coca cola', 'categoria': 'refrescos', 'cantidad': 11, 'beneficio': 380},
10 {'producto': 'desinfectante', 'categoria': 'limpieza', 'cantidad': 11, 'beneficio': 380}
11]
12
13total_ventas = pd.DataFrame(ventas)
14
15# Preparar un listado:
16json_ventas = []
17
18# recorrer dataframe:
19for i in total_ventas.index:
20 # construir formato y añadir:
21 json_ventas.append({
22 "Producto": total_ventas["producto"][i],
23 "Categoría": total_ventas["categoria"][i],
24 "Cantidad": total_ventas["cantidad"][i],
25 "Beneficio": total_ventas["beneficio"][i]
26 })
27
28print(json_ventas)