Я написал функцию для вменения пропущенных значений в Python; мой подход правильный? - PullRequest
0 голосов
/ 14 января 2020

Я пытаюсь вменить пропущенные значения временного ряда Dataframe, состоящего из 3 переменных. Количество строк представляет годы. С помощью кода я делаю следующее:

1. Проверьте одно из значений и вручную назначьте np.nan одному из значений, чтобы я мог проверить, насколько хорош вмененный результат, сравнивая его с фактическим значением. , Значение с индексом 8 и столбцом A имело исходное значение как 594.

2. Я использую iterativeImputer и обучаю его с фреймом данных (с нулевыми значениями)

3. Я использую тот же фрейм данных в качестве тестового фрейма данных переименуйте столбцы и передайте его в модель.

4. Сравнение вмененных значений и исходных значений и вычисление среднеквадратического значения.

5. Исходя из того, какой метод дает мне наименьшее среднеквадратичное значение, я выбираю этот метод для расчета отсутствующих значений.

      A       B        C
0   2256.0  732.0   2749.0
1   1435.0  510.0   1662.0
2   939.0   365.0   1347.0
3   2637.0  984.0   2677.0
4   1697.0  572.0   2482.0
5   1301.0  459.0   448.0
6   979.0   250.0   1259.0
7   776.0   224.0   1049.0
8   594.0   193.0   851.0
9   NaN     NaN     NaN
10  NaN     NaN     NaN

Это код функции:

rename_colnames= { 0:'Due_to_Alcohol', 1:'Persons_Killed_due_to_alcohol', 2:'Persons_Injured_due_to_alcohol'}

def missing_value_imputation(df,column,position, rename_colnames):
    imputer_df = df.copy()
    imputer_df[column].loc[position]= np.nan
    imp = IterativeImputer(estimator = BayesianRidge(), max_iter=10, random_state=0)
    imp.fit(imputer_df)
    X_test = imputer_df
    br_imputer = np.round(imp.transform(X_test))
    br_imputer_df = pd.DataFrame(br_imputer).rename(columns= rename_colnames)
    print('RMSE:' + str(rmse(br_imputer_df,df)))

отсутствующее_значение_импутации (df, 'A', 8, rename_alcohol_columns)

Я получаю такой результат:

RMSE:
A    32.0
B    0.0
C    0.0
dtype: float64

Является ли этот подход правильным?

...