我有一个输入图表的数据库。出于某种原因,我的 PHP 脚本时不时会在我的数据库中插入非常大的尖峰......
正如您所看到的,图表中存在随机峰值,其中数据有时会从 300 上升到 3000,然后又直接下降到 300。
我需要的是一种整理这些表并删除比前一行和下一行大得多的数据的方法。
我做了一些谷歌研究,但什么都想不出来!
提前致谢。
我有一个输入图表的数据库。出于某种原因,我的 PHP 脚本时不时会在我的数据库中插入非常大的尖峰......
正如您所看到的,图表中存在随机峰值,其中数据有时会从 300 上升到 3000,然后又直接下降到 300。
我需要的是一种整理这些表并删除比前一行和下一行大得多的数据的方法。
我做了一些谷歌研究,但什么都想不出来!
提前致谢。
您可以采取一些措施来删除这些“异常值”数据点:
您可以删除与平均值相差超过标准偏差 N 倍的点。例如,如果数据是正态分布的,这将删除大约前 2.5%:
delete from datapoints where value > (select avg(value)+2*stddev(value)
from datapoints);
或者,您可以直接删除前 1% 的数据,留下第 99 个百分位的数据。有效地找到百分位点是一个更难的问题,但这样的事情可能会奏效:
set @rownum = 0;
@percentile = select value from (select value, @rownum:=@rownum+1 as rownum from datapoints) D
where rownum > (select 0.99*count(value) from datapoints) limit 1;
delete from datapoints where value > @percentile;
这些方法通常会删除所有异常大的数据点,而不考虑数据中的一般趋势或周期。这意味着山谷中的尖峰可能不会被发现。需要更高级的算法来处理这些情况。例如,您可以修改第一种方法以根据特定环境中的数据点删除异常值:
delete from datapoints d2 where value >
(select avg(value)+2*stddev(value)
from datapoints d1
where d1.dt between d2.dt - interval 2 hour
and d2.dt + interval 2 hour);
如果您只想删除值超过某个阈值的所有行(这里我使用了 300),那么您可以使用:
DELETE FROM table WHERE value > 300;
为了防止它们被插入,您可以在插入时测试您的值,并且只插入那些低于阈值的行。
if ($data['value'] < 300) {
// insert
}