Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
robertopucp
GitHub Repository: robertopucp/1eco35_2022_2
Path: blob/main/Trabajo_grupal/WG7/Grupo_4_py.py
2714 views
1
############################## WG # 7 ######################################
2
3
#%% Grupo 4
4
5
# Flavia Oré - 20191215
6
# Seidy Ascencios - 20191622
7
# Luana Morales - 20191240
8
# Marcela Quintero - 20191445
9
10
#%%% PREGUNTA 1
11
##############################################################################
12
# #
13
# PREGUNTA 1 #
14
# Convertir el nombre de las variables a minúscula #
15
# #
16
##############################################################################
17
18
# Recursos necesarios:
19
20
import os #Para el nombre de usuario y set directorio
21
22
!pip install fuzzywuzzy
23
!pip install python-Levenshtein
24
!pip install swifter
25
!pip install unidecode
26
27
from rapidfuzz import fuzz
28
from rapidfuzz import process #Para cargar librerías de fuzzymatch
29
import re
30
import numpy as np
31
import pandas as pd
32
import swifter #Librería para procesos paralelos
33
import unidecode #Dropear tildes
34
import itertools
35
36
## Seteamos el directorio:
37
user = os.getlogin() # Username
38
39
os.chdir(f"C:/Users/{user}/Documents/GitHub/1ECO35_2022_2/data/crime_data")
40
41
## Abrimos la base de datos en Excel:
42
43
data = pd.read_excel(f"C:/Users/{user}/Documents/GitHub/1ECO35_2022_2/data/crime_data/data_administrativa.xlsx", sheet_name='Hoja1')
44
45
## Converminos el nombre de las variables en minúscula.
46
47
data.columns = map(str.lower, data.columns)
48
print(data)
49
50
## Observamos que los nombres de las variables ya están en minúscula.
51
52
#%%% PREGUNTA 2
53
##############################################################################
54
# #
55
# PREGUNTA 2 #
56
# Fíjese que el nombre de la persona tiene puntuaciones #
57
# y número, retirar todo aquello que no permita identificar #
58
# el nombre correcto #
59
# #
60
##############################################################################
61
62
def function1(row):
63
64
row = row.strip()
65
row = unidecode.unidecode(row)
66
row = re.sub('[^a-zA-Z\s]', '',row).lower()
67
return row
68
69
data['nombre'] = data['nombre'].apply(function1)
70
71
## Notamos que todo está en minúscula y limpio de caracteres no deseados.
72
73
#%%% PREGUNTA 3
74
##############################################################################
75
# #
76
# PREGUNTA 3 #
77
# Limpiar la fecha de nacimiento de aquellos elementos #
78
# que la ensucien. Luego crear otra variable con el #
79
# el formato de fecha #
80
# #
81
##############################################################################
82
83
data['born_date'] = data['born_date'].apply(lambda x: re.sub('(00:00)|("#%)|(!)','',x))
84
85
## Notamos que limpiamos la variable de la fecha de nacimiento.
86
87
## Ahora, crearemos otra variable con el formato de fecha:
88
89
data['born_date'] = pd.to_datetime(data['born_date']
90
, dayfirst = True).dt.strftime('%d/%m/%Y')
91
92
93
#%%% PREGUNTA 4
94
##############################################################################
95
# #
96
# PREGUNTA 4 #
97
# Limpiar la columna de edad, el cual tiene puntuaciones #
98
# que no permiten identificar la edad correcta. #
99
# #
100
##############################################################################
101
102
103
## Se quitó todo caracter especial y que no sea número. Además, se agregó "str" para evitar
104
## que aparezca el error "TypeError expected string or bytes-like object":
105
106
data['age'] = data['age'].apply(lambda x: re.sub('[^0-9]','',str(x)))
107
108
## Notamos que queda la edad limpia.
109
110
#%%% PREGUNTA 5
111
##############################################################################
112
# #
113
# PREGUNTA 5 #
114
# Crear dummies según el rango del sentenciado en #
115
# la organización criminal #
116
# #
117
##############################################################################
118
119
#dum1: toma el valor de 1 si el sentenciado fue líder de la banda criminal
120
#dum2: toma el valor de 1 si el sentenciado fue cabecilla local
121
#dum3: toma el valor de 1 si el sentenciado fue cabecilla regional
122
#dum4: toma el valor de 1 si el sentenciado fue sicario
123
#dum5: toma el valor de 1 si el sentenciado realizó extorsión
124
#dum6: toma el valor de 1 si el sentenciado fue miembro regular
125
#dum7: toma el valor de 1 si el sentenciado fue novato o principiante
126
127
## Primero, notamos que están mal escritas ciertas variables, por lo que las corregimos para
128
## poder generar las dummies:
129
130
df = pd.DataFrame(data)
131
df.loc[df['rank'] == 'noato', 'rank'] = 'novato'
132
df.loc[df['rank'] == 'novto', 'rank'] = 'novato'
133
df.loc[df['rank'] == 'extorsionador', 'rank'] = 'extorsion'
134
135
## Hecho esto, procedemos a crear las dummies:
136
dummies = pd.get_dummies(df['rank'])
137
138
## Ahora, cambiamos el nombre de las columnas a dum1-dum7 según lo indicado:
139
140
dummies.rename = dummies.set_axis(['dum2', 'dum3', 'dum5', 'dum1', 'dum6', 'dumx', 'dumz', 'dum4'], axis=1, inplace= True)
141
142
## Como nos piden que los novatos y principiantes estén en una misma dummy, los llamamos 'dumx'
143
## y 'dumz' temporalmente para poder juntarlos después en 'dum7':
144
145
dummies["dum7"] = dummies["dumx"] + dummies["dumz"]
146
147
## Por último, eliminamos "dumx" y "dumz":
148
149
dummies.drop(['dumx'], axis=1, inplace=True)
150
dummies.drop(['dumz'], axis=1, inplace=True)
151
152
## Observamos que ya tenemos un df de dummies según el rango en la organización
153
## criminal del sentenciado.
154
155
156
#%%% PREGUNTA 7
157
##############################################################################
158
# #
159
# PREGUNTA 7 #
160
# Extraer el usuario del correo electrónico #
161
# #
162
##############################################################################
163
164
## Creamos una columna dentro del df que solo contenga los usuarios:
165
166
df['user_correo']= data['correo_abogado'].apply(lambda x: re.search("(\w+)\@\.*", str(x)).group(1))
167
168
## Observamos que se extrajo lo requerido.
169
170
#%%% PREGUNTA 8
171
##############################################################################
172
# #
173
# PREGUNTA 8 #
174
# Crear una columna que contenga solo la información del #
175
# número de dni (por ejemplo: 01-75222677) #
176
# #
177
##############################################################################
178
179
## Agregamos una columna a la que llamaremos: dni_num, y eliminaremos las palabras
180
## "dni es" para solo quedarnos con el número.
181
182
df['dni_num']= data['dni'].apply(lambda x: re.sub('dni es','',x))
183
184
## Podemos ver añadida la nueva columna con los números de DNI.
185
186
#%%% PREGUNTA 9
187
##############################################################################
188
# #
189
# PREGUNTA 9 #
190
# A partir de la columna observaciones, crear #
191
# las siguientes variables #
192
# #
193
##############################################################################
194
195
#crimen: debe contener información del delito cometido -> después de "por" y antes de la coma :lookahead
196
#n_hijos: cantidad de hijos del criminal -> después de "tiene", solo número :lookahead
197
#edad_inicio : edad de inicio en actividades criminales -> antes de "años", solo número: lookbehind
198
199
200
df['crimen'] = df['observaciones'].apply(lambda x: re.search("(?<!por )\d+\:\d+",x))
201
202
df['n_hijos'] = df['observaciones'].apply(lambda x: re.search("(?<!tiene )\d+\:\d+",x))
203
204
df['edad_inicio'] = df['observaciones'].apply(lambda x: re.search("(?<=años )[\d+\:]+",x))
205
206
207
208