Path: blob/main/Trabajo_grupal/WG5/Solucion/script_py.py
2835 views
# -*- coding: utf-8 -*-1"""23Privatización de métodos y variables45Detección de duplicados en archivo spss67@author: Roberto8"""910import pandas as pd11import numpy as np12import pyreadr # Load R dataset13import os # for usernanme y set direcotrio14151617class RegClass( object ):1819# Una de las aplicaciones de la isntancia slot es fijar métodos20# Para ello se debe especificar todos los atributos creados.21# Caso contrario, la estrucutra de clase no reconocerá ningun atributo2223__slots__ = [ "__X", "y", "select_vars", "sd_robust", "X_np", "y_np" ,24"columns", "beta_OLS", "beta_se", "up_bd", "lw_bd",25"R2", "rmse"26]272829def __init__( self, X : pd.DataFrame , y : pd.Series , select_vars , sd_robust ):303132if not isinstance( X, pd.DataFrame ):33raise TypeError( "X must be a pd.DataFrame." )3435if not isinstance( y , pd.Series ):36raise TypeError( "y must be a pd.Series." )373839# asignamos los atributos4041self.__X = X # atributo X fijado42self.y = y43self.select_vars = select_vars44self.sd_robust = sd_robust4546# Try: ejecuta la seleccion de variables usando .loc (filtro de columnas por nombres)47# Entonces, si select_var es una lista de variables, entonces se ejecuta la linea 148# Por otro lado, soi select_vars es una lista de posiciones de columnas, entonces49# la linea 1 no podrá ejecutarse y se ejecutará la linea 2.5051try:5253self.__X = self.__X.loc[ : , self.select_vars ] # 1)5455except Exception:5657self.__X = self.__X.iloc[:, self.select_vars] # 2)58596061self.__X[ 'Intercept' ] = 16263cols = self.__X.columns.tolist()64new_cols_orders = [cols[ -1 ]] + cols[ 0:-1 ]65self.__X = self.__X.loc[ : , new_cols_orders ]6667self.X_np = self.__X.values68self.y_np = self.y.values.reshape( -1 , 1 )69self.columns = self.__X.columns.tolist()7071# método que estima el vector de coeficientes7273def coefficients(self):7475X_np = self.X_np76y_np = self.y_np7778# beta_ols79beta_ols = np.linalg.inv( X_np.T @ X_np ) @ ( X_np.T @ y_np )8081self.beta_OLS = beta_ols8283def output1(self):8485self.coefficients()86beta_OLS = self.beta_OLS8788X_np = self.X_np89y_np = self.y_np909192# errors93e = y_np - ( X_np @ beta_OLS )9495# error variance96N = X.shape[ 0 ]97total_parameters = X.shape[ 1 ]98error_var = ( (e.T @ e)[ 0 ] )/( N - total_parameters )99100# Matriz de Varianza y covarianza101102var_OLS = error_var * np.linalg.inv( X_np.T @ X_np )103104# standard errors105106self.beta_se = np.sqrt( np.diag( var_OLS ) )107108# intervalo de confianza109110self.up_bd = beta_OLS.ravel() + 1.96*self.beta_se111112self.lw_bd = beta_OLS.ravel() - 1.96*self.beta_se113114115116def output2(self):117118self.coefficients()119120X_np = self.X_np121y_np = self.y_np122beta_OLS = self.beta_OLS123124125# errors126y_est = X_np @ beta_OLS127128e = y_np - y_est129130e_square = np.array( list( map( lambda x: x**2 , e)) )131132# Matrix de white133134matrix_robust = np.diag(list(e_square.flatten()))135136# Matrix de varianza y covarainza robusta ante heterocedasticidad137138Var_robust = np.linalg.inv(X_np.T @ X_np) @ X_np.T @ matrix_robust @ X_np @ np.linalg.inv(X_np.T @ X_np)139140# standard errors141142self.beta_se = np.sqrt( np.diag( Var_robust ) )143144self.up_bd = beta_OLS.ravel() + 1.96*self.beta_se145146self.lw_bd = beta_OLS.ravel() - 1.96*self.beta_se147148def output3(self):149150self.coefficients()151152y_np = self.y_np153X_np = self.X_np154N = X_np.shape[ 0 ]155y_est = X_np @ self.beta_OLS156157SCR = sum(list( map( lambda x: x**2 , y_np - y_est) ))158SCT = sum(list( map( lambda x: x**2 , y_np - np.mean(y_est) )))159self.R2 = 1-SCR/SCT160self.rmse = (SCR/N)**0.5161162163def table(self):164165166self.output3() # ejecutamos el metodo que calcula el R2 y root-mse167self.coefficients() # ejectuamos el metodo que estima el vector de coeficientes168169170if self.sd_robust == True :171172self.output2() # ejecutamos el metodo de errors estandar corregido ante heteroce.173174table_data ={ 'Coef.' : self.beta_OLS.ravel() ,175"Std.Err." : self.beta_se.ravel(),176"Lower_bound" : self.lw_bd.ravel(),177"Upper_bound" : self.up_bd.ravel()178}179180181# defining index names182index_names = self.columns183184# defining a pandas dataframe185reg_OLS = pd.DataFrame( table_data , index = index_names )186187# output188189190table_dict = {"Table":reg_OLS, "R2": self.R2, "MSE": self.rmse}191192else:193194self.output1() # ejecutamos el metodo de errors estandar sin corrección ante heterocedasticidad195196table_data ={ 'Coef.' : self.beta_OLS.ravel() ,197"Std.Err." : self.beta_se.ravel(),198"Lower_bound" : self.lw_bd.ravel(),199"Upper_bound" : self.up_bd.ravel()200}201202203# defining index names204index_names = self.columns205206# defining a pandas dataframe207reg_OLS = pd.DataFrame( table_data , index = index_names )208209# output210211212table_dict = {"Table":reg_OLS, "R2": self.R2, "MSE": self.rmse}213214215216217return table_dict218219220221222user = os.getlogin() # Username223224# Set directorio225226os.chdir(f"C:/Users/{user}/Documents/GitHub/1ECO35_2022_2/Trabajo_grupal/WG4/Solucion") # Set directorio227228cps2012_env = pyreadr.read_r("../../../data/cps2012.Rdata") # output formato diccionario229230231cps2012 = cps2012_env[ 'data' ].iloc[0:500] # seleccionamo solo 500 observaciones232233234Y = cps2012['lnw']235X = cps2012.iloc[:,np.arange(1,18)] # No consideramos el logaritmo del salario236237238Regression1 = RegClass(X, Y , ["female","hsg","cg","exp1","exp2"] , sd_robust = True)239Regression1.table()240241# Intentaremos observar el atributo X242243Regression1.X244245Regression1.__X246247# ! No podemoa acceder al atributo X248249# Intento de alterar el atributo X250251252Regression1.__X = 1253254# ! Tampoco podemos alteralo255256# creamos una función257258def function(x):259260None261262263# intentaremos alterar el método table264265Regression1.table = function266267268# No podemos alterar el método table !!!269270#%% Deteccion de duplicados271272import savReaderWriter as sav273import pyreadstat274275# se sube la base de datos276277data = pd.read_spss( r"../../../data/data_administrativa.sav" )278279280# Usamos sav.SavHeaderReader para leer las estiquetas281282with sav.SavHeaderReader( r"../../../data/data_administrativa.sav", ioUtf8=True) as header:283metadata = header.all() # save dataset284value_labels_data = metadata.valueLabels # get labels from varaibles's values285var_labels_data = metadata.varLabels # get labels from variables286287# value_labels_data, var_labels_data son objetos diccionarios288289var_labels_data.keys()290291var_labels_data['P209']292var_labels_data['P206']293294value_labels_data.keys()295296value_labels_data['P209']297value_labels_data['P206']298299# Asignamos las etiquetas a la base de datos300301302data.attrs[ 'value_labels' ] = value_labels_data # value's labels303data.attrs[ 'var_labels' ] = var_labels_data # var labels304305#Observamos las estiquetas asignadas a la base de datos306307data.attrs[ 'value_labels' ]308data.attrs[ 'var_labels' ]309310# Observamos los atributos asignados a la base de datos311312data.attrs313314315# Mostrar las observaciones que presentan duplicados y sus duplicados respectivos316317data_1 = data[ data.loc[:, ['CONGLOME' ,'VIVIENDA' , 'HOGAR','CODPERSO']].duplicated(keep = False) ]318319# se ordena por identificador de persona y año320# De esta manera, se observa la información de la persona como un panel de datos321322data_1.sort_values(['CONGLOME' ,'VIVIENDA' , 'HOGAR','CODPERSO','year'], inplace = True)323324data_2019 = data_1[data_1['year'] == "2019"]325326pyreadstat.write_sav(data_2019, r"../../../data/data2019.sav")327328data_2020 = data_1[data_1['year'] == "2020"]329330pyreadstat.write_sav(data_2020, r"../../../data/data2020.sav")331332333334335336337338339340341342