Реализуйте класс, который заполняет недостающие значения в каждом объекте его средним значением

#python #pandas #numpy

Вопрос:

Тестовый пример показывает

 "ValueError: Length of values (4) does not match length of index (3)"
 

Когда я проверил свой код, я обнаружил, что A_transformed-это массив 1X4, который должен быть матрицей 3X3.

Когда я тестирую свой код индивидуально, все хорошо до тех пор, пока

 A_transformed = mean_imp.transform(pd.DataFrame(A))
 

Я не уверен, в чем заключается ошибка.

 from sklearn.base import TransformerMixin, BaseEstimator

class MeanImputer(BaseEstimator, TransformerMixin): 
    def fit(self, X, y=None):
        
        self.column_mean = []
        for i in range(X.shape[1]):
            if type(X) is not np.ndarray:
                X_i = X.values[:, i]
            else:
                X_i = X[:, i]
                
            # calculate mean for each column and add to the list `self.column_mean`
            # your code here
        mean =  np.nanmean(X, axis = 0)
        for x in mean:
             self.column_mean.append(x)   
            
        return self
    
    def transform(self, X):
        

        #X_transformed = []
        for i in range(len(self.column_mean)):
            if type(X) is not np.ndarray:
                X_i = X.values[:, i]
            else:
                X_i = X[:, i]
                
            # Fill missing values using mean values 
            # your code here
        
        inds = np.where(np.isnan(X))
        X[inds] = np.take(self.column_mean, inds[1]) 
        X_transformed = X

        
        X_transformed = np.column_stack(X_transformed)
        return X_transformed
 

Тестовый случай:

 A = np.array([
    [0, np.nan, 3],
    [np.nan, 6, 7],
    [np.nan, 8, np.nan],
])
mean_imp = MeanImputer()
mean_imp.fit(A)
print(mean_imp.column_mean)

assert mean_imp.column_mean == [0.0, 7.0, 5.0], "Computed mean values are incorrect."
mean_imp.fit(pd.DataFrame(A))
A_transformed = mean_imp.transform(pd.DataFrame(A))
assert ~np.isnan(A_transformed).any(), "Transformed feature matrix still contains NaNs."
assert np.allclose(A_transformed, 
                   [[0., 7., 3.],
                    [0., 6., 7.],
                    [0., 8., 5.]]), "Filled values are incorrect."
 

Только код после #comment этого-мой собственный код, остальное предоставляет система. Так что мой собственный код таков

 mean =  np.nanmean(X, axis = 0)
for x in mean:
     self.column_mean.append(x)
 
 inds = np.where(np.isnan(X))
X[inds] = np.take(self.column_mean, inds[1]) 
X_transformed = X