Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
robertopucp
GitHub Repository: robertopucp/1eco35_2022_2
Path: blob/main/Trabajo_grupal/WG7/Grupo_9.py
2714 views
1
#### Tarea 7 _ Grupo _ 9 #####
2
# -*- coding: utf-8 -*-
3
"""
4
Created on Sat Nov 5 21:45:24 2022
5
6
@author: acwe
7
"""
8
9
# Librerias
10
11
import pandas as pd
12
import numpy as np
13
import re # for regular expressions (REGEX)
14
import os # for directorio
15
import swifter # for parallel procesing
16
import unidecode # to drop tildes
17
from datetime import datetime # library for time
18
19
user = os.getlogin() # Username
20
print(user)
21
22
# Directorio
23
24
os.chdir(f"C:/Users/{user}/Documents/GitHub/1ECO35_2022_2/Lab8") # Set directorio
25
26
data = pd.read_excel("../data/crime_data/data_administrativa.xlsx") # Subir base de datos
27
data
28
29
#--------------------------------
30
# Pregunta 1
31
#--------------------------------
32
33
# Convertir el nombre de las variables a minúscula
34
35
data.columns = map(str.lower, data.columns)
36
data.columns
37
38
39
#--------------------------------
40
# Pregunta 2
41
#--------------------------------
42
43
# Fíjese que el nombre de la persona tiene presiones y número, retire todo aquello que no permita identificar el nombre correcto.
44
45
# Reempazamos por vacío todo aquello que sea diferente de letras y espacio; es decir, presiones y número
46
data['nombre'] = data['nombre'].apply(lambda x: re.sub('[^a-zA-Z\s]','',x))
47
data['nombre']
48
49
50
#--------------------------------
51
# Pregunta 3
52
#--------------------------------
53
54
# Limpiar la fecha de nacimiento de aquellos elementos que la ensucien. Luego crear otra variable con el formato de fecha.
55
56
# Reemplazamos por vacío a los elementos que ensucian la fecha de nacimiento {00:00,"#%,!}
57
data['born_date'] = data['born_date'].apply(lambda x: re.sub('(00:00)|("#%)|(!)','',x))
58
data['born_date']
59
60
61
#crear otra variable con formato fecha
62
data['fecha'] = pd.to_datetime(data['born_date'], dayfirst = True).dt.strftime('%d/%m/%Y')
63
data['fecha']
64
65
66
#--------------------------------
67
# Pregunta 4
68
#--------------------------------
69
70
# Limpiar la columna de edad, el cual tiene factores que no permiten identificar la edad correcta.
71
72
# Reempazamos por vacío todo aquello que sea diferente de dígitos
73
data['age'] = data['age'].apply(lambda x: re.sub('\D','',str(x)))
74
data['age']
75
76
77
#--------------------------------
78
# Pregunta 5
79
#--------------------------------
80
81
#dum1: toma el valor de 1 si el sentenciado fue líder de la banda criminal
82
#dum2: toma el valor de 1 si el sentenciado fue cabecilla local
83
#dum3: toma el valor de 1 si el sentenciado fue cabecilla regional
84
#dum4: toma el valor de 1 si el sentenciado fue sicario
85
#dum5: toma el valor de 1 si el sentenciado realizó extorsión
86
#dum6: toma el valor de 1 si el sentenciado fue miembro regular
87
#dum7: toma el valor de 1 si el sentenciado fue novato o principiante
88
89
90
# rank: Rango del sentenciado en la banda criminal.
91
92
data['rank']
93
94
data['dum1'] = np.where(data['rank'].str.contains('^l', regex=True),1,0)
95
data['dum1'].value_counts() #todos los líderes empiezan con'l'
96
97
data['dum2'] = np.where(data['rank'].str.contains('local', regex=True),1,0)
98
data['dum2'].value_counts() #todos los cabecillas locales dice 'local'
99
100
data['dum3'] = np.where(data['rank'].str.contains('regional', regex=True),1,0)
101
data['dum3'].value_counts() #todos los cabecillas regionales dice 'regional'
102
103
data['dum4'] = np.where(data['rank'].str.contains('^s', regex=True),1,0)
104
data['dum4'].value_counts() #todos sicarios empizan con s
105
106
data['dum5'] = np.where(data['rank'].str.contains('ext', regex=True),1,0)
107
data['dum5'].value_counts() #todos extorcion empiezan con ext
108
109
data['dum6'] = np.where(data['rank'].str.contains('^m', regex=True),1,0)
110
data['dum6'].value_counts() #todo miembro aparece empieza con m
111
112
searchfor = ['principiante', 'no([\w*]*)to']
113
data['dum7'] = np.where(data['rank'].str.contains('|'.join(searchfor), regex=True),1,0)
114
data['dum7'].value_counts() #todo principiante aparece como principiante y novato tiene la forma no([\w*]*)to
115
116
117
118
"######## 7. Extraer el usuario del correo electrónico ########"
119
120
def usuario(x):
121
122
match = re.search("(\w+)\@\.*", x)
123
124
return match.group(1)
125
126
127
data['usario_correo'] = data['correo_abogado'].apply(lambda x: usuario(x))
128
data['usario_correo']
129
130
131
"######## 8. Contenga información del DNI ########"
132
133
134
135
def dni(x):
136
137
match = re.search('\.*\s(\d+\-\d+)', x)
138
139
return match.group(1)
140
141
142
data['DNI'] = data['dni'].apply(lambda x: dni(x))
143
data['DNI']
144
145
146
"######## 9. A partir de la columna observaciones, crear las siguiente variables #######"
147
148
149
150
"9.1. crimen: debe contener información del delito cometido"
151
152
153
def crimen(x):
154
match = re.search('(robo)', x)
155
match1 = re.search('((?<=por)[\w*\s]+)', x)
156
157
if match is not None:
158
return match.group(1)
159
160
elif match is None and (match1 is not None):
161
return match1.group(1)
162
163
164
data['crimen'] = data['observaciones'].apply(lambda x: crimen(x))
165
data['crimen']
166
167
168
#Nota, se tuvo que usar match1 y match porque existía conflictos para extraer la
169
#observación 14 (que no tenía coma) y 19 en el que el delito estaba descrito al inicio
170
#con if se busca que la prioridad sea que si la palabra robo sale,
171
#entonces, eso aparece en la columna 'crimen'
172
#luego, la segunda opcion es que si aparece otro delito (no robo), aparece ello en
173
#match1 y eso se retorna en la columna crimen
174
175
176
"9.2. n_hijos: cantidad de hijos del criminal"
177
178
def hijos(x):
179
180
match1 = re.search('\.*tiene\s([0-9]*)\shij[o/p]s', x)
181
182
if match1 is None: # para los que no tienen hijos aparece 'None'
183
184
return None
185
186
else:
187
188
return match1.group(1)
189
190
data['n_hijos'] = data['observaciones'].apply(lambda x: hijos(x))
191
data['n_hijos']
192
193
194
"9.3. edad_inicio : edad de inicio en actividades criminales"
195
196
def edad(x):
197
198
match = re.search('\.*([0-9]*)\saños', x)
199
200
if match is None: # para los que no figura edad aparece 'None'
201
202
return None
203
204
else:
205
206
return match.group(1)
207
208
data['edad_inicio'] = data['observaciones'].apply(lambda x: edad(x))
209
data['edad_inicio']
210
211