5. Pandas

Pandas es una librería en cierto sentido similar a NumPy. Pero si NumPy únicamente contiene vectores, matrices, tensores ,etc junto con operaciones matemáticas. Con pandas tenemos mas cosas como nombrar a las columnas con un nombre , incluir un índices o generación de gráficas.

Mas información:

Libro de Pandas

Practical Tutorial on Data Manipulation with Numpy and Pandas in Python

12 Amazing Pandas & NumPy Functions

Cleaning Your Data Using Pandas

Pandas Data Wrangling Cheat Sheet 2021

Análisis Exploratorio de Datos (EDA) con pandas_profiling

Error-free import of CSV files using Pandas DataFrame

10 Tricks for Converting Numbers and Strings to Datetime in Pandas

Analyzing Panel Data in Pandas

Be a more efficient data analyst, a comprehensive guide to pandas

Differences Between concat(), merge() and join() with Python

Simple ways to manipulate datetime variables with pandas

Importación

Importar pandas

DataFrames

Crear un DataFrame a partir de la matriz de datos y el nombre de las columnas con DataFrame

La función zip es similar a np.column_stack de numpy pero ha usado zip en vez de column_stack ya que hay datos de tipos string. Si todos los datos hubieran sido números de podría haber usado column_stack

Añadir una nueva fila al DataFrame con append.

Mas información:

Función Pandas DataFrame DataFrame.append()

Acceso a disco

Guardar los datos de un DataFrame

Es importante añadir index=False ya que sino creará en disco una columna extra con el nº de la fila a modo de índice

Cargar los datos desde un fichero de texto llamado "datos.csv" y cuyo separador es una coma.

Si al guardar los datos NO se añadió el parámetro index=False ,al leer el fichero se deberá añadir el parámetro index_col=0

Cargar los datos desde una base de datos relacional

Crear un DataFrame desde una base de datos relacional es tan sencillo como crear la conexión con sqlalchemy.create_engine y luego con pandas llamar a read_sql.

Previamente hay que instalar sqlalchemy con:

Información

Información general del DataFrame

Dimensión de los datos (filas y columnas)

Mostrar las primeras filas

Mostrar las últimas filas

Estadística

Estadística descriptiva

Media de una columna

Desviación estándar de una columna

Suma de una columna

Máximo de una columna

Mínimo de una columna

Correlación entre columnas

Acceder a los datos

Lo normal es que queramos acceder a los datos siempre por columnas. Así que explicaremos únicamente esa forma.

Acceder a una columna.

Las tres formas son equivalentes pero fíjate que al usar la función loc hay que indicar que queremos todas las filas para ello usamos el :

Acceder a varias columnas

Acceder a todas las columnas excepto a una concreta (se usa para no acceder a la columna del resultado)

Acceder a todas las columnas

Acceder a una columna por índice

Acceder a la última columna por índice

Acceder a varias columnas por índice

Columnas

Obtener el nombre de todas las columnas

Obtener el nº de columnas

Obtener el nombre de la columna por el Nº de columna

Cambiar el nombre de una columna con rename. Se pasa un diccionario cuya clave es el nombre actual y el valor es el nuevo nombre.

Notar que al indicar inplace=True se hace la modificación en el propio DataFrame y no hace falta asignarlo a otro nuevo DataFrame Lo normal es que la columna a predecir la llamemos target

Reordenar las columnas con reindex

Notar que es necesario asignar el DataFrame a un nuevo DataFrame Lo normal es que la columna a predecir se ponga al final

Añadir la nueva columna velocidad al inicio del DataFrame

Añadir la nueva columna velocidad antes del "precio"

Añadir una nueva columna calculada

Modificar una columna

Borrar la columna llamada calculada

Filtrado

Filtrar por una condición: Cuyo tipo es "SSD"

Filtrar por dos condiciones: Cuyo tipo es "SSD" y el precio es menor que 100

Lo que retornan estos métodos es un nuevo DataFrame así que se pueden aplicar todos los métodos de los DataFrame.

Valores únicos

Datos inválidos

Vamos ahora a crear un DataFrame con datos inválidos.

Obtener el número de datos a NaN o None de cada columna

Borrar aquellas filas que tiene el valor NaN o None

Gráficas con Seaborn

Con dataframes lo sencillo usar seaborn

Scatter plot por el tipo

