Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
robertopucp
GitHub Repository: robertopucp/1eco35_2022_2
Path: blob/main/Trabajo_grupal/WG5/Grupo_6_py.py
2714 views
1
# -*- coding: utf-8 -*-
2
"""
3
Created on Sat Oct 1 19:16:21 2022
4
5
@author: HP
6
"""
7
8
################ TAREA 6 #####################
9
######### Curso: Laboratorio de R y Python #########
10
################ GRUPO 6 #####################
11
12
#%% Pregunta 1
13
14
#--------------- Recordando todo lo avanzado en la Tarea 4
15
# Primero es necesario que importemos las librerias para crear las clases, definir atributos y finalmente crear los modelos
16
17
import numpy as np
18
import pandas as pd
19
from pandas import DataFrame, Series
20
import statistics
21
import inspect
22
import pyreadr # Cargar la base de datos de R
23
import os # Para identificar el directorio
24
25
# Llamamos el paquete que nos permitirá llevar a cabo la regresión lineal
26
from scipy.stats import t #Refiriendo al estadistico t-student
27
28
# Comenzamos a crear la clase, en la parte de class RegClass, podemos omitir object, pues es lo mismo
29
class RegClass( object ):
30
31
def __init__( self, X : pd.DataFrame , y : pd.Series , intercept = True ):
32
def __init__(self, explicativas, vector, extraer, booleano):
33
34
self.explicativas = explicativas
35
self.vector = vector
36
self.booleano = booleano
37
38
# Indicamos que X sea un data frame e Y sea una lista, proponiendo una condicional para ambos)
39
if not isinstance( X, pd.DataFrame ):
40
raise TypeError( "X must be a pd.DataFrame." )
41
42
if not isinstance( y , pd.Series ):
43
raise TypeError( "y must be a pd.Series." )
44
45
# asignando atributos de la clase correspondientes
46
47
self.X = X
48
self.y = y
49
self.intercept = intercept
50
51
if self.intercept:
52
53
self.X[ 'Intercept' ] = 1
54
# Se coloca la columna Intercept en la primera columna
55
cols = self.X.columns.tolist() # nombre de varaible a lista
56
new_cols_orders = [cols[ -1 ]] + cols[ 0:-1 ] # juntando listas
57
58
# new_cols_orders = [cols[ -1 ]].extend(cols[ 0:-1 ]) # append lista a una lista
59
60
# [cols[ -1 ]] la jala la ultima fila , cols[ 0:-1 ] primera fila hasta la penultima fila
61
62
self.X = self.X.loc[ : , new_cols_orders ] # usamos .loc que filtra por nombre de filas o columnas
63
64
else:
65
pass
66
67
# Ahora se está creando nuevos atributos y filtramos los nombres
68
69
self.X_np = self.X.values # Dataframe a multi array
70
self.y_np = y.values.reshape( -1 , 1 ) # de objeto serie a array columna
71
self.columns = self.X.columns.tolist() # nombre de la base de datos como objeto lista
72
73
##### Método 1 #####
74
##################
75
# Se busca estimar los coeficientes de la regresión
76
# Definimos la regresión
77
78
def reg_beta_OLS( self ):
79
# X se define como Matriz, mientras Y como vector columna
80
81
X_np = self.X_np
82
y_np = self.y_np
83
84
# Utilizando el beta_ols
85
beta_ols = np.linalg.inv( X_np.T @ X_np ) @ ( X_np.T @ y_np )
86
87
# columnas de X
88
index_names = self.columns
89
# Aqui definimos la salida o el output
90
beta_OLS_output = pd.DataFrame( beta_ols , index = index_names , columns = [ 'Coef.' ] )
91
92
# Finalmente, queda un Dataframe de coeffientes como atributo
93
94
self.beta_OLS = beta_OLS_output
95
96
return beta_OLS_output
97
98
##### Método 2 #####
99
##################
100
# Se busca hallar la matriz de varianzas y covarianzas, en modo estándar:
101
# Primero buscamos hallar el error estandar y la varianza a continuación
102
103
def reg_var_OLS( self ):
104
105
# PRIMERO, Se corre la función reg_beta_OLS para estimar el vector de coeficientes
106
107
self.reg_beta_OLS()
108
109
X_np = self.X_np
110
y_np = self.y_np
111
112
# beta_ols
113
beta_OLS = self.beta_OLS.values.reshape( - 1, 1 ) # Dataframe a vector columna
114
115
# Analizamos los errores
116
e = y_np - ( X_np @ beta_OLS )
117
118
# Luego, se evalua la varianza del error
119
N = X.shape[ 0 ]
120
total_parameters = X.shape[ 1 ]
121
error_var = ( (e.T @ e)[ 0 ] )/( N - total_parameters )
122
123
# SEGUNDO, para hallar la Varianza
124
var_OLS = error_var * np.linalg.inv( X_np.T @ X_np )
125
126
# columns names
127
index_names = self.columns
128
# Tendremos el output desde la creación del atributo VAR
129
var_OLS_output = pd.DataFrame( var_OLS , index = index_names , columns = index_names )
130
## variance output como nuevo atributo del objeto
131
self.var_OLS = var_OLS_output
132
133
# TERCERO, ahora corremos la funcion OLS, para hallar la varianza y desviacion estandar
134
def reg_OLS( self ):
135
136
# Se corren las funciones
137
self.reg_beta_OLS()
138
self.reg_var_OLS()
139
X = self.X_np
140
141
# Varianza y Coeficientes betas
142
beta_OLS = self.beta_OLS.values.reshape( -1, 1 )
143
var_OLS = self.var_OLS.values
144
145
# Hallando error estándar
146
beta_se = np.sqrt( np.diag( var_OLS ) )
147
148
# FINALMENTE, para analizar la significacia se calcula el test statistic para cada coeficiente
149
t_stat = beta_OLS.ravel() / beta_se.ravel()
150
151
# .ravel() te multiarray a simple array
152
153
# p-value:
154
N = X.shape[ 0 ]
155
k = beta_OLS.size
156
self.nk = N-k
157
pvalue = (1 - t.cdf(t_stat, df= N - k) ) * 2
158
159
# ADEMÁS, se evalúa el intervalo de confianza para los coeficientes estimados (bajo un 95% con un valor de 1.96)
160
161
up_bd = beta_OLS.ravel() + 1.96*beta_se
162
lw_bd = beta_OLS.ravel() - 1.96*beta_se
163
164
table_data ={ 'Coef.' : beta_OLS.ravel() , # .ravel() :: .flatten()
165
"Std.Err." : beta_se.ravel(),
166
"t" : t_stat.ravel(),
167
"P>|t|" : pvalue.ravel(),
168
"[0.025" : lw_bd.ravel(),
169
"0.975]" : up_bd.ravel()
170
}
171
172
# defining index names
173
index_names = self.columns
174
175
# defining a pandas dataframe
176
reg_OLS = pd.DataFrame( table_data , index = index_names )
177
178
return reg_OLS
179
180
##### Método 3 #####
181
##################
182
# Aqui nos piden un método para hallar la matriz de varianza y covarianza robusta
183
def M_ROBUST_COV(self):
184
# ESTIMACIÓN DEL VECTOR DE COEFICIENTES.
185
self.beta_OLS_Reg()
186
187
# usamos atributos pero con el nombre simplificado
188
X_np = self.X_np
189
y_np = self.y_np
190
191
# VARIANZA ROBUSTA, tomando de base a la matriz propuesta de White para muestras grandes
192
# V = np.zeros ((X_np.shape[1]. X_np. shape(1)))
193
self.y_est = X_np @ self.beta_OLS
194
195
matrix_robust = np.diag(list( map( lambda x: x**2 , y_np - self.y_est)))
196
197
self.robust_var = np.linalg.inv(X_np.T @ X) @ X_np.T @ matrix_robust @ X_np @ np.linalg.inv(X_np.T @ X_np)
198
199
##### Método 4 #####
200
##################
201
# Se definirá el método que permita hallar la matriz de varianza y covarianza estándar, los errores estándar de cada coeficiente, e intervalos de confianza. Determinamos que X sea un data frame, mientras Y sea una columna, de modo que tambien se utiliza el args
202
#Se crea atributo de vector de variable Y
203
X1 = self.Y.to_numpy().reshape(self.n ,1) # Se mantiene como DataFrame. Se crea atributo de variables explicativas
204
self.X = X
205
self.Y = Y #Se crea el atributo para extraer el vector de la variable Y
206
self.beta = np.linalg.inv(X.T @ X) @ ((X.T) @ Y )
207
208
self.nk = self.n - k #Para determinar grados de libertad
209
# Se definirá un método que halle el R2 y root MSE (mean square error)
210
211
def R2(self):
212
213
self.coeficientes()
214
y_est = self.X @ self.beta
215
error = self.Y - y_est
216
self.SCR = np.sum(np.square(error))
217
SCT = np.sum(np.square(self.Y - np.mean(self.Y)))
218
R2 = 1 - self.SCR/SCT
219
220
return R2
221
# Ahora, para hallar el root MSE, primero hay que llamar al paquete que nos permitirá encontrarlo
222
from sklearn.metrics import mean_squared_erro
223
#Definimos el método
224
225
def MSE(true,predicted):
226
227
MSE = mean_squared_error(true,predicted, squared=False)
228
229
return MSE
230
231
##### Método 5 #####
232
##################
233
# Primero se necesita cargar la base de datos, por ello utilizamos el user que se utilice sin necesidad de cambiar el usuario del computador
234
user = os.getlogin()
235
os.chdir(f"Users/{user}/Documents/GitHub/1ECO35_2022_2/Lab4") #Tomar en cuenta que al trabajar en una Mac o sistema IOs, no se usa el C:"
236
237
cps2012_UNO = pyreadr.read_r("../data/cps2012.Rdata")
238
cps2012 = cps2012_UNO['data']
239
dt = cps2012.describe
240
241
#ES NECESARIO FILTRAR LAS VARIANZAS DISTINTAS A 0
242
243
variance_cols = cps2012.var().to_numpy()
244
dataset = cps2012.iloc[:, np.where(variance_cols !=0 )[0]]
245
## aca poner un dataset específico desde el general, podría ser con iloc y squeeze()
246
247
248
#%%
249
#--------------- Se privatizará el atributo X
250
251
############# Privatizando el atributo X (Data frame)
252
253
### EN MÉTODO 1: INICIALMENTE, Comenzamos a crear la clase, class RegClass
254
class RegClass( object ):
255
256
#Ahora comenzamos a cambiar la estructura de privatización, cambiando a los atributos de X
257
def __init__( self, X : pd.DataFrame , y : pd.Series , intercept = True ):
258
def __init__(self, explicativas, vector, extraer, booleano):
259
# asignando atributos de la clase correspondientes
260
261
self.__X = X
262
self.y = y
263
self.intercept = intercept
264
if self.intercept:
265
266
self.X[ 'Intercept' ] = 1
267
# Se coloca la columna Intercept en la primera columna
268
cols = self.__X.columns.tolist() # nombre de varaible a lista
269
new_cols_orders = [cols[ -1 ]] + cols[ 0:-1 ] # juntando listas
270
271
# new_cols_orders = [cols[ -1 ]].extend(cols[ 0:-1 ]) # append lista a una lista
272
273
# [cols[ -1 ]] la jala la ultima fila , cols[ 0:-1 ] primera fila hasta la penultima fila
274
275
self.__X = self.__X.loc[ : , new_cols_orders ] # usamos .loc que filtra por nombre de filas o columnas
276
277
else:
278
pass
279
280
# Ahora se está creando nuevos atributos y filtramos los nombres
281
282
self.__X_np = self.__X.values # Dataframe a multi array
283
self.y_np = y.values.reshape( -1 , 1 ) # de objeto serie a array columna
284
self.columns = self.__X.columns.tolist() # nombre de la base de datos como objeto lista
285
### EN MÉTODO 2:
286
def reg_var_OLS( self ):
287
288
# PRIMERO, Se corre la función reg_beta_OLS para estimar el vector de coeficientes
289
290
self.reg_beta_OLS()
291
292
X_np = self.__X_np
293
y_np = self.y_np
294
295
# beta_ols
296
beta_OLS = self.beta_OLS.values.reshape( - 1, 1 ) # Dataframe a vector columna
297
298
# Analizamos los errores
299
e = y_np - ( X_np @ beta_OLS )
300
301
# Luego, se evalua la varianza del error
302
N = X.shape[ 0 ]
303
total_parameters = X.shape[ 1 ]
304
error_var = ( (e.T @ e)[ 0 ] )/( N - total_parameters )
305
306
# SEGUNDO, para hallar la Varianza
307
var_OLS = error_var * np.linalg.inv( X_np.T @ X_np )
308
309
# columns names
310
index_names = self.columns
311
# Tendremos el output desde la creación del atributo VAR
312
var_OLS_output = pd.DataFrame( var_OLS , index = index_names , columns = index_names )
313
## variance output como nuevo atributo del objeto
314
self.var_OLS = var_OLS_output
315
316
# TERCERO, ahora corremos la funcion OLS, para hallar la varianza y desviacion estandar
317
def reg_OLS( self ):
318
319
# Se corren las funciones
320
self.reg_beta_OLS()
321
self.reg_var_OLS()
322
X = self.__X_np
323
324
# Varianza y Coeficientes betas
325
beta_OLS = self.beta_OLS.values.reshape( -1, 1 )
326
var_OLS = self.var_OLS.values
327
328
# Hallando error estándar
329
beta_se = np.sqrt( np.diag( var_OLS ) )
330
331
# FINALMENTE, para analizar la significacia se calcula el test statistic para cada coeficiente
332
t_stat = beta_OLS.ravel() / beta_se.ravel()
333
334
# .ravel() te multiarray a simple array
335
336
# p-value:
337
N = X.shape[ 0 ]
338
k = beta_OLS.size
339
self.nk = N-k
340
pvalue = (1 - t.cdf(t_stat, df= N - k) ) * 2
341
### EN METODO 3
342
def M_ROBUST_COV(self):
343
# ESTIMACIÓN DEL VECTOR DE COEFICIENTES.
344
self.beta_OLS_Reg()
345
346
# usamos atributos pero con el nombre simplificado
347
X_np = self.__X_np
348
y_np = self.y_np
349
350
# VARIANZA ROBUSTA, tomando de base a la matriz propuesta de White para muestras grandes
351
# V = np.zeros ((X_np.shape[1]. X_np. shape(1)))
352
self.y_est = X_np @ self.beta_OLS
353
354
matrix_robust = np.diag(list( map( lambda x: x**2 , y_np - self.y_est)))
355
356
self.robust_var = np.linalg.inv(X_np.T @ X) @ X_np.T @ matrix_robust @ X_np @ np.linalg.inv(X_np.T @ X_np)
357
358
### EN METODO 4
359
X1 = self.Y.to_numpy().reshape(self.n ,1) # Se mantiene como DataFrame. Se crea atributo de variables explicativas
360
self.__X = X
361
self.Y = Y #Se crea el atributo para extraer el vector de la variable Y
362
self.beta = np.linalg.inv(X.T @ X) @ ((X.T) @ Y )
363
364
self.nk = self.n - k #Para determinar grados de libertad
365
# Se definirá un método que halle el R2 y root MSE (mean square error)
366
367
def R2(self):
368
369
self.coeficientes()
370
y_est = self.__X @ self.beta
371
error = self.Y - y_est
372
self.SCR = np.sum(np.square(error))
373
SCT = np.sum(np.square(self.Y - np.mean(self.Y)))
374
R2 = 1 - self.SCR/SCT
375
376
return R2
377
# Ahora, para hallar el root MSE, primero hay que llamar al paquete que nos permitirá encontrarlo
378
from sklearn.metrics import mean_squared_erro
379
#Definimos el método
380
381
def MSE(true,predicted):
382
383
MSE = mean_squared_error(true,predicted, squared=False)
384
385
return MSE
386
387
#%%
388
#--------------- Se privatizará el método de diccionario
389
### EN MÉTODO 5
390
# A continuación el punto clave: Colocar la instancia __slot__ con todos los atributos que hayan creado en su estructura de clase.
391
392
__slots__ = [ '__X', 'y', 'intercept', 'X_np', 'y_np', 'columns', 'beta_OLS'] # colocar todos los atributos que hayan definido en se clase. Observen que X se incluye privatizado
393
394
ghjkl
395
#%% Pregunta 2
396
from IPython.display import display, HTML
397
398
display(HTML(data="""
399
<style>
400
div#notebook-container { width: 75%; }
401
div#menubar-container { width: 95%; }
402
div#maintoolbar-container { width: 65%; }
403
</style>
404
"""))
405
406
import numpy as np
407
import pandas as pd
408
from pandas import DataFrame,Series
409
import savReaderWriter as sav
410
411
!pip install pyreadstat # open spss dataset // #por si necesitamos instalar
412
!pip install savReaderWriter // #por si necesitamos instalar
413
414
data_administrativa = pd.read_spss( r"../data/enapres_2020_ch_100/736-Modulo1618/CAP_100_URBANO_RURAL_3.sav" )
415
416
# cargamos usando pandas
417
418
data_administrativa
419
420
with sav.SavHeaderReader(r"../data/data_administrativa.sav", ioUtf8=True) as header:
421
metadata = header.all()
422
labels_data_administrativa = metadata.valueLabels
423
var_labels_data_administrativa = metadata.varLabels
424
425
# Mostrar las variables que presentan missing values
426
427
# Opción 1 -> info, todo lo que no presente 42153 datos (N), necesariamente presentará missing values.
428
429
data_administrativa.info(verbose=True,null_counts=True)
430
431
# Opción 2 -> isnull para explorar sobre todas las variables que presenten missing values.
432
data_administrativa.isnull
433
434
# Mostrar las etiquetas de dos variables (var labels) y las etiquetas de los valores en dos variables (value's labels).
435
436
labels_data_administrativa.keys #utilizamos keys para conocer las variables
437
var_labels_data_administrativa.keys
438
439
#ya que nos piden dos de cada uno, necesitamos conocer los nombres.
440
441
labels_data_administrativa['AREA'] # mostramos las etiquetas de los valores
442
labels_data_administrativa['ESTRATO']
443
444
var_labels_data_administrativa['REGIONNATU'] # mostramos las etiquetas de dos variables
445
var_labels_data_administrativa['TSELV']
446
447
data_administrativa.attrs[ 'value_labels' ] = labels_data_administrativa # guardamos todas las lables.
448
data_administrativa.attrs[ 'var_labels' ] = var_labels_data_administrativa
449
450
# Detectar personas que fueran entrevistadas en ambos años. Para ello, se pide detectar duplicados a partir del identificador por persona : conglome, vivienda, hogar y codperso.
451
452
Nos piden crear un identificador por persona "Conglo, viv, hog, codper"
453
454
Con esto, buscamos identificar aquellos que se repitan.
455
456
data_administrativa[ data_administrativa.loc[:, ['CONGLOMERADO' , 'VIVIENDA', 'HOGAR', 'P100_C']].duplicated(keep = False)]
457
458
# keep False para mostrar todos los duplicados.
459
460
data_administrativa[ data_administrativa.loc[:, ['CONGLOMERADO' , 'VIVIENDA', 'HOGAR', 'P100_C']].duplicated(keep = False) ]\
461
[['CONGLOMERADO' , 'VIVIENDA', 'HOGAR', 'P100_C']]
462
463
# Ordene la base de datos a partir de las variables que identifican cada miembro y la variable de año (year). Así podrá observar a cada individuo en ambos años.
464
465
data_administrativa[ data_administrativa.loc[:, ['CONGLOMERADO' , 'VIVIENDA', 'HOGAR', 'P100_C']].duplicated() ]
466
467
468
# crear una base de datos para cada año y guardar en la carpeta data con los siguientes nombres data_2019_(numero de grupo) y data_2020_(numero de grupo).
469
import pyreadstat
470
471
pyreadstat.write_sav(df, r"../../data/enapres_2020_ch_100/736-Modulo1618/CAP_100_URBANO_RURAL_3.sav")
472