Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
robertopucp
GitHub Repository: robertopucp/1eco35_2022_2
Path: blob/main/Trabajo_grupal/WG5/Solucion/script_py.py
2835 views
1
# -*- coding: utf-8 -*-
2
"""
3
4
Privatización de métodos y variables
5
6
Detección de duplicados en archivo spss
7
8
@author: Roberto
9
"""
10
11
import pandas as pd
12
import numpy as np
13
import pyreadr # Load R dataset
14
import os # for usernanme y set direcotrio
15
16
17
18
class RegClass( object ):
19
20
# Una de las aplicaciones de la isntancia slot es fijar métodos
21
# Para ello se debe especificar todos los atributos creados.
22
# Caso contrario, la estrucutra de clase no reconocerá ningun atributo
23
24
__slots__ = [ "__X", "y", "select_vars", "sd_robust", "X_np", "y_np" ,
25
"columns", "beta_OLS", "beta_se", "up_bd", "lw_bd",
26
"R2", "rmse"
27
]
28
29
30
def __init__( self, X : pd.DataFrame , y : pd.Series , select_vars , sd_robust ):
31
32
33
if not isinstance( X, pd.DataFrame ):
34
raise TypeError( "X must be a pd.DataFrame." )
35
36
if not isinstance( y , pd.Series ):
37
raise TypeError( "y must be a pd.Series." )
38
39
40
# asignamos los atributos
41
42
self.__X = X # atributo X fijado
43
self.y = y
44
self.select_vars = select_vars
45
self.sd_robust = sd_robust
46
47
# Try: ejecuta la seleccion de variables usando .loc (filtro de columnas por nombres)
48
# Entonces, si select_var es una lista de variables, entonces se ejecuta la linea 1
49
# Por otro lado, soi select_vars es una lista de posiciones de columnas, entonces
50
# la linea 1 no podrá ejecutarse y se ejecutará la linea 2.
51
52
try:
53
54
self.__X = self.__X.loc[ : , self.select_vars ] # 1)
55
56
except Exception:
57
58
self.__X = self.__X.iloc[:, self.select_vars] # 2)
59
60
61
62
self.__X[ 'Intercept' ] = 1
63
64
cols = self.__X.columns.tolist()
65
new_cols_orders = [cols[ -1 ]] + cols[ 0:-1 ]
66
self.__X = self.__X.loc[ : , new_cols_orders ]
67
68
self.X_np = self.__X.values
69
self.y_np = self.y.values.reshape( -1 , 1 )
70
self.columns = self.__X.columns.tolist()
71
72
# método que estima el vector de coeficientes
73
74
def coefficients(self):
75
76
X_np = self.X_np
77
y_np = self.y_np
78
79
# beta_ols
80
beta_ols = np.linalg.inv( X_np.T @ X_np ) @ ( X_np.T @ y_np )
81
82
self.beta_OLS = beta_ols
83
84
def output1(self):
85
86
self.coefficients()
87
beta_OLS = self.beta_OLS
88
89
X_np = self.X_np
90
y_np = self.y_np
91
92
93
# errors
94
e = y_np - ( X_np @ beta_OLS )
95
96
# error variance
97
N = X.shape[ 0 ]
98
total_parameters = X.shape[ 1 ]
99
error_var = ( (e.T @ e)[ 0 ] )/( N - total_parameters )
100
101
# Matriz de Varianza y covarianza
102
103
var_OLS = error_var * np.linalg.inv( X_np.T @ X_np )
104
105
# standard errors
106
107
self.beta_se = np.sqrt( np.diag( var_OLS ) )
108
109
# intervalo de confianza
110
111
self.up_bd = beta_OLS.ravel() + 1.96*self.beta_se
112
113
self.lw_bd = beta_OLS.ravel() - 1.96*self.beta_se
114
115
116
117
def output2(self):
118
119
self.coefficients()
120
121
X_np = self.X_np
122
y_np = self.y_np
123
beta_OLS = self.beta_OLS
124
125
126
# errors
127
y_est = X_np @ beta_OLS
128
129
e = y_np - y_est
130
131
e_square = np.array( list( map( lambda x: x**2 , e)) )
132
133
# Matrix de white
134
135
matrix_robust = np.diag(list(e_square.flatten()))
136
137
# Matrix de varianza y covarainza robusta ante heterocedasticidad
138
139
Var_robust = np.linalg.inv(X_np.T @ X_np) @ X_np.T @ matrix_robust @ X_np @ np.linalg.inv(X_np.T @ X_np)
140
141
# standard errors
142
143
self.beta_se = np.sqrt( np.diag( Var_robust ) )
144
145
self.up_bd = beta_OLS.ravel() + 1.96*self.beta_se
146
147
self.lw_bd = beta_OLS.ravel() - 1.96*self.beta_se
148
149
def output3(self):
150
151
self.coefficients()
152
153
y_np = self.y_np
154
X_np = self.X_np
155
N = X_np.shape[ 0 ]
156
y_est = X_np @ self.beta_OLS
157
158
SCR = sum(list( map( lambda x: x**2 , y_np - y_est) ))
159
SCT = sum(list( map( lambda x: x**2 , y_np - np.mean(y_est) )))
160
self.R2 = 1-SCR/SCT
161
self.rmse = (SCR/N)**0.5
162
163
164
def table(self):
165
166
167
self.output3() # ejecutamos el metodo que calcula el R2 y root-mse
168
self.coefficients() # ejectuamos el metodo que estima el vector de coeficientes
169
170
171
if self.sd_robust == True :
172
173
self.output2() # ejecutamos el metodo de errors estandar corregido ante heteroce.
174
175
table_data ={ 'Coef.' : self.beta_OLS.ravel() ,
176
"Std.Err." : self.beta_se.ravel(),
177
"Lower_bound" : self.lw_bd.ravel(),
178
"Upper_bound" : self.up_bd.ravel()
179
}
180
181
182
# defining index names
183
index_names = self.columns
184
185
# defining a pandas dataframe
186
reg_OLS = pd.DataFrame( table_data , index = index_names )
187
188
# output
189
190
191
table_dict = {"Table":reg_OLS, "R2": self.R2, "MSE": self.rmse}
192
193
else:
194
195
self.output1() # ejecutamos el metodo de errors estandar sin corrección ante heterocedasticidad
196
197
table_data ={ 'Coef.' : self.beta_OLS.ravel() ,
198
"Std.Err." : self.beta_se.ravel(),
199
"Lower_bound" : self.lw_bd.ravel(),
200
"Upper_bound" : self.up_bd.ravel()
201
}
202
203
204
# defining index names
205
index_names = self.columns
206
207
# defining a pandas dataframe
208
reg_OLS = pd.DataFrame( table_data , index = index_names )
209
210
# output
211
212
213
table_dict = {"Table":reg_OLS, "R2": self.R2, "MSE": self.rmse}
214
215
216
217
218
return table_dict
219
220
221
222
223
user = os.getlogin() # Username
224
225
# Set directorio
226
227
os.chdir(f"C:/Users/{user}/Documents/GitHub/1ECO35_2022_2/Trabajo_grupal/WG4/Solucion") # Set directorio
228
229
cps2012_env = pyreadr.read_r("../../../data/cps2012.Rdata") # output formato diccionario
230
231
232
cps2012 = cps2012_env[ 'data' ].iloc[0:500] # seleccionamo solo 500 observaciones
233
234
235
Y = cps2012['lnw']
236
X = cps2012.iloc[:,np.arange(1,18)] # No consideramos el logaritmo del salario
237
238
239
Regression1 = RegClass(X, Y , ["female","hsg","cg","exp1","exp2"] , sd_robust = True)
240
Regression1.table()
241
242
# Intentaremos observar el atributo X
243
244
Regression1.X
245
246
Regression1.__X
247
248
# ! No podemoa acceder al atributo X
249
250
# Intento de alterar el atributo X
251
252
253
Regression1.__X = 1
254
255
# ! Tampoco podemos alteralo
256
257
# creamos una función
258
259
def function(x):
260
261
None
262
263
264
# intentaremos alterar el método table
265
266
Regression1.table = function
267
268
269
# No podemos alterar el método table !!!
270
271
#%% Deteccion de duplicados
272
273
import savReaderWriter as sav
274
import pyreadstat
275
276
# se sube la base de datos
277
278
data = pd.read_spss( r"../../../data/data_administrativa.sav" )
279
280
281
# Usamos sav.SavHeaderReader para leer las estiquetas
282
283
with sav.SavHeaderReader( r"../../../data/data_administrativa.sav", ioUtf8=True) as header:
284
metadata = header.all() # save dataset
285
value_labels_data = metadata.valueLabels # get labels from varaibles's values
286
var_labels_data = metadata.varLabels # get labels from variables
287
288
# value_labels_data, var_labels_data son objetos diccionarios
289
290
var_labels_data.keys()
291
292
var_labels_data['P209']
293
var_labels_data['P206']
294
295
value_labels_data.keys()
296
297
value_labels_data['P209']
298
value_labels_data['P206']
299
300
# Asignamos las etiquetas a la base de datos
301
302
303
data.attrs[ 'value_labels' ] = value_labels_data # value's labels
304
data.attrs[ 'var_labels' ] = var_labels_data # var labels
305
306
#Observamos las estiquetas asignadas a la base de datos
307
308
data.attrs[ 'value_labels' ]
309
data.attrs[ 'var_labels' ]
310
311
# Observamos los atributos asignados a la base de datos
312
313
data.attrs
314
315
316
# Mostrar las observaciones que presentan duplicados y sus duplicados respectivos
317
318
data_1 = data[ data.loc[:, ['CONGLOME' ,'VIVIENDA' , 'HOGAR','CODPERSO']].duplicated(keep = False) ]
319
320
# se ordena por identificador de persona y año
321
# De esta manera, se observa la información de la persona como un panel de datos
322
323
data_1.sort_values(['CONGLOME' ,'VIVIENDA' , 'HOGAR','CODPERSO','year'], inplace = True)
324
325
data_2019 = data_1[data_1['year'] == "2019"]
326
327
pyreadstat.write_sav(data_2019, r"../../../data/data2019.sav")
328
329
data_2020 = data_1[data_1['year'] == "2020"]
330
331
pyreadstat.write_sav(data_2020, r"../../../data/data2020.sav")
332
333
334
335
336
337
338
339
340
341
342