Análisis de datos#

Logo Pandas

Análisis de datos con diferentes tecnologías

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)