|
@@ -46,7 +46,9 @@ public class ShortTermSinglePointDeviationServiceImpl extends ServiceImpl<ShortT
|
|
));
|
|
));
|
|
|
|
|
|
// 获取每一天,因为有没有数据都要展示出来
|
|
// 获取每一天,因为有没有数据都要展示出来
|
|
- List<String> dateList = DateTimeUtil.getDatesInRange(startTime, endTime);
|
|
|
|
|
|
+ List<String> dateList = getDatesInRange(startTime, endTime);
|
|
|
|
+
|
|
|
|
+ Map<String, Object> map = new HashMap<>();
|
|
|
|
|
|
List dataList = new ArrayList<>();
|
|
List dataList = new ArrayList<>();
|
|
List timeList = new ArrayList<>();
|
|
List timeList = new ArrayList<>();
|
|
@@ -58,15 +60,18 @@ public class ShortTermSinglePointDeviationServiceImpl extends ServiceImpl<ShortT
|
|
// 转换为数组
|
|
// 转换为数组
|
|
double[] array = groupedByDate.get(s).stream().mapToDouble(Double::doubleValue).toArray();
|
|
double[] array = groupedByDate.get(s).stream().mapToDouble(Double::doubleValue).toArray();
|
|
// 所需盒须值
|
|
// 所需盒须值
|
|
- double[] result = plot(array);
|
|
|
|
|
|
+ Object[] result = plot(array,s);
|
|
dataList.add(result);
|
|
dataList.add(result);
|
|
|
|
|
|
- double max = result[result.length - 1];double min = result[0];
|
|
|
|
|
|
+ double q3 = (Double) result[3];
|
|
|
|
+ double q1 = (Double)result[1];
|
|
|
|
+
|
|
// 获取异常值
|
|
// 获取异常值
|
|
- List<Double> doubleList = groupedByDate.get(s).stream().filter(f -> f < min && f > max).collect(Collectors.toList());
|
|
|
|
- List ycDataList = new ArrayList<>();
|
|
|
|
|
|
+ List<Double> doubleList = groupedByDate.get(s).stream().filter(f -> f < q1 || f > q3).collect(Collectors.toList());
|
|
|
|
+
|
|
if (doubleList.size() > 0) {
|
|
if (doubleList.size() > 0) {
|
|
for (Double v : doubleList) {
|
|
for (Double v : doubleList) {
|
|
|
|
+ List ycDataList = new ArrayList<>();
|
|
ycDataList.add(s);
|
|
ycDataList.add(s);
|
|
ycDataList.add(v);
|
|
ycDataList.add(v);
|
|
abnormalList.add(ycDataList);
|
|
abnormalList.add(ycDataList);
|
|
@@ -76,17 +81,14 @@ public class ShortTermSinglePointDeviationServiceImpl extends ServiceImpl<ShortT
|
|
dataList.add("");
|
|
dataList.add("");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
- Map<String, Object> map = new HashMap<>();
|
|
|
|
map.put("result", dataList);
|
|
map.put("result", dataList);
|
|
map.put("time", timeList);
|
|
map.put("time", timeList);
|
|
map.put("abnormal", abnormalList);
|
|
map.put("abnormal", abnormalList);
|
|
-
|
|
|
|
return map;
|
|
return map;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
- public static double[] plot(double[] data) {
|
|
|
|
|
|
+ public static Object[] plot(double[] data,String date) {
|
|
Arrays.sort(data);
|
|
Arrays.sort(data);
|
|
// 1/4
|
|
// 1/4
|
|
double q1 = calculateQuantile(data, 0.25);
|
|
double q1 = calculateQuantile(data, 0.25);
|
|
@@ -99,11 +101,11 @@ public class ShortTermSinglePointDeviationServiceImpl extends ServiceImpl<ShortT
|
|
double maxInRegion = q3 + 1.5 * iqr;
|
|
double maxInRegion = q3 + 1.5 * iqr;
|
|
//最小观测值
|
|
//最小观测值
|
|
double mixInRegion = q1 - 1.5 * iqr;
|
|
double mixInRegion = q1 - 1.5 * iqr;
|
|
- return new double[]{BigDecimal.valueOf(mixInRegion).setScale(2, RoundingMode.HALF_UP).doubleValue(),
|
|
|
|
|
|
+ return new Object[]{BigDecimal.valueOf(mixInRegion).setScale(2, RoundingMode.HALF_UP).doubleValue(),
|
|
BigDecimal.valueOf(q1).setScale(2, RoundingMode.HALF_UP).doubleValue(),
|
|
BigDecimal.valueOf(q1).setScale(2, RoundingMode.HALF_UP).doubleValue(),
|
|
BigDecimal.valueOf(q2).setScale(2, RoundingMode.HALF_UP).doubleValue(),
|
|
BigDecimal.valueOf(q2).setScale(2, RoundingMode.HALF_UP).doubleValue(),
|
|
BigDecimal.valueOf(q3).setScale(2, RoundingMode.HALF_UP).doubleValue(),
|
|
BigDecimal.valueOf(q3).setScale(2, RoundingMode.HALF_UP).doubleValue(),
|
|
- BigDecimal.valueOf(maxInRegion).setScale(2, RoundingMode.HALF_UP).doubleValue()};
|
|
|
|
|
|
+ BigDecimal.valueOf(maxInRegion).setScale(2, RoundingMode.HALF_UP).doubleValue(),date};
|
|
}
|
|
}
|
|
|
|
|
|
private static double calculateQuantile(double[] data, double percentile) {
|
|
private static double calculateQuantile(double[] data, double percentile) {
|
|
@@ -119,6 +121,31 @@ public class ShortTermSinglePointDeviationServiceImpl extends ServiceImpl<ShortT
|
|
return lowerValue + upperValue;
|
|
return lowerValue + upperValue;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ public List<String> getDatesInRange(Date startTime, Date endTime) {
|
|
|
|
+ List<String> dateList = new ArrayList<>();
|
|
|
|
+ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
|
+
|
|
|
|
+ Calendar startCalendar = Calendar.getInstance();
|
|
|
|
+ Calendar endCalendar = Calendar.getInstance();
|
|
|
|
+ startCalendar.setTime(startTime);
|
|
|
|
+ endCalendar.setTime(endTime);
|
|
|
|
+
|
|
|
|
+ // 确保endCalendar包含endTime那一天(如果endTime不是那天的23:59:59)
|
|
|
|
+ endCalendar.set(Calendar.HOUR_OF_DAY, 23);
|
|
|
|
+ endCalendar.set(Calendar.MINUTE, 59);
|
|
|
|
+ endCalendar.set(Calendar.SECOND, 59);
|
|
|
|
+ endCalendar.set(Calendar.MILLISECOND, 999);
|
|
|
|
+
|
|
|
|
+ // 如果startTime和endTime在同一天,则只添加那一天
|
|
|
|
+ if (startCalendar.getTimeInMillis() <= endCalendar.getTimeInMillis()) {
|
|
|
|
+ do {
|
|
|
|
+ dateList.add(simpleDateFormat.format(startCalendar.getTime()));
|
|
|
|
+ startCalendar.add(Calendar.DAY_OF_MONTH, 1);
|
|
|
|
+ } while (startCalendar.getTimeInMillis() < endCalendar.getTimeInMillis());
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+ // 如果startTime在endTime之后(理论上不应该发生,除非输入有误),则不添加任何日期
|
|
|
|
|
|
|
|
+ return dateList;
|
|
|
|
+ }
|
|
}
|
|
}
|