Вменять отсутствующие и выбросы в виде медианы, исключая выбросы из расчета медианы - PullRequest
0 голосов
/ 28 июня 2018

Начисляют медиану как для пропущенных, так и для экстремальных значений, исключая эти экстремумы из расчета медианы.

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

У меня есть такой фрейм данных:

df = pd.DataFrame({"AAA":[100,NaN,0.0,0.1,4.6]})

   AAA
0  100
1  NaN
2  0.0
3  0.1
4  4.6

Я хочу определить индекс наблюдения = 0 как отклонение и, следовательно, исключить его из расчета вменения и рассчитать его значение.

   AAA  impute
0  100    True
1  NaN    True
2  0.0   False
3  0.1   False
4  4.6   False

Затем я хочу вменять значения для NaN в новый столбец AAA_

.
   AAA  impute  AAA_
0  100    True   NaN
1  NaN    True   NaN
2  0.0   False   0.0
3  0.1   False   0.1
4  4.6   False   4.6

Поэтому я хочу кадр данных, подобный следующему:

   AAA  impute  AAA_
0  100    True   0.1
1  NaN    True   0.1
2  0.0   False   0.0
3  0.1   False   0.1
4  4.6   False   4.6

1 Ответ

0 голосов
/ 28 июня 2018

1. Определите индекс наблюдения = 0 как выброс и, следовательно, исключите его.

Сначала мы вычисляем выбросы в df["AAA"] как отдельные логические массивы (той же длины, что и исходная серия).

outlier = np.where(df["AAA"] >= 100,1,0).astype(bool)
is_null = np.where(df["AAA"].isnull(),1,0).astype(bool)
impute = (outlier | is_null)

Возвращает следующий результат в виде кадра данных.

df["impute"] = impute

   AAA  impute
0  100    True
1  NaN    True
2  0.0   False
3  0.1   False
4  4.6   False

2. создать вектор объектов, используя только допустимые значения

Затем создайте новый вектор признаков для значений, которые мы будем использовать для вменения. Это подмножество AAA в зависимости от того, было ли оно помечено как выброс или отсутствует.

AAA_=np.where(~impute, x.AAA, np.nan)

df["AAA_"] = AAA_

   AAA  impute  AAA_
0  100    True   NaN
1  NaN    True   NaN
2  0.0   False   0.0
3  0.1   False   0.1
4  4.6   False   4.6

3. Вменяем значения

Затем вы можете вменять значения, используя scikit-learn's preprocessing.Imputer.

median_imputer = preprocessing.Imputer(strategy="median", axis=0)
AAA_complete = median_imputer.fit_transform(AAA_.reshape(-1, 1))

Возвращает ответ:

df["AAA"] = AAA_complete

   AAA  impute  AAA_
0  100    True   0.1
1  NaN    True   0.1
2  0.0   False   0.0
3  0.1   False   0.1
4  4.6   False   4.6

Примечание: я знаю, что медиана является устойчивой перед лицом экстремальных значений, но я хочу, чтобы эти значения также трансформировались. Это можно легко изменить на среднее значение, изменив одну строку. median_imputer = preprocessing.Imputer(strategy="median", axis=0) до mean_imputer = preprocessing.Imputer(strategy="mean", axis=0)

...