Transformación de datos con Python | audacia
Cuando se trabaja con datos, ya sea para análisis o aplicaciones de ciencia de datos, un paso clave en la canalización de ETL es la transformación de datos. La transformación de datos con Python es una habilidad esencial para los ingenieros de datos que incluye tres amplias categorías: manipular la forma de los datos; características de ingeniería en los datos; y transformar valores de datos.
La biblioteca de Python Pandas contiene una amplia variedad de funciones para manipular datos, incluidas herramientas para lograr los tres tipos de transformaciones.
En este artículo, revisaremos lo que significa cada una de las tres categorías de transformación y luego veremos ejemplos en Python usando Pandas.
Contenido
¿Qué es transformar datos?
Tanto los procesos ETL como ELT tienen la letra «T» que significa «transformación». Durante el paso de transformación, el ingeniero de datos realizará tres categorías de transformaciones:
1. Manipular la forma de los datos
Este tipo de transformación de datos es una oportunidad para formar los datos de manera que sean adecuados para un propósito previsto. Ejemplos específicos pueden ser reordenar y seleccionar filas; renombrar y seleccionar columnas; eliminando valores duplicados; o el manejo de valores faltantes.Además, las transformaciones a gran escala pueden incluir el cambio de un formato ancho a largo o largo a ancho.
El objetivo es tener un conjunto de datos listos para ser analizados, ya sea en un informe, un modelo estadístico o un modelo de aprendizaje automático.
2. Funciones de ingeniería en los datos
Este tipo de transformación de datos genera nuevos valores de datos basados en valores existentes. Este es un paso importante para muchos ejercicios avanzados de modelado estadístico y de aprendizaje automático. Los ejemplos de ingeniería de características incluyen la creación de nuevas variables; reemplazando valores; o combinar o dividir valores.
El objetivo es generar columnas de datos apropiadas para ayudar a un estadístico aplicado o ingeniero de aprendizaje automático a crear modelos eficientes y efectivos para responder preguntas explícitas sobre los datos.
3. Transformar valores de datos
El último tipo de transformación de datos consiste en modificar los valores de los datos para crear una distribución adecuada para el análisis. Por ejemplo, un conjunto de valores en un conjunto de datos puede estar severamente sesgado o escalado de manera inconsistente. Los ejemplos de transformación de valores de datos incluyen transformaciones logarítmicas, de raíz cuadrada o cúbica; estandarización o normalización de datos; o eliminación de valores atípicos.
El objetivo es crear valores de datos adecuados para varios algoritmos estadísticos y de aprendizaje automático.
Cómo transformar datos con Python usando Pandas.
Pandas es una importante biblioteca de Python para todas las tareas de transformación de datos. La biblioteca contiene una amplia variedad de herramientas para manipular datos. En las siguientes secciones, verá una variedad de funciones con las que todo ingeniero de datos debería sentirse cómodo.
Los ejemplos de código a continuación utilizarán este archivo de datos: student_data.csv, que es un conjunto de datos falso para los fines de este artículo. Este código leerá los datos en una variable llamada df que se usará a lo largo de este artículo. Para algunas transformaciones, crearemos una copia del marco de datos solo por conveniencia.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.read_csv("student_data.csv")
display(df)

Cómo manipular la forma de los datos.
Cambiar la forma de los datos es uno de los casos de uso más comunes cuando se transforman datos usando Python. A menudo, los datos sin procesar deben formarse, remodelarse o limpiarse para que los utilice un analista de datos o un científico de datos.
Ordenar y filtrar
A menudo, el orden de los datos es importante, especialmente cuando se inspeccionan conjuntos de datos manualmente. Además, puede ser útil filtrar el conjunto de datos y usar solo filas o columnas de datos particulares. Para ello, utilizaremos las siguientes funciones de pandas: sort_values
, query
y filter
.
#Sort by name
sorted = df.sort_values(by=['name'])
display(sorted)

#Filter rows
just_students = df.query('is_student==True')
display(just_students)

#Filter columns
no_birthday = df.filter(['name','is_student','target'])
display(no_birthday)

