Procesamiento Básico de Datos con Python

Avatar Tutor | marzo 7, 2022

Los requisitos de programación en la ciencia de datos exigen un lenguaje muy versátil pero flexible que sea simple para escribir el código pero que pueda manejar un procesamiento matemático altamente complejo. Python es más adecuado para estos requisitos, ya que ya se ha establecido como un lenguaje para la informática general y científica. 

Además, se está actualizando continuamente en forma de una nueva adición a su gran cantidad de bibliotecas destinadas a diferentes requisitos de programación.

Los siguientes, son fragmentos de Python que pueden ser útiles para principiantes para algunas tareas de procesamiento de datos diferentes.

Las tareas del procesamiento de datos van desde procesamiento de texto y listas básico a procesamiento de conjunto de datos con Pandas.

Concatenar varios archivos de texto

Comencemos con la concatenación de varios archivos de texto. Si tienes varios archivos de texto en un solo directorio que necesitas concatenar en un solo archivo, este código Python lo hará.

Primero obtenemos una lista de todos los archivos txt en la ruta; luego leemos en cada archivo y escribimos su contenido en el nuevo archivo de salida; finalmente, volvemos a leer el nuevo archivo e imprimimos su contenido en la pantalla para verificarlo.

import glob 
# Cargar todos los archivos txt en la ruta 
files = glob.glob ('/ path / to / files / *. txt') 
# Concatenar archivos a un nuevo archivo 
with open('2020_output.txt', 'w') as out_file:
    for file_name in files:
        with open(file_name) as in_file:
            out_file.write(in_file.read())
# Leer archivo e imprimir 
with open('2020_output.txt', 'r') as new_file:
    lines = [line.strip() for line in new_file]
for line in lines:
    print(line)

Imprimiendo pantalla verás

archivo 1 línea 1 

archivo 1 línea 2 

archivo 1 línea 3 

archivo 2 línea 1 

archivo 2 línea 2 

archivo 2 línea 3 

archivo 3 línea 1 

archivo 3 línea 2 

archivo 3 línea 3

Concatenar varios archivos CSV en un marco de datos

Siguiendo con el tema de la concatenación de archivos, esta vez abordemos la concatenación de varios archivos de valores separados por comas en un solo marco de datos de Pandas.

Primero obtenemos una lista de los archivos CSV en nuestra ruta; luego, para cada archivo en la ruta, leemos el contenido en su propio marco de datos; luego, combinamos todos los marcos de datos en un solo marco; finalmente, imprimimos los resultados para inspeccionar.

import glob 
# Cargar todos los archivos csv en la ruta 
files = glob.glob ('/ path/to/files/ *. csv') 
# Crear una lista de dataframe, una serie por CSV 
fruit_list = [] 
for file_name in files: 
    df = pd.read_csv (file_name, index_col = None, header = None) 
    fruit_list.append (df) 
# Crear un marco combinado a partir de la lista de marcos individuales 
fruit_frame = pd.concat (fruit_list, axis = 0, ignore_index = True) 
print (fruit_frame)

Aplanar listas

Quizás tengas una situación en la que estés trabajando con una lista de listas, es decir, una lista en la que todos sus elementos también sean listas. Este fragmento tomará esta lista de listas incrustadas y la acoplará a una lista lineal.

Primero crearemos una lista de listas para usar en nuestro ejemplo; luego usaremos listas por comprensión para aplanar la lista de una manera Pythonic; finalmente, imprimimos la lista resultante en la pantalla para su verificación.

# Creación de lista de listas (una lista donde todos sus elementos son listas)
list_of_lists = [['manzana', 'pera', 'plátano', 'uvas'], ['cebra', 'burro', 'elefante', 'vaca'],['vainilla', 'chocolate'], ['princesa', 'Príncipe']]
# Aplanar la lista de listas en una sola lista
flat_list = [element for sub_list in list_of_lists for element in sub_list]
# Imprime ambos para comparar
print(f'List of lists:\n{list_of_lists}')
print(f'Flattened list:\n{flat_list}')

Imprimiendo pantalla verás

Lista de listas: 

[[‘manzana’, ‘pera’, ‘plátano’, ‘uvas’], [‘cebra’, ‘burro’, ‘elefante’, ‘vaca’], [‘vainilla’, ‘chocolate’] , [‘princesa’, ‘príncipe’]] 

Lista plana: 

[‘manzana’, ‘pera’, ‘plátano’, ‘uvas’, ‘cebra’, ‘burro’, ‘elefante’, ‘vaca’, ‘vainilla’ , ‘chocolate’, ‘princesa’, ‘príncipe’]

Ordenar lista de tuplas

