|
@@ -156,6 +156,10 @@ func fillResidualChartInfo(edbInfoMappingA *data_manage.ChartEdbInfoMapping, edb
|
|
|
if !ok {
|
|
|
return nil, 0, fmt.Errorf("数据类型转换失败")
|
|
|
}
|
|
|
+
|
|
|
+ // 映射指标开始时间
|
|
|
+ startTime := dataBList[0].DataTime
|
|
|
+
|
|
|
var indexDataBMap = make(map[string]*data_manage.EdbDataList)
|
|
|
for _, data := range dataBList {
|
|
|
indexDataBMap[data.DataTime] = data
|
|
@@ -170,22 +174,42 @@ func fillResidualChartInfo(edbInfoMappingA *data_manage.ChartEdbInfoMapping, edb
|
|
|
// 因变量平均值
|
|
|
averageValueA = sumValueA / float64(len(edbData))
|
|
|
|
|
|
- for _, indexData := range edbData {
|
|
|
- if dataB, ok := indexDataBMap[indexData.DataTime]; ok {
|
|
|
- valueB = dataB.Value
|
|
|
- } else {
|
|
|
- valueB = 0
|
|
|
- }
|
|
|
+ var indexMax, indexMin float64
|
|
|
+
|
|
|
+ var edbDataResp []*data_manage.EdbDataList
|
|
|
+ if len(edbData) > 0 {
|
|
|
+ indexMax = edbData[0].Value
|
|
|
+ indexMin = edbData[0].Value
|
|
|
+ for _, indexData := range edbData {
|
|
|
+ if dataB, ok := indexDataBMap[indexData.DataTime]; ok {
|
|
|
+ valueB = dataB.Value
|
|
|
+ } else {
|
|
|
+ valueB = 0
|
|
|
+ }
|
|
|
|
|
|
- // 总因变量平方和
|
|
|
- totalQuadraticSum += math.Pow(indexData.Value-averageValueA, 2)
|
|
|
+ // 总因变量平方和
|
|
|
+ totalQuadraticSum += math.Pow(indexData.Value-averageValueA, 2)
|
|
|
|
|
|
- // 补全残差值
|
|
|
- indexData.Value = indexData.Value - valueB
|
|
|
+ // 补全残差值
|
|
|
+ indexData.Value = indexData.Value - valueB
|
|
|
|
|
|
- // 残差平方和
|
|
|
- residualQuadraticSum += math.Pow(indexData.Value, 2)
|
|
|
+ // 残差平方和
|
|
|
+ residualQuadraticSum += math.Pow(indexData.Value, 2)
|
|
|
+
|
|
|
+ if indexData.Value > indexMax {
|
|
|
+ indexMax = indexData.Value
|
|
|
+ }
|
|
|
+ if indexData.Value < indexMin {
|
|
|
+ indexMin = indexData.Value
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取映射指标之后的数据
|
|
|
+ if utils.CompareDate(startTime, indexData.DataTime) {
|
|
|
+ edbDataResp = append(edbDataResp, indexData)
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
// 计算R2 公式:R2=1-SSE/SST R2越大,越符合线性 R2 = 1 - 残差平方和/总平方和
|
|
|
R2 = 1 - residualQuadraticSum/totalQuadraticSum
|
|
|
|
|
@@ -194,11 +218,13 @@ func fillResidualChartInfo(edbInfoMappingA *data_manage.ChartEdbInfoMapping, edb
|
|
|
|
|
|
for i, mapping := range mappingEdb {
|
|
|
if mapping.EdbInfoId != edbInfoMappingA.EdbInfoId {
|
|
|
- mappingEdb[i].DataList = edbData
|
|
|
+ mappingEdb[i].DataList = edbDataResp
|
|
|
mappingEdb[i].EdbName = edbInfoMappingA.EdbName + "映射残差/" + edbInfoMappingB.EdbName
|
|
|
mappingEdb[i].IsAxis = 1
|
|
|
mappingEdb[i].ChartColor = `#00F`
|
|
|
mappingEdb[i].IsOrder = false
|
|
|
+ mappingEdb[i].MinValue = indexMin
|
|
|
+ mappingEdb[i].MaxValue = indexMax
|
|
|
} else {
|
|
|
mappingEdb[i].IsAxis = 0
|
|
|
mappingEdb[i].ChartColor = `#F00`
|
|
@@ -293,15 +319,31 @@ func fillMappingChartInfo(req residual_analysis_model.ResidualAnalysisReq, edbIn
|
|
|
// 根据指标A的时间key,在B的映射指标中筛选出对应的值
|
|
|
var dataBList []*data_manage.EdbDataList
|
|
|
|
|
|
- for _, indexData := range dataList {
|
|
|
- if _, ok := indexADataMap[indexData.DataTime]; ok {
|
|
|
- indexDataCopy := *indexData
|
|
|
+ var indexMax, indexMin float64
|
|
|
+
|
|
|
+ if len(dataList) > 0 {
|
|
|
+ indexMax = dataList[0].Value
|
|
|
+ indexMin = dataList[0].Value
|
|
|
+ for _, indexData := range dataList {
|
|
|
+ if _, ok := indexADataMap[indexData.DataTime]; ok {
|
|
|
+ indexDataCopy := *indexData
|
|
|
+
|
|
|
+ // 计算指标B映射值
|
|
|
+ indexDataCopy.Value = math.Round((a*indexData.Value+b)*10000) / 10000
|
|
|
|
|
|
- // 计算指标B映射值
|
|
|
- indexDataCopy.Value = math.Round((a*indexData.Value+b)*10000) / 10000
|
|
|
+ // 比较最大值
|
|
|
+ if indexData.Value > indexMax {
|
|
|
+ indexMax = indexData.Value
|
|
|
+ }
|
|
|
|
|
|
- // 将副本添加到 dataBList
|
|
|
- dataBList = append(dataBList, &indexDataCopy)
|
|
|
+ // 比较最小值
|
|
|
+ if indexData.Value < indexMin {
|
|
|
+ indexMin = indexData.Value
|
|
|
+ }
|
|
|
+
|
|
|
+ // 将副本添加到 dataBList
|
|
|
+ dataBList = append(dataBList, &indexDataCopy)
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -315,6 +357,8 @@ func fillMappingChartInfo(req residual_analysis_model.ResidualAnalysisReq, edbIn
|
|
|
mappingEdbList[i].IsAxis = 1
|
|
|
mappingEdbList[i].EdbName = edbInfoMappingB.EdbName + "映射" + edbInfoMappingA.EdbName
|
|
|
mappingEdbList[i].DataList = dataBList
|
|
|
+ mappingEdbList[i].MinValue = indexMin
|
|
|
+ mappingEdbList[i].MaxValue = indexMax
|
|
|
}
|
|
|
}
|
|
|
return mappingEdbList, a, b, r, nil
|