Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
robertopucp
GitHub Repository: robertopucp/1eco35_2022_2
Path: blob/main/Trabajo_grupal/WG7/Grupo_2.PY.py
2714 views
1
# Ejercicios 5-9
2
3
4
# import libraries
5
6
7
import pandas as pd
8
import numpy as np
9
import re # for regular expressions (REGEX)
10
import os # for directorio
11
import swifter # for parallel procesing
12
import unidecode # to drop tildes
13
14
15
16
17
user = os.getlogin() # Username
18
print(user)
19
20
# Set directorio y cargar panel dataset
21
22
os.chdir(/Users/enriquerios/Desktop/PUCP 2022.2/R y Python/1ECO35_2022_2/data/data/) # Set directorio
23
24
data = pd.read_excel(/Users/enriquerios/Desktop/PUCP 2022.2/R y Python/1ECO35_2022_2/data/data/data_administrativa.xlsx)) # Subir base de datos
25
data
26
27
28
#Pasamos a recurrir a tomar parte de lo inicial
29
30
31
#%% Ejericio 1
32
#Convertimos las observaciones string de la columna Nombre a letras minúsculas
33
data['Nombre'] = data['Nombre'].str.lower()
34
35
#Alternativamente podemos aplicar el siguient comando:
36
data.columns = map(str.lower, data.columns)
37
38
39
#%% Ejericio 2
40
41
data['nombre'].head(30)
42
#notamos que en las observaciones de la columna 'nombre'hay caracteres como: /, -, !, así como número
43
44
#A través de los siguientes comandos podemos extraer estos caracteres
45
data['name'] = data['nombre'].swifter.apply(lambda x: re.sub('/','',x))
46
#con el comando anterior extraemos al caracter '/'
47
data['name'] = data['name'].swifter.apply(lambda x: re.sub('-','',x))
48
#con el comando anterior extraemos al caracter '-'
49
data['name'] = data['name'].apply(lambda x: re.sub('[0-9]','',x))
50
#con el comando anterior extraemos los números del string
51
data['name'] = data['name'].swifter.apply(lambda x: re.sub('!','',x))
52
#con el comando anterior extraemos al caracter '!'
53
data['name'] = data['name'].swifter.apply(lambda x: re.sub(' .','',x))
54
#con el comando anterior extraemos el punto '.'
55
56
data[['nombre','name']].head(30)
57
#Ahora la columna 'name'contiene únicamente los nombres de las personas
58
59
#%% Ejericio 3
60
61
#Ahora estamos interesados en pulir la información de la fecha
62
63
#Primero eliminamos el componente de minutos y segundos '00:00' a través del siguiente código
64
data["bdate"] = data["born_date"].str.replace("\s00:00", "")
65
66
data['bdate'].head(30) #Pero también notamos que hay observaciones con los caracteres '#% y !
67
68
#Eliminamos entonces el caracter !
69
data['bdate'] = data['bdate'].swifter.apply(lambda x: re.sub(' !','',x))
70
71
#Así como la cadena de caracteres "#%
72
data['bdate'] = data['bdate'].swifter.apply(lambda x: re.sub(' "#%','',x))
73
74
data['bdate'].head(30) #Ahora contamos con el string apropiado, pero aún debemos convertirlo en formato fecha
75
76
data['bdate'].info() #Efectivamente, no está en formato date
77
78
#Proponemos dos alternativas para convertir el string en formato date:
79
80
#Alternativa 1: usar el comando astype especificando el formato datetime64[ns]
81
data['new_date']=data['bdate'].astype('datetime64[ns]')
82
83
#Alternativa 2: usar el comando pd.to_datetime pidiendo que se infiera el tipo de formato date que se empleará
84
#Esta opción es especialmente relevante cuando el set string no es homogeneo
85
data['new_date2'] = pd.to_datetime(data['bdate'], infer_datetime_format=True)
86
87
88
data[['new_date','new_date2']].info() #notamos que ahora las observaciones están en formato dummy
89
90
#%% Ejericio 4
91
92
#Ahora nos concentraremos en limpiar la columna de edad
93
#Los caracteres que queremos eliminar son los siguientes:!#, -, .., !
94
#También queremos eliminar el texto de las observaciones
95
96
#Pero el primer paso es convertir los valores de la columna age de object a string
97
data['age'].info()
98
#De esta forma podremos extarer partes de la cadena de texto luego
99
data = data.astype({'age':'string'}) #convertimos la variable age a string
100
101
#Luego, extraigamos los caracteres innecesarios:
102
data['age'] = data['age'].swifter.apply(lambda x: re.sub('!#','',x))
103
data['age'] = data['age'].swifter.apply(lambda x: re.sub(' -','',x))
104
data['age'] = data['age'].swifter.apply(lambda x: re.sub('!','',x))
105
106
data['age'] = data['age'].str.replace(r'\D', '')
107
108
#Por último, y para facilitar el análisis anterior, convertimos las observaciones a formato integer
109
110
data = data.astype({'age':'int'})
111
data['age'].info()
112
113
114
#%% Ejercicio 5
115
# Crear dummies según el rango del sentenciado en la organización criminal
116
#dum1: toma el valor de 1 si el sentenciado fue líder de la banda criminal
117
#dum2: toma el valor de 1 si el sentenciado fue cabecilla local
118
#dum3: toma el valor de 1 si el sentenciado fue cabecilla regional
119
#dum4: toma el valor de 1 si el sentenciado fue sicario
120
#dum5: toma el valor de 1 si el sentenciado realizó extorsión
121
#dum6: toma el valor de 1 si el sentenciado fue miembro regular
122
#dum7: toma el valor de 1 si el sentenciado fue novato o principiante
123
124
#Creamos todas las dummies con con un condicional ifelse y detect para todo el valor de la variable o con la letra que empiece
125
#Para dum1 que detecte si la variable es "lider de la banda criminal" y si es asi toma 1 sino 0
126
#Para dum2 que detecte si la variable es "cabecilla local" y si es asi toma 1 sino 0
127
#Para dum3 que detecte si la variable es "cabecilla regional" y si es asi toma 1 sino 0
128
#Para dum4 que detecte si la variable empieza con las letras "sic" y si es asi toma 1 sino 0
129
data["dum1"] = np.where(data["rank"] == "Lider de la banda criminal",1, 0)
130
data["dum2"] = np.where(data["rank"] == "Cabecilla local",1, 0)
131
data["dum3"] = np.where(data["rank"] == "Cabecilla regional",1, 0)
132
data["dum4"] = np.where(data["rank"] == "Sicario",1, 0)
133
134
135
#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 0
136
#Para dum6 que detecte si la variable empieza con las letra "m" y si es asi toma 1 sino 0
137
data['dum5'] = np.where(data['rank'].str.contains('^extor'),1,0)
138
data["dum6"] = np.where(data["rank"] == "miembro",1, 0)
139
140
#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 0
141
data['dum7'] = np.where(data['rank'].str.contains('nov|noa|princ'),1,0)
142
143
144
145
146
#%% Ejercicio 7
147
# Extraer el usuario del correo electrónico.
148
data.correo_abogado = data.correo_abogado.astype('str') # Primero se procede a convertir en string
149
data['user_correo']= data['correo_abogado'].swifter.apply(lambda x: re.search("(\w+)\@\.*", str(x)).group(1))
150
151
152
#%% Ejercicio 8
153
# 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.
154
data['dni_nuevo'] = data['dni'].swifter.apply(lambda x: re.sub('dni','',x))
155
156
157
#%% Ejercicio 9
158
# A partir de la columna observaciones, crear las siguiente variables:
159
160
161
# crimen: debe contener información del delito cometido, y para ello se indica la seccion de texto que debe extraer
162
def crimen(x): # Esta es la función crimen
163
164
data['crimen'] = data['observaciones'].apply(lambda x: crimen(x))
165
data['crimen'] = data['observaciones'].apply(crimen)
166
167
# n_hijos: cantidad de hijos del criminal
168
def n_hijos(w): # Función n_hijos
169
170
data['n_hijos'] = data['observaciones'].apply(lambda y: n_hijos(y))
171
data['n_hijos'] = data['observaciones'].apply(n_hijos)
172
173
174
# edad_inicio : edad de inicio en actividades criminales
175
176
def edad_inicio(p): # Función edad_inicio
177
data['edad_inicio'] = data['observaciones'].apply(lambda z: edad_inicio(z))
178
data['edad_inicio'] = data['observaciones'].apply(edad_inicio)
179
180