Eliminar duplicados y valores vacíos/no válidos
Un desafío común con los conjuntos de datos sin procesar son las filas de datos duplicadas. Alternativamente, puede haber filas con solo datos parciales. Ambas condiciones pueden generar conclusiones no válidas de los modelos estadísticos y de aprendizaje automático.
El siguiente código muestra cómo encontrar y eliminar filas duplicadas usando el duplicated
y drop_duplicates
funciones Además, vemos una técnica para manejar valores perdidos llamada «eliminación por lista» usando el dropna
función. Primero, usaremos el isna
función para encontrar valores faltantes. Tenga en cuenta que el manejo de los datos faltantes es un tema amplio y, por brevedad, solo cubrimos este método, pero hay muchas otras formas de manejar los valores faltantes en un conjunto de datos.
#Remove duplicates
display(df.duplicated())
dups_removed = df.drop_duplicates()
display(dups_removed)

#Remove NA
display(df.isna())

listwise_deletion = df.dropna(how='any')
display(listwise_deletion)

Cambiar el nombre de las columnas
A veces, un conjunto de datos sin procesar tendrá nombres de columna que tienen sentido para el propietario original de los datos, pero pueden no tener sentido en un sentido analítico más amplio. La función de cambio de nombre nos permite cambiar los nombres de las columnas a algo más apropiado para el analista de datos o el científico de datos.
#Rename column
renamed = df.rename(columns={'target':'target_score'})
display(renamed)

Formatos anchos y largos
Los conjuntos de datos se pueden formatear en formato ancho o largo. Los formatos anchos son conjuntos de datos que contienen medidas o valores repetidos en una sola fila. Por ejemplo, un solo registro puede contener valores para los cuatro trimestres de un año en cuatro columnas separadas. Los formatos largos repetirán las columnas de identificación (id, nombre, etc.) y luego agregarán las medidas repetidas en su propia fila, de modo que cada trimestre tenga su propia fila. Cambiando de ancho a largo podemos usar el melt
función y de largo a ancho podemos usar el pivot
función.
#Wide to long
long = pd.melt(dups_removed, id_vars=['participant_id', 'name'], value_vars=['Q1','Q2','Q3','Q4'], var_name="quarter", value_name="clicks")
display(long)

#Long to wide
wide = pd.pivot(long, index=['participant_id', 'name'], columns="quarter", values="clicks")
display(wide)

Cómo diseñar características en los datos.
La ingeniería de características es el proceso de transformar datos sin procesar en características que se pueden usar en el modelado.
Por ejemplo, los datos sin procesar pueden contener un conjunto de valores continuos, pero para su modelo, solo necesita saber si el valor está por encima de cierto umbral. Puede diseñar una función llamada «exceeds_threshold» que contiene un 1 o un 0 según la condición.
Los ejemplos de código a continuación continuarán usando el mismo conjunto de datos que usamos en la sección anterior.
Nuevas variables
Otro ejemplo común de creación de una nueva variable es cuando un conjunto de datos contiene fechas de nacimiento. Una característica más útil podría ser la «edad» en lugar de usar la fecha de nacimiento sin procesar. El siguiente código primero crea una función para calcular la edad y luego crea una nueva columna para contener estos datos.
#New Variable
from dateutil.relativedelta import *
from datetime import *
def get_age(dob):
now = datetime.now()
age = relativedelta(now, dob).years
return age
df['age'] = pd.to_datetime(df['dob']).apply(get_age)
display(df)

Reemplazar valores
A veces, los valores en un conjunto de datos deben reemplazarse con algo más (o menos) significativo. En el siguiente ejemplo, estamos ofuscando el apellido de la persona usando una expresión regular para reemplazar todo lo que está después del espacio con ‘APELLIDO’.
#Replacing values
obfuscated = df.copy()
obfuscated['name'] = obfuscated['name'].replace(to_replace="s(.*)", value=" LASTNAME", regex=True)
display(obfuscated)

