#python #pandas #dataframe #outliers
#python #pandas #dataframe #выбросы
Вопрос:
~Что я сделал ~
В первой части этого задания я должен был взять данные (отсюда: [ссылка] https://en.wikipedia.org/wiki/Programme_for_International_Student_Assessment_ (2000_to_2012)) о результатах по математике, естественным наукам и чтению и поместить их в три отдельные таблицы с названием страны и оценкой.
Затем мне пришлось объединить графики по названию страны и найти среднее значение из трех баллов. Затем я должен был ранжировать их и расположить по рангу.
~ Что мне нужно сделать ~
Затем мне нужно создать функцию для нахождения выбросов (превышающих стандартное отклонение более чем в 1,8 раза) для разных заголовков строк столбцов (среднее значение, оценка по математике, оценка по естественным наукам и оценка по чтению), найти выбросы в этих оценках и распечатать страну для выбросов под этим заголовком. Мне нужно пройти через строку (Среднее значение, оценка по математике, Оценка по естественным наукам, оценка по чтению) и получить список названий стран.
Я попытался адаптировать предыдущее задание, в котором нам нужно было найти выбросы в одном наборе данных и ~ удалить ~ их из данных. В этом было много математики для нахождения среднего и стандартного отклонения, поэтому я попытался упростить это здесь. В этом мне просто нужно выяснить, где происходят выбросы.
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']