Preparar los datos con Pandas y NumPy

Pandas, la librería de Python imprescindible para la manipulación de datos

Ahora estamos listos para explorar y analizar nuestros datos. Para ello, nos apoyaremos en uno de los módulos más imprescindibles de Python: Pandas.

Pandas es la librería de Python para manipular y analizar datos. Fue creada en 2008 por Wes McKinney, un estadístico y desarrollador de Python. Esta librería se ha ido consolidando poco a poco como un elemento esencial para la gestión de datos y ha contribuido a hacer de Python un referente en este campo.

1. Instalación

Para empezar, asegurémonos de que esté bien instalada. Si no es así, validemos la siguiente línea en un símbolo del sistema:

pip install pandas 

Una vez instalada, basta con importarla:

import pandas as pd 

El alias pd se usa comúnmente para simplificar los comandos relacionados con Pandas y sirve para asegurarse de que los comandos de Pandas que ejecutemos a continuación se refieran a ella.

2. Estructura y tipo de datos

Antes de usarla, dediquemos unos momentos a explicar las diferentes estructuras que puede tomar Pandas. La que todo el mundo tiene en mente es el DataFrame de dos dimensiones que parece una hoja de cálculo de Excel, pero, en realidad, hay un tipo por dimensión:

Nombre de la estructura

Número de dimensiones

Principio

Series

1

Datos unidimensionales indexados

DataFrames

2

Hoja de cálculo con filas y columnas

Panels

3

Colección de DataFrames

DataFrames multi-index...

NumPy, el pilar del cálculo numérico

NumPy es una librería fundamental para el cálculo científico en Python, que actúa como una infraestructura básica para muchas otras librerías. Tomémonos el tiempo para ver juntos qué lo hace fuerte y por qué es omnipresente en los módulos de Python.

1. La estructura ndarray

El ndarray, abreviatura de N-dimensionnal array, está realmente en el núcleo de la librería Nupy. También se proponen otras dos estructuras, la matriz y los escalares, pero centraremos nuestra atención en el ndarray, ya que su papel es central.

Preste atención: muchos nombres diferentes se pueden referir a un ndarray. El término tabla es la forma genérica para calificarlos, pero podemos encontrarnos con el término vector para ndarrays de una dimensión o matriz para los que tienen dos. Más allá de dos dimensiones, es común encontrarse con los nombres: array, NDArray o tensor.

Empecemos por estudiar las características de esta estructura fundamental de NumPy.

a. Una estructura homogénea

En primer lugar, es una tabla multidimensional homogénea, es decir, puede tener tantas dimensiones como se desee, con la restricción de que todos los datos sean del mismo tipo. He aquí una manera fácil de crear un vector ndarray a partir de una simple lista de Python:

import numpy as np  
a = [1, 2, 3, 4, 5]  
array_numpy = np.array(a)  
print(array_numpy.dtype)  
  
# Output: int64 

En cuanto a la obligación de homogeneidad mencionada anteriormente, se debe tener en cuenta que la introducción de un miembro de tipo coma flotante conduce de facto al cambio del tipo de todo el ndarray:

array_numpy_2 = np.array([1.0, 2, 3, 4, 5])  
print(array_numpy_2.dtype)  
  
# Output: float64 

Este ejemplo solo tenía como objetivo crear un ndarray a partir de una estructura familiar. Ahora que ya tenemos confianza, veamos cómo crearlo directamente:

inicio = 0  
fin = 10 #valor no incluido  
incremento = 2  
array_numpy = np.arange(inicio, fin, incremento) 
# El incremento puede ser decimal  
  
print(array_numpy)  
# Output: [0 2 4 6 8] 

Y el abanico de posibilidades no se detiene ahí. El comando...

Recogida de datos

Es bueno definir el archivo de trabajo antes de empezar. De hecho, la importación y la exportación de archivos de todo tipo será habitual, y establecer el camino de una vez por todas hará que no tengamos que repetirlo.

Esto podemos hacerlo gracias a la librería os, cuyo acrónimo corresponde a Operating System. De hecho, es una librería estándar, pero esencial para interactuar con el sistema operativo y manipular archivos y carpetas, incluida, en nuestro caso, la administración de rutas de acceso.

