Path: blob/main/Trabajo_grupal/WG7/Grupo_9.py
2714 views
#### Tarea 7 _ Grupo _ 9 #####1# -*- coding: utf-8 -*-2"""3Created on Sat Nov 5 21:45:24 202245@author: acwe6"""78# Librerias910import pandas as pd11import numpy as np12import re # for regular expressions (REGEX)13import os # for directorio14import swifter # for parallel procesing15import unidecode # to drop tildes16from datetime import datetime # library for time1718user = os.getlogin() # Username19print(user)2021# Directorio2223os.chdir(f"C:/Users/{user}/Documents/GitHub/1ECO35_2022_2/Lab8") # Set directorio2425data = pd.read_excel("../data/crime_data/data_administrativa.xlsx") # Subir base de datos26data2728#--------------------------------29# Pregunta 130#--------------------------------3132# Convertir el nombre de las variables a minúscula3334data.columns = map(str.lower, data.columns)35data.columns363738#--------------------------------39# Pregunta 240#--------------------------------4142# Fíjese que el nombre de la persona tiene presiones y número, retire todo aquello que no permita identificar el nombre correcto.4344# Reempazamos por vacío todo aquello que sea diferente de letras y espacio; es decir, presiones y número45data['nombre'] = data['nombre'].apply(lambda x: re.sub('[^a-zA-Z\s]','',x))46data['nombre']474849#--------------------------------50# Pregunta 351#--------------------------------5253# Limpiar la fecha de nacimiento de aquellos elementos que la ensucien. Luego crear otra variable con el formato de fecha.5455# Reemplazamos por vacío a los elementos que ensucian la fecha de nacimiento {00:00,"#%,!}56data['born_date'] = data['born_date'].apply(lambda x: re.sub('(00:00)|("#%)|(!)','',x))57data['born_date']585960#crear otra variable con formato fecha61data['fecha'] = pd.to_datetime(data['born_date'], dayfirst = True).dt.strftime('%d/%m/%Y')62data['fecha']636465#--------------------------------66# Pregunta 467#--------------------------------6869# Limpiar la columna de edad, el cual tiene factores que no permiten identificar la edad correcta.7071# Reempazamos por vacío todo aquello que sea diferente de dígitos72data['age'] = data['age'].apply(lambda x: re.sub('\D','',str(x)))73data['age']747576#--------------------------------77# Pregunta 578#--------------------------------7980#dum1: toma el valor de 1 si el sentenciado fue líder de la banda criminal81#dum2: toma el valor de 1 si el sentenciado fue cabecilla local82#dum3: toma el valor de 1 si el sentenciado fue cabecilla regional83#dum4: toma el valor de 1 si el sentenciado fue sicario84#dum5: toma el valor de 1 si el sentenciado realizó extorsión85#dum6: toma el valor de 1 si el sentenciado fue miembro regular86#dum7: toma el valor de 1 si el sentenciado fue novato o principiante878889# rank: Rango del sentenciado en la banda criminal.9091data['rank']9293data['dum1'] = np.where(data['rank'].str.contains('^l', regex=True),1,0)94data['dum1'].value_counts() #todos los líderes empiezan con'l'9596data['dum2'] = np.where(data['rank'].str.contains('local', regex=True),1,0)97data['dum2'].value_counts() #todos los cabecillas locales dice 'local'9899data['dum3'] = np.where(data['rank'].str.contains('regional', regex=True),1,0)100data['dum3'].value_counts() #todos los cabecillas regionales dice 'regional'101102data['dum4'] = np.where(data['rank'].str.contains('^s', regex=True),1,0)103data['dum4'].value_counts() #todos sicarios empizan con s104105data['dum5'] = np.where(data['rank'].str.contains('ext', regex=True),1,0)106data['dum5'].value_counts() #todos extorcion empiezan con ext107108data['dum6'] = np.where(data['rank'].str.contains('^m', regex=True),1,0)109data['dum6'].value_counts() #todo miembro aparece empieza con m110111searchfor = ['principiante', 'no([\w*]*)to']112data['dum7'] = np.where(data['rank'].str.contains('|'.join(searchfor), regex=True),1,0)113data['dum7'].value_counts() #todo principiante aparece como principiante y novato tiene la forma no([\w*]*)to114115116117"######## 7. Extraer el usuario del correo electrónico ########"118119def usuario(x):120121match = re.search("(\w+)\@\.*", x)122123return match.group(1)124125126data['usario_correo'] = data['correo_abogado'].apply(lambda x: usuario(x))127data['usario_correo']128129130"######## 8. Contenga información del DNI ########"131132133134def dni(x):135136match = re.search('\.*\s(\d+\-\d+)', x)137138return match.group(1)139140141data['DNI'] = data['dni'].apply(lambda x: dni(x))142data['DNI']143144145"######## 9. A partir de la columna observaciones, crear las siguiente variables #######"146147148149"9.1. crimen: debe contener información del delito cometido"150151152def crimen(x):153match = re.search('(robo)', x)154match1 = re.search('((?<=por)[\w*\s]+)', x)155156if match is not None:157return match.group(1)158159elif match is None and (match1 is not None):160return match1.group(1)161162163data['crimen'] = data['observaciones'].apply(lambda x: crimen(x))164data['crimen']165166167#Nota, se tuvo que usar match1 y match porque existía conflictos para extraer la168#observación 14 (que no tenía coma) y 19 en el que el delito estaba descrito al inicio169#con if se busca que la prioridad sea que si la palabra robo sale,170#entonces, eso aparece en la columna 'crimen'171#luego, la segunda opcion es que si aparece otro delito (no robo), aparece ello en172#match1 y eso se retorna en la columna crimen173174175"9.2. n_hijos: cantidad de hijos del criminal"176177def hijos(x):178179match1 = re.search('\.*tiene\s([0-9]*)\shij[o/p]s', x)180181if match1 is None: # para los que no tienen hijos aparece 'None'182183return None184185else:186187return match1.group(1)188189data['n_hijos'] = data['observaciones'].apply(lambda x: hijos(x))190data['n_hijos']191192193"9.3. edad_inicio : edad de inicio en actividades criminales"194195def edad(x):196197match = re.search('\.*([0-9]*)\saños', x)198199if match is None: # para los que no figura edad aparece 'None'200201return None202203else:204205return match.group(1)206207data['edad_inicio'] = data['observaciones'].apply(lambda x: edad(x))208data['edad_inicio']209210211