Как определить выбросы в столбце данных о результатах тестов и вернуть названия стран для выбросов - PullRequest
0 голосов
/ 04 апреля 2019

~ Что я сделал ~

В первой части этого задания мне нужно было взять данные (отсюда: [ссылка] https://en.wikipedia.org/wiki/Programme_for_International_Student_Assessment_(2000_to_2012)) о баллах по математике, естественным наукам и чтению и поместить их в три отдельные таблицы с названием страны и оценка.

Затем мне пришлось объединить диаграммы по названию страны и найти среднее из трех баллов. Затем я должен был упорядочить их и привести в порядок по рангу.

~ Что мне нужно сделать ~

Затем мне нужно создать функцию, чтобы найти выбросы (превышающие стандартное отклонение более чем в 1,8 раза) для различных заголовков строк столбца (среднее, математическое, научное и читательское), найти выброс в этих оценках, и распечатать страну для выбросов под этим заголовком. Мне нужно пройти через строку (среднее значение, оценка по математике, оценка по науке, оценка по чтению) и получить список названий стран.

Я попытался адаптировать предыдущее назначение, в котором нам нужно было найти выбросы в одном наборе данных и ~ удалить их из данных. У этого было много математики для нахождения среднего и стандартного отклонения, поэтому я попытался упростить это здесь. В этом мне просто нужно выяснить, где происходят выбросы.

tempDF - это временный фрейм данных, созданный с использованием комбинированных диаграмм.

tempDF

   def find_outlier(str):
         outliers = []
         found = True
         while found:

             for i in range(len(str)):   

                 mean = (tempDF[str].mean())
                 std = (tempDF[str].std())
                 distance = abs((str[i]-mean)/std)

                 if distance > 1.8:             
                     outliers = outliers.append()   
                     print("The outliers in ", str, " are ", outliers)

                     found=True
                     break
                 found = False

      find_outlier("Average")
      find_outlier("Math Score")
      find_outlier("Science Score")
      find_outlier("Reading Score")

В каждой категории («Среднее значение», «Математика», «Наука», «Чтение») должно быть напечатано «Выбросы в среднем: [« Китай, Шанхай, Китай »,« Катар »,« Перу »] и т. Д.).

Теперь я получаю сообщение об ошибке «Ошибка типа: невозможно выполнить уменьшение с помощью гибкого типа». Я предполагаю, что числа в столбцах могут быть строками, а не числами.

1 Ответ

0 голосов
/ 04 апреля 2019
tempDF = pd.DataFrame({'country': ['A']*1000+['B'], 'Income' : [10]*1000+[1000]})

def find_outlier(df, col):
    return df[abs((df[col]-df[col].mean())/df[col].std())>1.8]['country'].values
    # OR
    #return df[np.abs((df[col]-np.mean(df[col]))/np.std(df[col]))>1.8]['country'].values

print ("The outliers in {0} are {1}".format("Income", find_outlier(tempDF, "Income")))

Выход:

The outliers in Income are ['B']
...