La definición de la carpeta de trabajo se realiza de la siguiente manera:

import os  
os.chdir(r"D:\ENI\CAP_03") 

La «r» antes de las comillas es importante porque le dice al sistema que es una cadena sin procesar, lo que impide la interpretación de caracteres como \n, que se refiere al salto de línea, o \t, que crea una tabulación.

Podemos verificar que la carpeta se ha configurado de esta manera:

os.getcwd()  
# Output: 'D:\\ENI\\CAP_03' 

Para aquellos que deseen utilizar notebooks de Google Colab, el método requiere un paso adicional porque primero debe declarar la carpeta del Drive.

from google.colab import drive  
drive.mount(r'/content/gdrive') 

Una vez ejecutadas estas dos líneas, aparecerán sucesivamente cuatro pantallas:

  • Pantalla 1: haga clic en Conectara Google Drive.

  • Pantalla 2: haga clic en la cuenta de correo electrónico que quiere utilizar.

  • Pantalla 3: el título de la pantalla es Iniciar sesión en Google Drive for desktop. Haga clic en Continuar.

  • Pantalla 4: el título de la pantalla es Google Drive desea acceso adicional a su cuenta de Google. Haga clic en Continuar.

Después de estos cuatro pasos, el acceso a la unidad está activo y podemos usar el procedimiento anterior para configurar la carpeta de trabajo.

1. Adquisición y control de los datos

Ahora veamos cómo acceder a nuestros datos. Asegúrese de colocar previamente nuestros archivos de datos en la carpeta de trabajo (o en una subcarpeta).

a. Formatos de archivo de datos clásicos

Utilizaremos Pandas para adquirir nuestros datos. La librería puede leer casi todos los tipos de archivos (Excel, CSV, TXT, JSON, SQL, etc.). He aquí una tabla resumida de los comandos que comienzan, todos, por read_:

Tipo de archivo

Extensión...

Limpieza de datos

La limpieza de datos es casi sistemática. Resulta extremadamente raro poder eludirla. Pero ¿qué se entiende por limpieza?

La limpieza de datos es el proceso de seleccionar, corregir y organizar los datos para eliminar errores e incoherencias. Esto resulta esencial para garantizar la calidad y la fiabilidad de los análisis posteriores.

Veamos cómo llevar a cabo este proceso paso a paso.

1. Selección de datos

Los datos que utilizamos no se deben tomar necesariamente en su totalidad. Dependiendo del trabajo que vayamos a realizar, no todos son necesarios. Por ejemplo, si queremos realizar un análisis de los productos vendidos por una determinada marca, de nada servirá conservar las demás marcas presentes en la base de datos. Es importante empezar por ahí, porque limpiar los datos innecesarios sería una pérdida de tiempo.

Estas son las diferentes formas de seleccionar las filas de interés:

# Seleccionar la marca AAA 
df_marca = df[df["Marca"] == "AAA"]  
  
# Seleccionar los departamentos 14 y 78  
df_departements = df[df["Departamento"].isin([14,78])]  
  
# Seleccionar los departamentos 14 y 78 para el mes de mayo  
df_departements2 = df[(df["Departamento"].isin([14,78])) &  
(df["Mes"]=="mayo")]  
  
# Seleccionar los departamentos 14 y 78 para el mes de mayo con query 
df_departements3 = df.query("Departamento.isin([14, 78]) &  
Mes=='mayo'") 

Reducir el número de filas por selección también puede ayudar a mejorar la tasa de relleno de las variables.

De manera recíproca, no todas las variables son obligatoriamente necesarias. Empecemos por los casos más sencillos, es decir, aquellos que podemos eliminar sin hacer ninguna pregunta. Es el caso de las variables que están completamente vacías o tienen una sola modalidad distinta, excluyendo así las variables con una modalidad y los valores ausentes que podrían representar potencialmente otra modalidad. Estas variables, que no varían, se pueden eliminar directamente. Esta es la manera fácil de identificar variables vacías:

# Recuperar el nombre de las variables vacías 
empty_variables = df.columns[df.isna().all()].tolist()...