У меня есть простой набор данных, который имеет 2 столбца дата / температура.
Мне нужен какой-то метод для определения выбросов: 1. В столбце температуры 2. Только по отношению к некоторым соседним значениям
Каким будет наилучший способ обнаружения выбросов только по соседним значениям?
Я пытался кодировать IQR, среднее / срединное отклонение и т. Д., Но они сокращают больше значений.Я пытался применять эти методы к 10 значениям за раз, но в итоге получалось даже больше выбросов, чем я ожидал.
Кроме того, мне нужно, наконец, закодировать его в стандартном python, так что любые намеки на это будут полезны.
Ниже приведены функции из моего класса DataChecker, которые вычисляют IQR и используют его для проверки выбросов.
class DataChecker:
class DateTemperature:
def __init__(self, input_date, temperature):
try:
day, month, year = input_date.split('/')
self._temperature_date = date(int(year), int(month), int(day))
except ValueError:
# Don't tolerate invalid date
raise #TODO change to custom error
try:
self._temperature = float(temperature)
except (TypeError, ValueError):
self._temperature = 0
@property
def date(self):
return self._temperature_date.strftime('%d/%m/%Y')
@property
def temperature(self):
return self._temperature
def __init__(self, input_date_temperature_values):
self._date_temperature_values = []
for date, temperature in input_date_temperature_values:
try:
self._date_temperature_values.append(self.DateTemperature(date, temperature))
except ValueError:
pass
self._date_temperature_values.sort(key=lambda x:x.date)
self._outlier_low, self._outlier_high = self._calculate_outlier_thresholds(self._date_temperature_values)
def _is_value_outlier(self, temperature):
if temperature < self._outlier_low or temperature > self._outlier_high:
return True
return False
def _calculate_outlier_thresholds(self, data_temperature_values):
temperature_values = sorted([dataTemperature.temperature for dataTemperature in data_temperature_values])
median_index = len(temperature_values) // 2
first_quartile = median(temperature_values[:median_index])
third_quartile = median(temperature_values[median_index+1:])
iqr = (third_quartile - first_quartile)
# Tried with 1.5, 1.2, 2 etc
low_iqr = first_quartile - 1.2*iqr
high_iqr = third_quartile + 1.2*iqr
# Trying mean/median deviation
#mean_value = statistics.median(temperature_values)
#std_dev = statistics.pstdev(temperature_values)
#print(f'{mean_value} : {std_dev}')
#low_iqr = mean_value - 2*std_dev
#high_iqr = mean_value + 2*std_dev
#print(low_iqr, ':', high_iqr)
return low_iqr, high_iqr
Спасибо!