Как определить выбросы в столбце данные о результатах тестов и вернуть названия стран для выбросов

#python #pandas #dataframe #outliers

#python #pandas #dataframe #выбросы

Вопрос:

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

В первой части этого задания я должен был взять данные (отсюда: [ссылка] 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")
  

Он должен напечатать «Выбросы в среднем составляют [‘China Shanghai, Китай,’, ‘Катар’, ‘Перу’]» и т.д. для каждой категории (среднее значение, математика, естественные науки, чтение).

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

Комментарии:

1. Пожалуйста, поделитесь tempDF контентом.

2. Здесь вы ничего не добавляете: outliers.append()

3. Вы перебираете строку заголовка здесь: for i in range(len(str)): . Что вы пытаетесь здесь сделать?

4. Мне нужно передать содержимое заголовка столбца string в формате tempDF (например, Average) и обработать числа в указанном столбце. Итак, там я пытаюсь пробежаться по всей длине столбца.

Ответ №1:

 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']