Este fragmento considerará la idea de ordenar tuplas según el elemento especificado. Las tuplas son una estructura de datos de Python que a menudo se pasa por alto y son una excelente manera de almacenar datos relacionados sin usar un tipo de estructura más complejo.

En este ejemplo, primero crearemos una lista de tuplas de tamaño 2 y las llenaremos con datos numéricos; a continuación clasificaremos los pares, por separado por el primer y segundo elemento, imprimiendo los resultados de ambos procesos de clasificación para inspeccionar los resultados; finalmente, ampliaremos esta clasificación a elementos de datos alfanuméricos mixtos.

# Algunos datos emparejados
pares = [(1, 10.5), (5, 7.), (2, 12.7), (3, 9.2), (7, 11.6)]
# Ordenar pares por primera entrada
sorted_pairs = sorted (pares, clave = lambda x: x [0])
print (f'Ordenado por elemento 0 (primer elemento): \ n {sorted_pairs} ')
# Ordenar pares por segunda entrada
sorted_pairs = sorted (pares, clave = lambda x: x [1])
print (f'Ordenado por elemento 1 (segundo elemento): \ n {sorted_pairs} ')
# Extiende esto a tuplas de tamaño n y entradas no numéricas
pares = [('banana', 3), ('manzana', 11), ('pera', 1), ('sandía', 4), ('fresa', 2), ('kiwi', 12) ]
sorted_pairs = sorted (pares, clave = lambda x: x [0])
print (f'Apares alfanuméricos ordenados por elemento 0 (primer elemento): \ n {sorted_pairs} ')

Imprimiendo pantalla verás

Ordenado por elemento 0 (primer elemento):

[(1, 10,5), (2, 12,7), (3, 9,2), (5, 7,0), (7, 11,6)]

Ordenado por elemento 1 (segundo elemento):

[(5, 7.0), (3, 9.2), (1, 10.5), (7, 11.6), (2, 12.7)]

Pares alfanuméricos ordenados por elemento 0 (primer elemento):

[(‘manzana’, 11), (‘plátano’, 3), (‘kiwi’, 12), (‘pera’, 1), (‘fresa’, 2), (‘sandía’, 4)]

Procesamiento de datos con Pandas

Trabajaremos con un conjunto de datos de 310 empleados activos y despedidos junto con información como estado civil, género, departamento, tasa de pago, estado, puesto, etc. 

Análisis Básico

import numpy as np
import pandas as pd
import datetime
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.pipeline import make_pipeline
from feature_engine import missing_data_imputers as mdi
from feature_engine import categorical_encoders as ce
from sklearn.model_selection import train_test_split
%matplotlib inline
with open('HRDataset.csv') as f:
    df = pd.read_csv(f)
f.close()
df.head()
df.info()

Al cargar nuestros datos, podemos ver una serie de tipos de características únicas. Tenemos características categóricas como “Employee_Name” y “Position”. Tenemos funciones binarias como “MarriedID”. Tenemos características continuas como “PayRate” y “EmpSatisfaction”.

Tenemos funciones discretas como “DaysLateLast30” y finalmente tenemos funciones de fecha como “LastPerformanceReview_Date”.

Variabilidad de características alta o baja

El primer paso que suelo dar es revisar el recuento único de valores por característica para determinar si alguna característica se puede eliminar rápidamente debido a una variabilidad muy alta o muy baja.

En otras palabras, ¿tenemos características que tengan tantos valores únicos como la longitud del conjunto de datos o características que tengan un solo valor único?

for col in df.columns:
  print(col, df[col].nunique(), len(df))

Podemos eliminar con seguridad “Employee_Name”, “Emp_ID”, “DOB” ya que la mayoría, si no todos, los valores son únicos para cada función. Además, podemos eliminar “DaysLateLast30” ya que esta característica solo contiene un valor único.

df.drop(['Employee_Name'], axis=1, inplace=True)
df.drop(['EmpID'], axis=1, inplace=True)
df.drop(['DOB'], axis=1, inplace=True)
df.drop(['DaysLateLast30'], axis=1, inplace=True)

Funciones duplicadas

A continuación, al examinar el libro de códigos, que contiene las definiciones de cada función, podemos ver que tenemos muchas funciones duplicadas.

Por ejemplo, “MarriedStatusID” es una función numérica que produce el código que coincide con los estatutos de casados en la función “MaritalDesc”. Podemos eliminar estas características.

df.drop(['MaritalStatusID', 'EmpStatusID', 'DeptID'], axis=1, inplace=True)
df.drop(['GenderID'], axis=1, inplace=True)
df.drop(['PerformanceScore'], axis=1, inplace=True)
df.drop(['MarriedID'], axis=1, inplace=True)

Written by Tutor