Path: blob/main/Trabajo_grupal/WG7/Grupo_1_py.py
2714 views
########################################### GRUPO 1 ############################################12##################################### Miembros del grupo ######################################34# 20163197, Enrique Alfonso Pazos5# 20191894, Ilenia Ttito6# 20151595, Rodrigo Ramos7# 20193469, Luis Egusquiza8# 20163377, Jean Nino de Guzman910#!pip install swifter1112# Importamos las librerías que vamos a utilizar13import pandas as pd14import numpy as np15import re # for regular expressions (REGEX)16import os # for directorio17import swifter # for parallel procesing18from datetime import datetime1920user = os.getlogin()21print(user)2223# Set directorio2425#Se extrae el usuario para posteriormente pegarlo en el nuevo directorio de la base de datos y pueda correr a cualquier persona con acceso al repositorio del curso.26user = os.getlogin()27##Se setea un directorio para que se cargue la base de datos desde el repositorio del curso y se utilice el usuario de la PC en donde se corra el código.28os.chdir(f"C:/Users/{user}/Documents/GitHub/1ECO35_2022_2/data")2930#Se lee la base de datos data_administrativa, y se cargue como un dataframe31df = pd.read_excel("../data/crime_data/data_administrativa.xlsx")3233##PREGUNTA 1:34#Se pasa de mayúsulas a minúsculas a los nombres de las variables35df.columns = map(str.lower, df.columns)36# map es el loop replacement que permite aplicar la función str.lower a cada elemento de la lista data.columns3738##PREGUNTA 2:39#Se indica que se reemplace la columna nombre con los mismo registros con excepción de los números [0-9] y signos .,!,¡ y -40df['nombre'] = df['nombre'].swifter.apply(lambda x: re.sub('[0-9,/,.,!,¡,-]','',x))4142##PREGUNTA 3:43#Se indica que se reemplace la columna born_date por los mismos registros exceptuando los signos !,#,",% y -, pues no permiten identificar a la persona.44df['born_date'] = df['born_date'].swifter.apply(lambda x: re.sub('[!,#,",%,-]','',x))45#Se cambia el formato de los registros a formate de fecha (datetime)4647df['born_date'] = pd.to_datetime(df['born_date'], dayfirst = True).dt.strftime('%d/%m/%Y')4849##PREGUNTA 4:50#Se pasan todos los datos de la columa age a formato string para poder trabajar con todo en conjunto.51df.age = df.age.astype('str')52#Se reemplaza la columna age por los mismos registros exceptuando las letras de la a-z tanto minúsculas como mayúsculas y de los signos.53df['age'] = df['age'].swifter.apply(lambda x: re.sub('[a-zA-Z,!,#,",%,.,-]','',x))5455##PREGUNTA 5:56#Se crean las dummies en base a las categorías establecidas en el ejercicio57df["dum1"] = np.where(df["rank"] == "lider de la banda criminal",1, 0)58df["dum2"] = np.where(df["rank"] == "cabecilla local",1, 0)59df["dum3"] = np.where(df["rank"] == "cabecilla regional",1, 0)60df["dum4"] = np.where(df["rank"] == "sicario",1, 0)61#Para la dummy5, se indica que se coloque 1 en caso los registros contengan la palabra "extor", pues en algunos casos están extorsion y extorsionador, por lo que la dummy se aplicaría a ambos casos62df['dum5'] = np.where(df['rank'].str.contains('^extor'),1,0)63df["dum6"] = np.where(df["rank"] == "miembro",1, 0)64#Para la dummy7 se coloca que se coloque 1 en caso los registros contengan las palabras "nov", "noa" y "princ", pues aparecen novato, novto, noato y principante, por lo que la dummy considera todos estos.65df['dum7'] = np.where(df['rank'].str.contains('nov|noa|princ'),1,0)6667##PREGUNTA 6:6869#En el Github no especifíca una pregunta 6, se salta a la 7.7071##PREGUNTA 7:72#Convertimos a string el correo73df.correo_abogado = df.correo_abogado.astype('str')7475#Se indica que cree una nueva columna que contenga el usuario de cada correo76df['usuario']= df['correo_abogado'].swifter.apply(lambda x: re.search("(\w+)\@\.*", str(x)).group(1))7778##PREGUNTA 8:79#Se indica que se cree una nueva columna que contenga lo mismo de los registros de la columna dni, pero exceptuando las letras, por lo que queda unicamente números y signos.80df['dni0'] = df['dni'].swifter.apply(lambda x: re.sub('[a-zA-Z]','',x))8182##PREGUNTA 9:83#Para crear las columnas con la variable crimen, n_hijos y edad_inicio establecemos una función por cada una de ellas8485def crimen(x): #Definimos la función crimen86try:87match_1 = re.search("(?<=sentenciado por)(\s+\w+).?",x) #Utilizamos look around para que extraiga el texto de nuestro interés88return match_1.group() #Le pedimos que lo busque en cualquier orden en el que aparezca8990except:91pass #En caso, no encuentre el texto solicitado ponga None (vacío)9293#Creamos la columna crimen a partir de la columna de observaciones del DataFrame94#Incorporamos los datos de nuestra función establecida líneas arriba95df['crimen'] = df['observaciones'].apply(lambda x: crimen(x))96df['crimen'] = df['observaciones'].apply(crimen)979899def n_hijos(y): #Definimos la función n_hijos100try:101match_2 = re.search("(?<=tiene ).*\d", y) #Utilizamos look around para que extraiga el texto de nuestro interés102return match_2.group()103104except:105pass #En caso, no encuentre el texto solicitado ponga None (vacío)106107#Creamos la columna n_hijos a partir de la columna de observaciones del DataFrame108#Incorporamos los datos de nuestra función establecida líneas arriba109df['n_hijos'] = df['observaciones'].apply(lambda y: n_hijos(y))110df['n_hijos'] = df['observaciones'].apply(n_hijos)111112113def edad_inicio(z): #Definimos la función edad_inicio114try:115match_3 = re.search("(?<=actividades ilegales ).*(años)", z) #Utilizamos look around para que extraiga el texto de nuestro interés116return match_3.group()117118except:119pass #En caso, no encuentre el texto solicitado ponga None (vacío)120121#Creamos la columna edad_inicio a partir de la columna de observaciones del DataFrame122#Incorporamos los datos de nuestra función establecida líneas arriba123df['edad_inicio'] = df['observaciones'].apply(lambda z: edad_inicio(z))124df['edad_inicio'] = df['observaciones'].apply(edad_inicio)125126127128