@@ -37,62 +37,87 @@ def df_info(df):
3737 s = buffer .getvalue ()
3838 return s
3939
40+
41+
42+ class stdScaler (TransformerMixin , BaseEstimator ):
43+
44+ def fit (self , X , y = None ):
45+ self .means_ = X .mean (axis = 0 )
46+ self .std_dev_ = X .std (axis = 0 )
47+ return self
48+
49+ def transform (self , X , y = None ):
50+ return (X - self .means_ [:X .shape [1 ]]) / self .std_dev_ [:X .shape [1 ]]
51+
52+
53+
54+ def OneHotEncode (original_df , feature_to_encode ):
55+ encoded_cols = pd .get_dummies (original_df [feature_to_encode ])
56+ res = pd .concat ([original_df , encoded_cols ], axis = 1 )
57+ res = res .drop ([feature_to_encode ], axis = 1 )
58+ return (res )
59+
4060vars = ['FixationPointX_(MCSpx)' ,'FixationPointY_(MCSpx)' ,'Fixation' ,'Saccade' ,'Unclassified' ]
4161
42- # class stdScaler(TransformerMixin, BaseEstimator):
43-
44- # def fit(self, X, y=None):
45- # self.means_ = X.mean(axis=0)
46- # self.std_dev_ = X.std(axis=0)
47- # return self
48-
49- # def transform(self, X, y=None):
50- # return (X - self.means_[:X.shape[1]]) / self.std_dev_[:X.shape[1]]
51-
52-
53-
54- # La selección de escena debe estar aqui
55- # esc = 6
56- # X = df.loc[df['escena' + str(esc)] == 1]
57- # def check_df(df_in):
58- # # En primer lugar ajusta el nombre de las columnas a la forma requerida
59- # df_in.rename(columns=lambda x: x.replace(" ", "_"), inplace=True)
60- # cols = df_in.columns.tolist()
61-
62- # # Compara los elementos de la lista de variables necesarias (vars) con las del archivo introducido (cols).
63- # if set(vars).issubset(set(cols)):
64- # if len(vars) == len(cols):
65- # df = df_in
66- # else:
67- # message = 'Las variables del archivo de entrada no coinciden con las esperadas. Se eliminarán las no necesarias.'
68- # st.info(message)
69- # df = df_in.drop(columns=set(cols) - set(vars))
70- # else:
71- # st.error("El archivo introducido no tiene todas las variables necesarias.")
72- # return False
73- # #sys.exit()
74-
75- # df.fillna(0, inplace=True)
62+ def check_df (df_in ):
63+ # En primer lugar ajusta el nombre de las columnas a la forma requerida
64+ df_in .rename (columns = lambda x : x .replace (" " , "_" ), inplace = True )
65+ cols = df_in .columns .tolist ()
66+
67+ # Eliminar las finas en las que no existan datos para las variables indicadas
68+ # El resto de NaN se rellenará con 0
69+ df = df_in .dropna (subset = ['GazePointIndex' , 'StrictAverageGazePointX_(ADCSmm)' , 'StrictAverageGazePointY_(ADCSmm)' ])
70+ df = df .fillna (0 )
7671
77- # # Cálculo de los cuartiles y rango IQR
78- # Q1 = df[vars].quantile(0.25)
79- # Q3 = df[vars].quantile(0.75 )
80- # IQR = Q3 - Q1
72+ # Como necesidad para operaciones posteriores, se sustituyen las ',' por '.' y se convierte a tipo numérico
73+ for var in [ 'StrictAverageGazePointX_(ADCSmm)' , 'StrictAverageGazePointY_(ADCSmm)' ]:
74+ df [ var ] = df [var ]. replace ( ',' , '.' , regex = True )
75+ df [ var ] = df [ var ]. astype ( float )
8176
82- # # Límites superior e inferior para el cálculo de los outliers
83- # k = 3
84- # l_sup = Q3 + k*IQR
85- # l_inf = Q1 - k*IQR
77+ # df = OneHotEncode(df, 'SceneName')
78+ df = OneHotEncode (df , 'GazeEventType' )
79+
80+ # Cálculo de los cuartiles y rango IQR
81+ Q1 = df [vars ].quantile (0.25 )
82+ Q3 = df [vars ].quantile (0.75 )
83+ IQR = Q3 - Q1
84+
85+ # Límites superior e inferior para el cálculo de los outliers
86+ k = 3
87+ l_sup = Q3 + k * IQR
88+ l_inf = Q1 - k * IQR
89+
90+ # Se eliminan los outliers que se encuentren por encima del límite superior o por debajo del límite inferior
91+ df = df [~ ((df < l_inf ) | (df > l_sup )).any (axis = 1 )]
92+
93+ # Escalado de las variables (estandarizado)
94+ stdscaler = stdScaler ()
95+ df [['FixationPointX_(MCSpx)' ,'FixationPointY_(MCSpx)' ]] = stdscaler .fit_transform (df [['FixationPointX_(MCSpx)' ,'FixationPointY_(MCSpx)' ]])
96+
97+ # Sólo nos interesa la escena 6
98+ df = df .loc [df ['SceneName' ]== 'escena6' ]
8699
87- # # Se eliminan los outliers que se encuentren por encima del límite superior o por debajo del límite inferior
88- # fix_X = (encoded_train.loc[(encoded_train['FixationPointX_(MCSpx)'] >= l_sup['FixationPointX_(MCSpx)']) | (encoded_train['FixationPointX_(MCSpx)'] <= l_inf['FixationPointX_(MCSpx)'])])
89- # limp_train = encoded_train[~((encoded_train < m_inf) | (encoded_train > m_sup)).any(axis=1)]
100+ # Separar X e Y, y eliminar columnas que no se necesitan
101+
102+
103+ # Compara los elementos de la lista de variables necesarias (vars) con las del archivo introducido (cols).
104+ if set (vars ).issubset (set (cols )):
105+ if len (vars ) == len (cols ):
106+ df = df_in
107+ else :
108+ message = 'Las variables del archivo de entrada no coinciden con las esperadas. Se eliminarán las no necesarias.'
109+ st .info (message )
110+ df = df_in .drop (columns = set (cols ) - set (vars ))
111+ else :
112+ st .error ("El archivo introducido no tiene todas las variables necesarias." )
113+ return False
114+ #sys.exit()
115+
116+
90117
91118
92- # stdscaler = stdScaler()
93- # df[vars] = stdscaler.fit_transform(df[vars])
94119
95- # return df
120+ return df
96121
97122
98123# Es necesario añadir esta función al cache para que no se ejecute la predicción cada vez que se actualiza la página.
0 commit comments