KDE

KDE por el tipo

Histograma por tipo

Pair plot

Ejercicios

Ejercicio 1.A

Crea un DataDrame con los datos que proporciona load_iris. Recuerda que la propiedad feature_names retorna los nombres. La columna de los tipos de flor la debes llamar tipo_flor

Grábalo a disco y mira el fichero resultante.

Ahora prueba a cargarlo

Grábalo a disco con otro nombre pero ahora sin el parámetro index=False y mira la diferencia con el anterior fichero.

Ahora prueba a cargarlo

Muestra el nombre de las columnas y los tipos de datos de cada una de ellas.

Imprime por pantalla "El nº de número de características es: NNNNN y el número de muestras es: NNNNNN"

Imprime por pantalla las primeras filas

Imprime por pantalla las últimas filas

¿Cuando ocupa en memoria el DataFrame?

Ejercicio 1.B

Siguiendo con el DataFrame anterior imprime por pantalla:

El tamaño medio del ancho del pétalo

La desviación del ancho del pétalo

El máximo ancho del pétalo

El mínimo ancho del pétalo

Ejercicio 1.C

Siguiendo con el DataFrame anterior:

Imprime por pantalla el nombre de las columnas como un array

Imprime por pantalla el nombre de la primera columna

Imprime por pantalla el número de columnas que hay.

Cambia el nombre de la columna "tipo_flor" por el de "target"

Mueve la columna "target" al final del DataFrame

Inserta una nueva columna que sea el área del pétalo. Deberás insertarla antes de la última columna.

Inserta una nueva columna que sea el área del sépalo. Deberás insertarla antes de la última columna.

Ejercicio 1.D

Siguiendo con el DataFrame anterior imprime por pantalla:

El ancho del pétalo de las flores de tipo "0" pero cuyo largo del pétalo sea entre [1.3,1.9]

El ancho del sépalo de las flores de tipo "1"

Indica los tipos de flores que hay.

Indica cuantos valores de la columna "target" son "null"

Indicar cuantos valores del DataFrame son "null"

¿Como se borrarían aquellas filas que tienen algún datos que es null?

Ejercicio 1.E

Siguiendo con el DataFrame anterior y usando Seaborn:

Muestra un scatter plot del ancho del pétalo en el eje X y el ancho del sépalo en el eje Y según el tipo de flor.

Muestra el gráfico KDE de la distribución del largo del pétalo y del largo del sépalo.

Muestra el gráfico KDE de la distribución del largo del pétalo y del largo del sépalo pero separado por el tipo de flor.

Muestra un pairplot

Ejercicio 2.A

Descarga el siguiente fichero tiempos_red_neuronal.csv que contiene los segundos que ha tardado en entrenarse una red neuronal según el nº de épocas y la función de activación usada

Abre el fichero con un editor de texto y comprueba que formato tiene

Carga el fichero con pandas

Muestra las columnas que tiene

Renombra la columna talla a epoca

Muestra cuantas filas hay

Muestra cuantos valores son null o NaN en cada columna

Muestra el % de valores a null o NaN en cada columna

Borra las filas que tengan algún valor a null o NaN

Muestra las estadísticas de cada columna. ¿Podrías borrar alguna? ¿Explica porqué? En caso afirmativo borra la columna

Indica que funciones de activación se han usado

Indica hasta cuantas épocas se ha entrenado la red

Indica la función de activación que ha tenido el mayor tiempo en la última época

Ejercicio 2.B

Siguiendo con el DataFrame anterior:

Muestra un scatter plot

Eje X:Época

Eje Y:Tiempo

Separa los datos por colores según la función de activación

Añade un título al gráfico y a los 2 ejes.

¿Ves algo raro en los datos?

Ejercicio 2.C

Siguiendo con el DataFrame anterior:

Haz una regresión lineal de los datos para cada tipo de activación.

Haz un gráfico que:

Muestre la recta de la regresión de cada función de activación.

En la etiqueta de cada función de activación se muestre también el valor de R² para cada uno de ellos.

Ejercicio 2.D

Siguiendo con el DataFrame anterior:

La gráfica no deja claro cda una de las rectas. Para mejorarlo se podría anotar al final de cada recta el nombre de la función de activación tal y como se muestra en el siguiente gráfico:

Para poner texto en una gráfica se usa el método annotate