Dividir y combinar
A menudo, cuando se trabaja con columnas de texto, los datos deben dividirse o combinarse de varias formas. El siguiente código demuestra cómo la columna de nombre se puede dividir en nombre y apellido. El siguiente bloque de código muestra cómo recombinar el nombre y el apellido usando la convención ‘apellido, primero’.
#Splitting
splitnames = df.copy()
split = splitnames['name'].str.split(' ', expand = True)
splitnames['first'] = split[0]
splitnames['last'] = split[1]
display(splitnames)

#Combining
splitnames['lastfirst'] = splitnames['last'] + ', ' + splitnames['first']
display(splitnames)

Cómo transformar valores de datos.
A menudo, los estadísticos aplicados y los ingenieros de aprendizaje automático necesitan que los valores numéricos de los datos se transformen para respaldar mejor las suposiciones de los modelos seleccionados. Además, muchos modelos necesitan datos que se escalan adecuadamente para el análisis.
Del conjunto de datos que hemos estado usando, veamos la distribución de la columna de destino.

#Data Value transforms
df['target'].hist()

Podemos ver que estos datos no se ajustan a una distribución normal, que es una suposición común para muchos modelos. En las siguientes secciones, veremos algunas transformaciones comunes para ver si podemos transformar este conjunto de datos en una distribución más adecuada.
Transformaciones de distribución
El siguiente código muestra varias transformaciones de distribución diferentes y la forma resultante de la nueva distribución.
El siguiente código muestra una transformación de registro de los datos anteriores. Por lo general, usaríamos una transformación de registro para datos sesgados a la derecha en lugar de datos sesgados a la izquierda y vemos que el efecto es el opuesto al que nos gustaría, ya que aumenta la asimetría.
#Log transform
transforms = df.copy()
transforms['log'] = transforms['target'].transform(np.log10)
transforms['log'].hist()

Por el contrario, el siguiente código usa una transformación de cubo que da como resultado menos sesgo en los datos resultantes. Esto puede o no ser aceptable según el modelo que se utilice, por lo que un ingeniero de datos deberá trabajar con el científico de datos para encontrar la mejor solución. Por lo general, se puede usar alguna combinación de transformaciones logarítmicas, raíces o de potencia para remodelar una distribución.
#Cube transform
transforms = df.copy()
transforms['cube'] = transforms['target'].transform(lambda x: np.power(x, 3))
transforms['cube'].hist()

Transformaciones de escala.
Cuando se trabaja con columnas de datos que tienen unidades o escalas variables, existen dos métodos principales para escalar los datos para que las columnas se puedan comparar razonablemente.
Normalización de datos transforma cada valor a un valor entre 0 y 1.
Estandarización de datos transforma cada valor de modo que la distribución tenga una media de 0 y una desviación estándar de 1.
Ambas formas de escalado tienen funciones especiales construidas en Python en scikitlearn
para hacer esto; sin embargo, el siguiente código muestra cómo hacer estas transformaciones usando solo numpy
.

#Normalizing
scaling = df.copy()
min_target = np.min(scaling['target'])
max_target = np.max(scaling['target'])
scaling['norm_target'] = (scaling['target'] - min_target) / (max_target - min_target)
display(scaling)


#Standardizing
scaling = df.copy()
mean_target = np.mean(scaling['target'])
sd_target = np.std(scaling['target'])
scaling['standardized_target'] = (scaling['target'] - mean_target) / (sd_target)
display(scaling)

Aprende a codificar con Udacity.
La transformación de datos con Python es una habilidad fundamental para cualquier ingeniero de datos en un entorno de ciencia de datos moderno. En este artículo, explicamos qué significa transformar datos, incluidas tres categorías diferentes de transformación de datos, y luego exploramos ejemplos de cada uno de estos tipos de transformación de datos.
¿Quiere realmente llevar sus habilidades de ingeniería de datos al siguiente nivel? El programa Programación para ciencia de datos con Python Nanodegree es su próximo paso. Te enseñaremos a trabajar en el campo de la ciencia de datos utilizando las herramientas fundamentales de programación de datos: Python, SQL, línea de comandos y git.
COMIENZA A APRENDER