“如何检测异常值”;在邻近的价值观中”;使用标准python处理单变量数据
我有一个简单的数据集,有两列日期/温度 我需要一些方法来查找异常值: 1.在温度栏中 2.仅将w.r.t与某些相邻值进行比较 检测异常值(仅限相邻值)的最佳方法是什么 我试着对IQR、均值/中位数偏差等进行编码,但它们删掉了更多的值。我试图一次将这些方法应用于10个值,但最终发现的异常值比我预期的还要多 最后我还需要用标准python编写代码,所以任何关于这方面的提示都会很有用 下面是我的类DataChecker中计算IQR并使用它检查异常值的函数“如何检测异常值”;在邻近的价值观中”;使用标准python处理单变量数据,python,python-3.7,outliers,Python,Python 3.7,Outliers,我有一个简单的数据集,有两列日期/温度 我需要一些方法来查找异常值: 1.在温度栏中 2.仅将w.r.t与某些相邻值进行比较 检测异常值(仅限相邻值)的最佳方法是什么 我试着对IQR、均值/中位数偏差等进行编码,但它们删掉了更多的值。我试图一次将这些方法应用于10个值,但最终发现的异常值比我预期的还要多 最后我还需要用标准python编写代码,所以任何关于这方面的提示都会很有用 下面是我的类DataChecker中计算IQR并使用它检查异常值的函数 class DataChecker:
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
类数据检查器:
类别日期温度:
定义初始(自身、输入日期、温度):
尝试:
日、月、年=输入_date.split(“/”)
自身温度日期=日期(年、月、日)
除值错误外:
#不要容忍无效日期
raise#TODO更改为自定义错误
尝试:
自身温度=浮子(温度)
除了(TypeError、ValueError):
自身温度=0
@财产
def日期(自我):
返回self.\u temperature\u date.strftime(“%d/%m/%Y”)
@财产
def温度(自身):
返回自身温度
定义初始值(自身,输入日期温度值):
自身日期温度值=[]
对于日期,输入值中的温度\u日期\u温度\u值:
尝试:
self.\u date\u temperature\u values.append(self.DateTemperature(日期,温度))
除值错误外:
通过
self.\u date\u temperature\u values.sort(key=lambda x:x.date)
self.\u异常值\u低,self.\u异常值\u高=self.\u计算\u异常值\u阈值(self.\u日期\u温度\u值)
def_是_值_异常值(自身、温度):
如果温度self.\u异常值\u高:
返回真值
返回错误
定义计算异常值阈值(自身、数据温度值):
温度值=已排序([dataTemperature.temperature用于数据温度值中的dataTemperature])
中值指数=len(温度值)//2
第一个四分位数=中值(温度值[:中值指数])
第三个四分位数=中值(温度值[中值指数+1:])
iqr=(第三个四分位数-第一个四分位数)
#尝试使用1.5、1.2、2等
低iqr=第一个四分位数-1.2*iqr
高iqr=第三个四分位数+1.2*iqr
#尝试平均/中位数偏差
#平均值=统计值。中值(温度值)
#std_dev=统计数据.pstdev(温度值)
#打印(f'{mean_value}:{std_dev}')
#低iqr=平均值-2*标准偏差
#高iqr=平均值+2*标准偏差
#打印(低iqr’:’,高iqr)
返回低iqr,高iqr
谢谢 标准偏差:标准偏差是用于量化一组数据值的变化量或离散度的度量 平均值:平均值是采样值的总和除以项目数
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
将numpy导入为np
def removeOutlier(数据):
data=np.array(数据)
平均值=np.平均值(数据,轴=0)
标准=np.std(数据,轴=0)
最终列表=[x代表数据中的x,如果(x>平均值-2*std)]
最终清单=[x代表最终清单中的x,如果(x
您可以选择相邻点并将其放入列表中,然后如果您通过此函数传递它,您将得到无离群值列表。发布迄今为止实现的代码