Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
robertopucp
GitHub Repository: robertopucp/1eco35_2022_2
Path: blob/main/Trabajo_grupal/WG7/Grupo_1_py.py
2714 views
1
########################################### GRUPO 1 ############################################
2
3
##################################### Miembros del grupo ######################################
4
5
# 20163197, Enrique Alfonso Pazos
6
# 20191894, Ilenia Ttito
7
# 20151595, Rodrigo Ramos
8
# 20193469, Luis Egusquiza
9
# 20163377, Jean Nino de Guzman
10
11
#!pip install swifter
12
13
# Importamos las librerías que vamos a utilizar
14
import pandas as pd
15
import numpy as np
16
import re # for regular expressions (REGEX)
17
import os # for directorio
18
import swifter # for parallel procesing
19
from datetime import datetime
20
21
user = os.getlogin()
22
print(user)
23
24
# Set directorio
25
26
#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.
27
user = os.getlogin()
28
##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.
29
os.chdir(f"C:/Users/{user}/Documents/GitHub/1ECO35_2022_2/data")
30
31
#Se lee la base de datos data_administrativa, y se cargue como un dataframe
32
df = pd.read_excel("../data/crime_data/data_administrativa.xlsx")
33
34
##PREGUNTA 1:
35
#Se pasa de mayúsulas a minúsculas a los nombres de las variables
36
df.columns = map(str.lower, df.columns)
37
# map es el loop replacement que permite aplicar la función str.lower a cada elemento de la lista data.columns
38
39
##PREGUNTA 2:
40
#Se indica que se reemplace la columna nombre con los mismo registros con excepción de los números [0-9] y signos .,!,¡ y -
41
df['nombre'] = df['nombre'].swifter.apply(lambda x: re.sub('[0-9,/,.,!,¡,-]','',x))
42
43
##PREGUNTA 3:
44
#Se indica que se reemplace la columna born_date por los mismos registros exceptuando los signos !,#,",% y -, pues no permiten identificar a la persona.
45
df['born_date'] = df['born_date'].swifter.apply(lambda x: re.sub('[!,#,",%,-]','',x))
46
#Se cambia el formato de los registros a formate de fecha (datetime)
47
48
df['born_date'] = pd.to_datetime(df['born_date'], dayfirst = True).dt.strftime('%d/%m/%Y')
49
50
##PREGUNTA 4:
51
#Se pasan todos los datos de la columa age a formato string para poder trabajar con todo en conjunto.
52
df.age = df.age.astype('str')
53
#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.
54
df['age'] = df['age'].swifter.apply(lambda x: re.sub('[a-zA-Z,!,#,",%,.,-]','',x))
55
56
##PREGUNTA 5:
57
#Se crean las dummies en base a las categorías establecidas en el ejercicio
58
df["dum1"] = np.where(df["rank"] == "lider de la banda criminal",1, 0)
59
df["dum2"] = np.where(df["rank"] == "cabecilla local",1, 0)
60
df["dum3"] = np.where(df["rank"] == "cabecilla regional",1, 0)
61
df["dum4"] = np.where(df["rank"] == "sicario",1, 0)
62
#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 casos
63
df['dum5'] = np.where(df['rank'].str.contains('^extor'),1,0)
64
df["dum6"] = np.where(df["rank"] == "miembro",1, 0)
65
#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.
66
df['dum7'] = np.where(df['rank'].str.contains('nov|noa|princ'),1,0)
67
68
##PREGUNTA 6:
69
70
#En el Github no especifíca una pregunta 6, se salta a la 7.
71
72
##PREGUNTA 7:
73
#Convertimos a string el correo
74
df.correo_abogado = df.correo_abogado.astype('str')
75
76
#Se indica que cree una nueva columna que contenga el usuario de cada correo
77
df['usuario']= df['correo_abogado'].swifter.apply(lambda x: re.search("(\w+)\@\.*", str(x)).group(1))
78
79
##PREGUNTA 8:
80
#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.
81
df['dni0'] = df['dni'].swifter.apply(lambda x: re.sub('[a-zA-Z]','',x))
82
83
##PREGUNTA 9:
84
#Para crear las columnas con la variable crimen, n_hijos y edad_inicio establecemos una función por cada una de ellas
85
86
def crimen(x): #Definimos la función crimen
87
try:
88
match_1 = re.search("(?<=sentenciado por)(\s+\w+).?",x) #Utilizamos look around para que extraiga el texto de nuestro interés
89
return match_1.group() #Le pedimos que lo busque en cualquier orden en el que aparezca
90
91
except:
92
pass #En caso, no encuentre el texto solicitado ponga None (vacío)
93
94
#Creamos la columna crimen a partir de la columna de observaciones del DataFrame
95
#Incorporamos los datos de nuestra función establecida líneas arriba
96
df['crimen'] = df['observaciones'].apply(lambda x: crimen(x))
97
df['crimen'] = df['observaciones'].apply(crimen)
98
99
100
def n_hijos(y): #Definimos la función n_hijos
101
try:
102
match_2 = re.search("(?<=tiene ).*\d", y) #Utilizamos look around para que extraiga el texto de nuestro interés
103
return match_2.group()
104
105
except:
106
pass #En caso, no encuentre el texto solicitado ponga None (vacío)
107
108
#Creamos la columna n_hijos a partir de la columna de observaciones del DataFrame
109
#Incorporamos los datos de nuestra función establecida líneas arriba
110
df['n_hijos'] = df['observaciones'].apply(lambda y: n_hijos(y))
111
df['n_hijos'] = df['observaciones'].apply(n_hijos)
112
113
114
def edad_inicio(z): #Definimos la función edad_inicio
115
try:
116
match_3 = re.search("(?<=actividades ilegales ).*(años)", z) #Utilizamos look around para que extraiga el texto de nuestro interés
117
return match_3.group()
118
119
except:
120
pass #En caso, no encuentre el texto solicitado ponga None (vacío)
121
122
#Creamos la columna edad_inicio a partir de la columna de observaciones del DataFrame
123
#Incorporamos los datos de nuestra función establecida líneas arriba
124
df['edad_inicio'] = df['observaciones'].apply(lambda z: edad_inicio(z))
125
df['edad_inicio'] = df['observaciones'].apply(edad_inicio)
126
127
128