package com.iailab.module.model.mdk.sample;
|
|
import com.iailab.module.data.api.point.DataPointApi;
|
import com.iailab.module.data.api.point.dto.ApiPointDTO;
|
import com.iailab.module.data.api.point.dto.ApiPointValueDTO;
|
import com.iailab.module.data.api.point.dto.ApiPointValueQueryDTO;
|
import com.iailab.module.model.mcs.pre.entity.MmItemOutputEntity;
|
import com.iailab.module.model.mcs.pre.service.MmItemOutputService;
|
import com.iailab.module.model.mcs.pre.service.MmItemResultService;
|
import com.iailab.module.model.mcs.pre.service.MmItemTypeService;
|
import com.iailab.module.model.mdk.common.enums.ModelParamType;
|
import com.iailab.module.model.mdk.sample.dto.ColumnItem;
|
import com.iailab.module.model.mdk.sample.dto.ColumnItemPort;
|
import com.iailab.module.model.mdk.sample.dto.SampleData;
|
import com.iailab.module.model.mdk.sample.dto.SampleInfo;
|
import com.iailab.module.model.mdk.vo.DataValueVO;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Component;
|
|
import java.math.BigDecimal;
|
import java.util.*;
|
import java.util.stream.Collectors;
|
|
/**
|
* 预测样本数据构造
|
*/
|
@Component
|
public class PredictSampleDataConstructor extends SampleDataConstructor {
|
|
private Logger logger = LoggerFactory.getLogger(getClass());
|
|
@Autowired
|
private DataPointApi dataPointApi;
|
|
@Autowired
|
private MmItemResultService mmItemResultService;
|
|
@Autowired
|
private MmItemTypeService mmItemTypeService;
|
|
@Autowired
|
private MmItemOutputService mmItemOutputService;
|
|
/**
|
* alter by zfc 2020.11.24 修改数据样本构造方案:sampleInfo中数据已按爪子进行分类,但爪内数据为无序的,
|
* 对爪内数据样本拼接:先基于modelParamOrder对项进行排序(重写comparator匿名函数),再逐项拼接
|
*
|
* @param sampleInfo
|
* @return
|
*/
|
@Override
|
public List<SampleData> prepareSampleData(SampleInfo sampleInfo) {
|
List<SampleData> sampleDataList = new ArrayList<>();
|
//对每个爪分别进行计算
|
for (ColumnItemPort entry : sampleInfo.getColumnInfo()) {
|
//先依据爪内数据项的modelParamOrder进行排序——重写comparator匿名函数
|
Collections.sort(entry.getColumnItemList(), new Comparator<ColumnItem>() {
|
@Override
|
public int compare(ColumnItem o1, ColumnItem o2) {
|
return o1.getModelParamOrder() - o2.getModelParamOrder();
|
}
|
});
|
|
//默认都是double类型的数据,且按列向量进行拼接,默认初始值为0.0
|
double[][] matrix = new double[entry.getDataLength()][entry.getColumnItemList().size()];
|
for (int i = 0; i < entry.getColumnItemList().size(); i++) {
|
for (int j = 0; j < entry.getDataLength(); j++) {
|
matrix[j][i] = -2.0;
|
}
|
}
|
|
//对每一项依次进行数据查询,然后将查询出的值赋给matrix对应的位置
|
for (int i = 0; i < entry.getColumnItemList().size(); i++) {
|
try {
|
List<DataValueVO> dataEntityList = getData(entry.getColumnItemList().get(i));
|
//补全数据
|
ColumnItem columnItem = entry.getColumnItemList().get(i);
|
dataEntityList = super.completionData(matrix.length, dataEntityList, columnItem.startTime, columnItem.endTime,
|
columnItem.paramId, columnItem.getParamType());
|
|
/** 如果数据取不满,把缺失的数据点放在后面 */
|
if (dataEntityList != null && dataEntityList.size() != 0) {
|
logger.info("设置matrix, i = " + i + ", size = " + dataEntityList.size());
|
for (int k = 0; k < dataEntityList.size(); k++) {
|
matrix[k][i] = dataEntityList.get(k).getDataValue();
|
}
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
SampleData sampleData = new SampleData();
|
sampleData.setMatrix(matrix);
|
sampleDataList.add(sampleData);
|
}
|
return sampleDataList;
|
}
|
|
/**
|
* getData
|
*
|
* @param columnItem
|
* @return
|
* @throws Exception
|
*/
|
private List<DataValueVO> getData(ColumnItem columnItem) throws Exception {
|
List<DataValueVO> dataList = new ArrayList<>();
|
String paramType = columnItem.getParamType();
|
switch (ModelParamType.getEumByCode(paramType)) {
|
case DATAPOINT:
|
ApiPointDTO point = dataPointApi.getInfoById(columnItem.getParamId());
|
ApiPointValueQueryDTO queryDto = new ApiPointValueQueryDTO();
|
queryDto.setPointNo(point.getPointNo());
|
queryDto.setStart(columnItem.getStartTime());
|
queryDto.setEnd(columnItem.getEndTime());
|
List<ApiPointValueDTO> pointValueList = dataPointApi.queryPointHistoryValue(queryDto);
|
dataList = pointValueList.stream().map(t -> {
|
DataValueVO vo = new DataValueVO();
|
vo.setDataTime(t.getT());
|
vo.setDataValue(t.getV());
|
return vo;
|
}).collect(Collectors.toList());
|
break;
|
case NORMALITEM:
|
case MERGEITEM:
|
MmItemOutputEntity outPut = mmItemOutputService.getOutPutById(columnItem.getParamId());
|
dataList = mmItemResultService.getPredictValue(outPut.getId(),
|
columnItem.getStartTime(), columnItem.getEndTime());
|
if (dataList == null) {
|
throw new Exception("没有预测值");
|
}
|
break;
|
default:
|
break;
|
}
|
return dataList;
|
}
|
}
|