Hot Deck Imputation в Python

Я пытался найти код Python, который позволил бы мне заменить отсутствующие значения в столбце фрейма данных. Основное внимание в моем анализе уделяется биостатистике, поэтому мне неудобно заменять значения с помощью средних / медиан / режимов. Я хотел бы применить метод "Hot Deck Imputation".

Я не могу найти в сети какие-либо функции или пакеты Python, которые принимают столбец фрейма данных и заполняют отсутствующие значения методом «Hot Deck Imputation».

Однако я видел этот проект GitHub и не счел его полезным .

Ниже приведен пример некоторых моих данных (предположим, что это фреймворк pandas):

| age | sex | bmi  | anesthesia score | pain level |
|-----|-----|------|------------------|------------|
| 78  | 1   | 40.7 | 3                | 0          |
| 55  | 1   | 25.3 | 3                | 0          |
| 52  | 0   | 25.4 | 3                | 0          |
| 77  | 1   | 44.9 | 3                | 3          |
| 71  | 1   | 26.3 | 3                | 0          |
| 39  | 0   | 28.2 | 2                | 0          |
| 82  | 1   | 27   | 2                | 1          |
| 70  | 1   | 37.9 | 3                | 0          |
| 71  | 1   | NA   | 3                | 1          |
| 53  | 0   | 24.5 | 2                | NA         |
| 68  | 0   | 34.7 | 3                | 0          |
| 57  | 0   | 30.7 | 2                | 0          |
| 40  | 1   | 22.4 | 2                | 0          |
| 73  | 1   | 34.2 | 2                | 0          |
| 66  | 1   | NA   | 3                | 1          |
| 55  | 1   | 42.6 | NA               | NA         |
| 53  | 0   | 37.5 | 3                | 3          |
| 65  | 0   | 31.6 | 2                | 2          |
| 36  | 0   | 29.6 | 1                | 0          |
| 60  | 0   | 25.7 | 2                | NA         |
| 70  | 1   | 30   | NA               | NA         |
| 66  | 1   | 28.3 | 2                | 0          |
| 63  | 1   | 29.4 | 3                | 2          |
| 70  | 1   | 36   | 3                | 2          |

Я хотел бы применить функцию Python, которая позволила бы мне ввести столбец в качестве параметра и вернуть столбец с отсутствующими значениями, замененными вмененными значениями, используя метод «Hot Deck Imputation».

Я использую это для статистического моделирования с такими моделями, как линейная и логистическая регрессия с использованием Statsmodels.api. Я не использую это для машинного обучения.

Любая помощь приветствуется!


person Zakariah Siyaji    schedule 31.12.2019    source источник
comment
Будет ли bfill или _ 2_ делать? Какой должен быть тип имитации горячего кода (LOCF)   -  person Cyttorak    schedule 31.12.2019
comment
Чем отличаются эти два метода и как я узнаю, что они используют имитацию горячего кода?   -  person Zakariah Siyaji    schedule 31.12.2019
comment
ffill использует last observation carried forward имитацию горячего кода LOCF.   -  person Prayson W. Daniel    schedule 31.12.2019
comment
Есть ли возможно более точный способ заполнения недостающих значений, исключая средние / режимы / медианы?   -  person Zakariah Siyaji    schedule 31.12.2019


Ответы (1)


Вы можете использовать ffill, который использует last observation carried forward (LOCF) Импутация горячего кода.

#...
df.fillna(method='ffill', inplace=True)

Scikit-learn impute предлагает KNN, Mean, Max и другие методы вменения. (https://scikit-learn.org/stable/modules/impute.html)

# sklearn '>=0.22.x'
from sklearn.impute import KNNImputer

imputer = KNNImputer(n_neighbors=2, weights="uniform")

DF['imputed_x'] = imputer.fit_transform(DF[['bmi']])

print(DF['imputed_x'])
person Prayson W. Daniel    schedule 31.12.2019
comment
Да, дай мне секунду. Я добавлю примеры - person Prayson W. Daniel; 31.12.2019
comment
Я попробовал код, которым вы поделились: impute = KNNImputer(n_neighbors=2, weights="uniform") DF['imputed_x'] = DF['bmi'].apply(lambda y: impute.fit_tranform(y),axis=0) print(DF['imputed_x']) У меня были следующие ошибки: TypeError: ‹lambda› () получил неожиданный аргумент ключевого слова 'axis' - person Zakariah Siyaji; 31.12.2019
comment
Позвольте мне проверить это. - person Prayson W. Daniel; 31.12.2019
comment
Фиксированный. Смотрите, df[['x']]. Получение DataFrame, а не серии - person Prayson W. Daniel; 31.12.2019
comment
Большое вам спасибо за помощь! Не могли бы вы объяснить, как определить лучшую ценность для n_neighbors? - person Zakariah Siyaji; 31.12.2019
comment
это зависит от ваших данных. Попробуйте также другие имитаторы, например SimpleImputer, с другими стратегиями (медиана, наиболее частая, ...), посмотрите, что вы получите - person Prayson W. Daniel; 31.12.2019