Path: blob/main/Trabajo_grupal/WG7/Grupo_4_py.py
2714 views
############################## WG # 7 ######################################12#%% Grupo 434# Flavia Oré - 201912155# Seidy Ascencios - 201916226# Luana Morales - 201912407# Marcela Quintero - 2019144589#%%% PREGUNTA 110##############################################################################11# #12# PREGUNTA 1 #13# Convertir el nombre de las variables a minúscula #14# #15##############################################################################1617# Recursos necesarios:1819import os #Para el nombre de usuario y set directorio2021!pip install fuzzywuzzy22!pip install python-Levenshtein23!pip install swifter24!pip install unidecode2526from rapidfuzz import fuzz27from rapidfuzz import process #Para cargar librerías de fuzzymatch28import re29import numpy as np30import pandas as pd31import swifter #Librería para procesos paralelos32import unidecode #Dropear tildes33import itertools3435## Seteamos el directorio:36user = os.getlogin() # Username3738os.chdir(f"C:/Users/{user}/Documents/GitHub/1ECO35_2022_2/data/crime_data")3940## Abrimos la base de datos en Excel:4142data = pd.read_excel(f"C:/Users/{user}/Documents/GitHub/1ECO35_2022_2/data/crime_data/data_administrativa.xlsx", sheet_name='Hoja1')4344## Converminos el nombre de las variables en minúscula.4546data.columns = map(str.lower, data.columns)47print(data)4849## Observamos que los nombres de las variables ya están en minúscula.5051#%%% PREGUNTA 252##############################################################################53# #54# PREGUNTA 2 #55# Fíjese que el nombre de la persona tiene puntuaciones #56# y número, retirar todo aquello que no permita identificar #57# el nombre correcto #58# #59##############################################################################6061def function1(row):6263row = row.strip()64row = unidecode.unidecode(row)65row = re.sub('[^a-zA-Z\s]', '',row).lower()66return row6768data['nombre'] = data['nombre'].apply(function1)6970## Notamos que todo está en minúscula y limpio de caracteres no deseados.7172#%%% PREGUNTA 373##############################################################################74# #75# PREGUNTA 3 #76# Limpiar la fecha de nacimiento de aquellos elementos #77# que la ensucien. Luego crear otra variable con el #78# el formato de fecha #79# #80##############################################################################8182data['born_date'] = data['born_date'].apply(lambda x: re.sub('(00:00)|("#%)|(!)','',x))8384## Notamos que limpiamos la variable de la fecha de nacimiento.8586## Ahora, crearemos otra variable con el formato de fecha:8788data['born_date'] = pd.to_datetime(data['born_date']89, dayfirst = True).dt.strftime('%d/%m/%Y')909192#%%% PREGUNTA 493##############################################################################94# #95# PREGUNTA 4 #96# Limpiar la columna de edad, el cual tiene puntuaciones #97# que no permiten identificar la edad correcta. #98# #99##############################################################################100101102## Se quitó todo caracter especial y que no sea número. Además, se agregó "str" para evitar103## que aparezca el error "TypeError expected string or bytes-like object":104105data['age'] = data['age'].apply(lambda x: re.sub('[^0-9]','',str(x)))106107## Notamos que queda la edad limpia.108109#%%% PREGUNTA 5110##############################################################################111# #112# PREGUNTA 5 #113# Crear dummies según el rango del sentenciado en #114# la organización criminal #115# #116##############################################################################117118#dum1: toma el valor de 1 si el sentenciado fue líder de la banda criminal119#dum2: toma el valor de 1 si el sentenciado fue cabecilla local120#dum3: toma el valor de 1 si el sentenciado fue cabecilla regional121#dum4: toma el valor de 1 si el sentenciado fue sicario122#dum5: toma el valor de 1 si el sentenciado realizó extorsión123#dum6: toma el valor de 1 si el sentenciado fue miembro regular124#dum7: toma el valor de 1 si el sentenciado fue novato o principiante125126## Primero, notamos que están mal escritas ciertas variables, por lo que las corregimos para127## poder generar las dummies:128129df = pd.DataFrame(data)130df.loc[df['rank'] == 'noato', 'rank'] = 'novato'131df.loc[df['rank'] == 'novto', 'rank'] = 'novato'132df.loc[df['rank'] == 'extorsionador', 'rank'] = 'extorsion'133134## Hecho esto, procedemos a crear las dummies:135dummies = pd.get_dummies(df['rank'])136137## Ahora, cambiamos el nombre de las columnas a dum1-dum7 según lo indicado:138139dummies.rename = dummies.set_axis(['dum2', 'dum3', 'dum5', 'dum1', 'dum6', 'dumx', 'dumz', 'dum4'], axis=1, inplace= True)140141## Como nos piden que los novatos y principiantes estén en una misma dummy, los llamamos 'dumx'142## y 'dumz' temporalmente para poder juntarlos después en 'dum7':143144dummies["dum7"] = dummies["dumx"] + dummies["dumz"]145146## Por último, eliminamos "dumx" y "dumz":147148dummies.drop(['dumx'], axis=1, inplace=True)149dummies.drop(['dumz'], axis=1, inplace=True)150151## Observamos que ya tenemos un df de dummies según el rango en la organización152## criminal del sentenciado.153154155#%%% PREGUNTA 7156##############################################################################157# #158# PREGUNTA 7 #159# Extraer el usuario del correo electrónico #160# #161##############################################################################162163## Creamos una columna dentro del df que solo contenga los usuarios:164165df['user_correo']= data['correo_abogado'].apply(lambda x: re.search("(\w+)\@\.*", str(x)).group(1))166167## Observamos que se extrajo lo requerido.168169#%%% PREGUNTA 8170##############################################################################171# #172# PREGUNTA 8 #173# Crear una columna que contenga solo la información del #174# número de dni (por ejemplo: 01-75222677) #175# #176##############################################################################177178## Agregamos una columna a la que llamaremos: dni_num, y eliminaremos las palabras179## "dni es" para solo quedarnos con el número.180181df['dni_num']= data['dni'].apply(lambda x: re.sub('dni es','',x))182183## Podemos ver añadida la nueva columna con los números de DNI.184185#%%% PREGUNTA 9186##############################################################################187# #188# PREGUNTA 9 #189# A partir de la columna observaciones, crear #190# las siguientes variables #191# #192##############################################################################193194#crimen: debe contener información del delito cometido -> después de "por" y antes de la coma :lookahead195#n_hijos: cantidad de hijos del criminal -> después de "tiene", solo número :lookahead196#edad_inicio : edad de inicio en actividades criminales -> antes de "años", solo número: lookbehind197198199df['crimen'] = df['observaciones'].apply(lambda x: re.search("(?<!por )\d+\:\d+",x))200201df['n_hijos'] = df['observaciones'].apply(lambda x: re.search("(?<!tiene )\d+\:\d+",x))202203df['edad_inicio'] = df['observaciones'].apply(lambda x: re.search("(?<=años )[\d+\:]+",x))204205206207208