【问题标题】:How to detect outliers "among neighbouring values" of univariate data using standard python如何使用标准python检测单变量数据的“相邻值之间”的异常值
【发布时间】:2019-05-19 06:27:06
【问题描述】:

我有一个简单的数据集,其中包含 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

谢谢!

【问题讨论】:

  • 贴出目前实现的代码

标签: python python-3.7 outliers


【解决方案1】:

标准偏差:标准偏差是用于量化一组数据值的变化或离散量的度量。

平均值:平均值是采样值的总和除以项目数。

import numpy as np

def removeOutlier(data):
  data = np.array(data)
  mean = np.mean(data, axis=0)
  std = np.std(data, axis=0)
  final_list = [x for x in data if (x > mean - 2 * std)]
  final_list = [x for x in final_list if (x < mean + 2 * std)]
  return final_list

您可以选择相邻点并将其放入列表中,然后如果您通过此函数将其传递,您将获得异常值免费列表。

【讨论】:

    猜你喜欢
    • 2012-10-30
    • 1970-01-01
    • 2019-01-20
    • 2018-03-29
    • 2021-05-25
    • 1970-01-01
    • 2022-12-25
    • 2015-07-06
    • 1970-01-01
    相关资源
    最近更新 更多