Заполните значения NaN в столбце в заданном диапазоне значений c - PullRequest
0 голосов
/ 28 января 2020

Я хочу сделать следующее:

Заполнить значения NaN в одном столбце, используя значения в указанном диапазоне c.

Диапазон, который я хочу использовать, является средним значений, отличных от Nan, в столбце +/- 1 одно стандартное отклонение от вычисленного среднего.

ПРИМЕЧАНИЕ Если возможно, я бы хотел использовать кратные значения стандартного отклонения просто умножив его на константу.

Я думал, что он у меня есть (см. полный код ниже), но вывод print(df['C'].describe()) показывает, что я генерирую значения, выходящие далеко за пределы желаемого диапазона. На самом деле, я генерирую числа за пределами исходного минимума и максимума столбца, что, безусловно, не то, что я хочу.

Выход print(df['C'].describe()):

Начало:

count    130.000000
mean     462.446154
std      290.760432
min        7.000000
25%      187.500000
50%      433.000000
75%      671.250000
max      992.000000
Name: C, dtype: float64 

Окончание:

count    200
mean     517
std      298
min     -187
25%      281
50%      544
75%      763
max     1218
Name: C, dtype: float64

Обратите внимание на мин и макс. Все мои значения заполнения (в данном случае) должны были быть 462 +/- 290.

1 Ответ

1 голос
/ 28 января 2020

Ну, это не так, как работает статистика. Нормальное распределение Гаусса имеет среднее значение и стандартное значение, но значения можно извлечь далеко от среднего значения + - стандартное, они просто менее вероятны. Согласно определению нормального распределения, 68% всех значений находятся в пределах + - 1 * std, 95% находятся в пределах + -2 * std и так далее. Вопрос в том, что вы хотите сделать с выбросами? Установите для них значение + - std или снова рисуйте?

Случай 1: Установите выбросы на минимум / максимум

Это обычно нежелательно, так как это меняет ваше распределение и увеличивает вес на нижнем и нижнем уровнях. верхняя граница.

from matplotlib import pyplot as plt

mu = 100
sigma = 7
a = np.random.normal(mu, sigma, size=2000) # I used a size of 2000 as an example
a[a<(mu-sigma)] = mu-sigma
a[a>(mu+sigma)] = mu+sigma
plt.hist(a, bins=12, edgecolor='black')
plt.show()

Outliers set to min/max of the wanted range

Случай 2: усеченное нормальное распределение

Обычно вам требуется усеченное нормальное Распределение . Это создает распределение с верхней и нижней границей. Вы найдете эту функцию в модуле scipy.stats. Это работает немного по-другому: сначала вы создаете распределение путем нормализации нижнего и верхнего клипа, а затем создаете из него ряд случайных величин rvs следующим образом:

from matplotlib import pyplot as plt
import scipy.stats as stats

mu = 100
sigma = 7
lower_clip = mu-sigma
upper_clip = mu+sigma
a = stats.truncnorm((lower_clip - mu) / sigma, (upper_clip - mu) / sigma, loc=mu, scale=sigma)
plt.hist(a.rvs(2000), bins=12, edgecolor='black')
plt.show()

Truncated Normal Distribution

Константа кратных сигма легко реализуется. Вы можете просто изменить нижний и верхний клип, например,

lower_clip = mu-x*sigma

, где x - это ваша постоянная.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...