Я использую приведенный ниже код для обнаружения и распечатывания любых выбросов в наборе данных:
outliers = []
fields = ['Nums']
nums_df = dd.read_csv("data/mydata.csv", usecols=fields, dtype=float)
def detect_outliers(df):
threshold = 3
mean = np.mean(df)
std = np.std(df)
for index in df.iterrows():
z_score = (index - mean) / std
if abs(z_score) > threshold:
outliers.append(index)
return outliers
outliers = detect_outliers(nums_df)
print(outliers)
Это приводит к следующей ошибке ValueError: The truth value of a Series is ambiguous. Use a.any() or a.all().
Добавление любого () или all () в операторе if исправляет ошибку, но неудивительно, что возвращает неверный результат. Как я должен оценивать индивидуальность значения истинности каждой строки, чтобы решить, соответствует ли она порогу для выброса или нет?
РЕДАКТИРОВАТЬ: Попытка использовать iterseries()
для Серии, возвращенной iterrows()
, по-прежнему выдает ошибку: ValueError: Metadata inference failed in sub.
AssertionError(<class 'tuple'>,)
for index, series in df.iterrows():
for s_index in series.iteritems():
z_score = (s_index - mean) / std
if abs(z_score) > threshold:
outliers.append(s_index)
return outliers