Path: blob/main/Trabajo_grupal/WG7/Grupo_2.PY.py
2714 views
# Ejercicios 5-9123# import libraries456import pandas as pd7import numpy as np8import re # for regular expressions (REGEX)9import os # for directorio10import swifter # for parallel procesing11import unidecode # to drop tildes1213141516user = os.getlogin() # Username17print(user)1819# Set directorio y cargar panel dataset2021os.chdir(/Users/enriquerios/Desktop/PUCP 2022.2/R y Python/1ECO35_2022_2/data/data/) # Set directorio2223data = pd.read_excel(/Users/enriquerios/Desktop/PUCP 2022.2/R y Python/1ECO35_2022_2/data/data/data_administrativa.xlsx)) # Subir base de datos24data252627#Pasamos a recurrir a tomar parte de lo inicial282930#%% Ejericio 131#Convertimos las observaciones string de la columna Nombre a letras minúsculas32data['Nombre'] = data['Nombre'].str.lower()3334#Alternativamente podemos aplicar el siguient comando:35data.columns = map(str.lower, data.columns)363738#%% Ejericio 23940data['nombre'].head(30)41#notamos que en las observaciones de la columna 'nombre'hay caracteres como: /, -, !, así como número4243#A través de los siguientes comandos podemos extraer estos caracteres44data['name'] = data['nombre'].swifter.apply(lambda x: re.sub('/','',x))45#con el comando anterior extraemos al caracter '/'46data['name'] = data['name'].swifter.apply(lambda x: re.sub('-','',x))47#con el comando anterior extraemos al caracter '-'48data['name'] = data['name'].apply(lambda x: re.sub('[0-9]','',x))49#con el comando anterior extraemos los números del string50data['name'] = data['name'].swifter.apply(lambda x: re.sub('!','',x))51#con el comando anterior extraemos al caracter '!'52data['name'] = data['name'].swifter.apply(lambda x: re.sub(' .','',x))53#con el comando anterior extraemos el punto '.'5455data[['nombre','name']].head(30)56#Ahora la columna 'name'contiene únicamente los nombres de las personas5758#%% Ejericio 35960#Ahora estamos interesados en pulir la información de la fecha6162#Primero eliminamos el componente de minutos y segundos '00:00' a través del siguiente código63data["bdate"] = data["born_date"].str.replace("\s00:00", "")6465data['bdate'].head(30) #Pero también notamos que hay observaciones con los caracteres '#% y !6667#Eliminamos entonces el caracter !68data['bdate'] = data['bdate'].swifter.apply(lambda x: re.sub(' !','',x))6970#Así como la cadena de caracteres "#%71data['bdate'] = data['bdate'].swifter.apply(lambda x: re.sub(' "#%','',x))7273data['bdate'].head(30) #Ahora contamos con el string apropiado, pero aún debemos convertirlo en formato fecha7475data['bdate'].info() #Efectivamente, no está en formato date7677#Proponemos dos alternativas para convertir el string en formato date:7879#Alternativa 1: usar el comando astype especificando el formato datetime64[ns]80data['new_date']=data['bdate'].astype('datetime64[ns]')8182#Alternativa 2: usar el comando pd.to_datetime pidiendo que se infiera el tipo de formato date que se empleará83#Esta opción es especialmente relevante cuando el set string no es homogeneo84data['new_date2'] = pd.to_datetime(data['bdate'], infer_datetime_format=True)858687data[['new_date','new_date2']].info() #notamos que ahora las observaciones están en formato dummy8889#%% Ejericio 49091#Ahora nos concentraremos en limpiar la columna de edad92#Los caracteres que queremos eliminar son los siguientes:!#, -, .., !93#También queremos eliminar el texto de las observaciones9495#Pero el primer paso es convertir los valores de la columna age de object a string96data['age'].info()97#De esta forma podremos extarer partes de la cadena de texto luego98data = data.astype({'age':'string'}) #convertimos la variable age a string99100#Luego, extraigamos los caracteres innecesarios:101data['age'] = data['age'].swifter.apply(lambda x: re.sub('!#','',x))102data['age'] = data['age'].swifter.apply(lambda x: re.sub(' -','',x))103data['age'] = data['age'].swifter.apply(lambda x: re.sub('!','',x))104105data['age'] = data['age'].str.replace(r'\D', '')106107#Por último, y para facilitar el análisis anterior, convertimos las observaciones a formato integer108109data = data.astype({'age':'int'})110data['age'].info()111112113#%% Ejercicio 5114# Crear dummies según el rango del sentenciado en la organización criminal115#dum1: toma el valor de 1 si el sentenciado fue líder de la banda criminal116#dum2: toma el valor de 1 si el sentenciado fue cabecilla local117#dum3: toma el valor de 1 si el sentenciado fue cabecilla regional118#dum4: toma el valor de 1 si el sentenciado fue sicario119#dum5: toma el valor de 1 si el sentenciado realizó extorsión120#dum6: toma el valor de 1 si el sentenciado fue miembro regular121#dum7: toma el valor de 1 si el sentenciado fue novato o principiante122123#Creamos todas las dummies con con un condicional ifelse y detect para todo el valor de la variable o con la letra que empiece124#Para dum1 que detecte si la variable es "lider de la banda criminal" y si es asi toma 1 sino 0125#Para dum2 que detecte si la variable es "cabecilla local" y si es asi toma 1 sino 0126#Para dum3 que detecte si la variable es "cabecilla regional" y si es asi toma 1 sino 0127#Para dum4 que detecte si la variable empieza con las letras "sic" y si es asi toma 1 sino 0128data["dum1"] = np.where(data["rank"] == "Lider de la banda criminal",1, 0)129data["dum2"] = np.where(data["rank"] == "Cabecilla local",1, 0)130data["dum3"] = np.where(data["rank"] == "Cabecilla regional",1, 0)131data["dum4"] = np.where(data["rank"] == "Sicario",1, 0)132133134#Para dum5 que detecte si la variable empieza con la letra "e", ya que hay observaciones con extorsion o extorsionador, y si es asi toma 1 sino 0135#Para dum6 que detecte si la variable empieza con las letra "m" y si es asi toma 1 sino 0136data['dum5'] = np.where(data['rank'].str.contains('^extor'),1,0)137data["dum6"] = np.where(data["rank"] == "miembro",1, 0)138139#Para dum7 que detecte si la variable empieza con las letras "n" o "p", ya que hay observaciones donde no esta bien escrito novato, y si es asi toma 1 sino 0140data['dum7'] = np.where(data['rank'].str.contains('nov|noa|princ'),1,0)141142143144145#%% Ejercicio 7146# Extraer el usuario del correo electrónico.147data.correo_abogado = data.correo_abogado.astype('str') # Primero se procede a convertir en string148data['user_correo']= data['correo_abogado'].swifter.apply(lambda x: re.search("(\w+)\@\.*", str(x)).group(1))149150151#%% Ejercicio 8152# Crear una columna que contenga solo la información del número de dni (por ejemplo: 01-75222677), en este caso se extraen los rangos de numeros como se indica en la estructura.153data['dni_nuevo'] = data['dni'].swifter.apply(lambda x: re.sub('dni','',x))154155156#%% Ejercicio 9157# A partir de la columna observaciones, crear las siguiente variables:158159160# crimen: debe contener información del delito cometido, y para ello se indica la seccion de texto que debe extraer161def crimen(x): # Esta es la función crimen162163data['crimen'] = data['observaciones'].apply(lambda x: crimen(x))164data['crimen'] = data['observaciones'].apply(crimen)165166# n_hijos: cantidad de hijos del criminal167def n_hijos(w): # Función n_hijos168169data['n_hijos'] = data['observaciones'].apply(lambda y: n_hijos(y))170data['n_hijos'] = data['observaciones'].apply(n_hijos)171172173# edad_inicio : edad de inicio en actividades criminales174175def edad_inicio(p): # Función edad_inicio176data['edad_inicio'] = data['observaciones'].apply(lambda z: edad_inicio(z))177data['edad_inicio'] = data['observaciones'].apply(edad_inicio)178179180