gmy il y a 3 mois
Parent
commit
9349dd270a

+ 64 - 20
services/residual_analysis_service/residual_analysis_service.go

@@ -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

+ 7 - 0
utils/date_util.go

@@ -120,3 +120,10 @@ func TimeToString(t time.Time, format string) string {
 	formattedTime := t.Format(format)
 	return formattedTime
 }
+
+// CompareDate 判断传入的两个字符串时间的前后顺序
+func CompareDate(data1, data2 string) bool {
+	t1, _ := time.Parse("2006-01-02", data1)
+	t2, _ := time.Parse("2006-01-02", data2)
+	return !t1.After(t2)
+}