Una Mejor Forma De Preprocesar Datos: Pandas Pipe

Soner Yıldırım
Aug 17, 2021

Contents Outline

Una Mejor Forma De Preprocesar Datos: Pandas Pipe

Aug 17, 2021 5 minutes read

Los datos de la vida real suelen ser desordenados. Requieren mucho preprocesamiento para estar listos para su uso. Pandas es una de las librerías de análisis y manipulación de datos más utilizadas y ofrece varias funciones para preprocesar los datos en bruto.

En este artículo, nos centraremos en una función en particular que organiza múltiples operaciones de preprocesamiento en una sola: la función pipe.

Cuando se trata de herramientas y paquetes de software, aprendo mejor trabajando con ejemplos. Lo tengo en cuenta a la hora de crear contenidos. En este artículo haré lo mismo.

Empecemos por crear un marco de datos con datos simulados.


import numpy as np
import pandas as pd
df = pd.DataFrame({
   "id": [100, 100, 101, 102, 103, 104, 105, 106],
   "A": [1, 2, 3, 4, 5, 2, np.nan, 5],
   "B": [45, 56, 48, 47, 62, 112, 54, 49],
   "C": [1.2, 1.4, 1.1, 1.8, np.nan, 1.4, 1.6, 1.5]
})
df


(image by author)

Nuestro dataframe contiene algunos valores perdidos indicados por una representación estándar de valores perdidos (es decir, NaN). La columna id incluye valores duplicados. Por último, pero no menos importante, el 112 de la columna B parece un valor atípico.

Estos son algunos de los problemas típicos de los datos de la vida real. Vamos a crear una tubería que maneje los problemas que acabamos de describir.

Para cada tarea, necesitamos una función. Por lo tanto, el primer paso es crear las funciones que se colocarán en la tubería.

Lea También: Pandas vs SQL. ¿Cuándo Los Científicos de Datos Deben Usar Uno Sobre el Otro?

Es importante tener en cuenta que las funciones utilizadas en la tubería necesitan tomar un marco de datos como argumento y devolver un marco de datos.

La primera función se encarga de los valores perdidos.


def fill_missing_values(df):
   for col in df.select_dtypes(include= ["int","float"]).columns:
      val = df[col].mean()
      df[col].fillna(val, inplace=True)
   return df

Prefiero sustituir los valores que faltan en las columnas numéricas por el valor medio de la columna. Siéntase libre de personalizar esta función. Funcionará en la tubería siempre que tome un marco de datos como argumento y devuelva un marco de datos.

La segunda función nos ayudará a eliminar los valores duplicados.

def drop_duplicates(df, column_name):
   df = df.drop_duplicates(subset=column_name)
   return df

Me ha ayudado la función incorporada de Pandas de eliminar duplicados. Elimina los valores duplicados en la columna o columnas dadas. Además del marco de datos, esta función también toma un nombre de columna como argumento. Podemos pasar los argumentos adicionales a la tubería también.

La última función de la tubería se utilizará para eliminar los valores atípicos.

def remove_outliers(df, column_list):
   for col in column_list:
      avg = df[col].mean()
      std = df[col].std()
      low = avg - 2 * std
      high = avg + 2 * std
      df = df[df[col].between(low, high, inclusive=True)]
   return df

Lo que hace esta función es lo siguiente:
  1. Toma un marco de datos y una lista de columnas
  2. Para cada columna de la lista, calcula la media y la desviación estándar
  3. Calcula un límite inferior y superior utilizando la media y la desviación estándar
  4. Elimina los valores que están fuera del rango definido por el límite inferior y superior

Al igual que las funciones anteriores, puede elegir su propia forma de detectar los valores atípicos.

Lea también: Usando Python y Pandas Datareader Para Analizar Datos Financieros

Ahora tenemos 3 funciones que manejan una tarea de preprocesamiento de datos. El siguiente paso es crear una tubería con estas funciones.

df_processed = (df.
                pipe(fill_missing_values).
                pipe(drop_duplicates, "id").
                pipe(remove_outliers, ["A","B"]))

Esta tubería ejecuta las funciones en el orden dado. Podemos pasar los argumentos a la tubería junto con los nombres de las funciones.

Una cosa que hay que mencionar aquí es que algunas funciones de la tubería modifican el marco de datos original. Por lo tanto, si se utiliza la tubería como se ha indicado anteriormente, también se actualizará df.

Una opción para superar este problema es utilizar una copia del marco de datos original en la tubería. Si no le importa mantener el marco de datos original tal como está, puede simplemente utilizarlo en la tubería.

Actualizaré la tubería como se indica a continuación:

my_df = df.copy()
df_processed = (my_df.
                pipe(fill_missing_values).
                pipe(drop_duplicates, "id").
                pipe(remove_outliers, ["A","B"]))

Veamos los marcos de datos originales y procesados:


df (image by author)


df_processed (image by author)


Conclusion

Por supuesto, se pueden realizar las mismas tareas aplicando estas funciones por separado. Sin embargo, la función pipe ofrece una forma estructurada y organizada de combinar varias funciones en una sola operación.

Dependiendo de los datos brutos y de las tareas, el preprocesamiento puede incluir más pasos. Puede añadir tantos pasos como necesite en la función pipe. A medida que el número de pasos aumenta, la sintaxis se vuelve más limpia con la función pipe en comparación con la ejecución de funciones por separado.

Gracias por leer. Por favor, hágame saber si tiene algún comentario.

Lea también:
- Usando Pandas Profiling Para Acelerar Nuestra Exploración de Datos
- Lo Esencial De Pandas Para La Ciencia De Datos
Join our private community in Discord

Keep up to date by participating in our global community of data scientists and AI enthusiasts. We discuss the latest developments in data science competitions, new techniques for solving complex challenges, AI and machine learning models, and much more!