소스 검색

Merge branch 'chart/14.7'

Roc 1 년 전
부모
커밋
34d3e6d357
2개의 변경된 파일14개의 추가작업 그리고 10개의 파일을 삭제
  1. 9 10
      models/edb_data_calculate_correlation.go
  2. 5 0
      utils/calculate.go

+ 9 - 10
models/edb_data_calculate_correlation.go

@@ -291,21 +291,20 @@ func refreshAllCalculateCorrelation(to orm.TxOrmer, edbInfoId, source int, edbIn
 		removeDateMap[v.DataTime] = ``
 	}
 	var correlationConf EdbCalculateFormula
-	fmt.Println("calculateFormula:", calculateFormula)
+	//fmt.Println("calculateFormula:", calculateFormula)
 	err = json.Unmarshal([]byte(calculateFormula), &correlationConf)
 	if err != nil {
 		return
 	}
-	frequencyDaysMap := map[string]int{
-		"天": 1, "周": 7, "月": 30, "季": 90, "年": 365,
-	}
-	moveUnitDays, ok := frequencyDaysMap[correlationConf.BaseCalculateUnit]
-	if !ok {
-		errMsg = `错误的分析周期`
-		err = errors.New(errMsg)
-		return
+	aStartDate, _ := time.ParseInLocation(utils.FormatDate, edbInfoA.StartDate, time.Local)
+	bStartDate, _ := time.ParseInLocation(utils.FormatDate, edbInfoB.StartDate, time.Local)
+	var startDateTime time.Time
+	if aStartDate.Before(bStartDate) {
+		startDateTime = aStartDate
+	} else {
+		startDateTime = bStartDate
 	}
-	startDate := time.Now().AddDate(0, 0, -correlationConf.BaseCalculateValue*moveUnitDays).Format(utils.FormatDate)
+	startDate := startDateTime.Format(utils.FormatDate)
 	endDate := time.Now().Format(utils.FormatDate)
 	correlationChartDataMap, err := GetRollingCorrelationChartDataByEdbInfo(edbInfoA, edbInfoB, correlationConf.LeadValue, correlationConf.LeadUnit, correlationConf.CalculateValue, correlationConf.CalculateUnit, startDate, endDate)
 

+ 5 - 0
utils/calculate.go

@@ -88,6 +88,11 @@ func ComputeCorrelation(sList []Coordinate) (r float64) {
 		varYDeci = varYDeci.Add(diffYYbarDeci.Mul(diffYYbarDeci))
 		//varY += diffYYbar ** 2
 	}
+	//当输入的两个数组完全相同时,计算相关系数会导致除以零的操作,从而产生 NaN(Not a Number)的结果。为了避免这种情况,可以在计算相关系数之前先进行一个判断,如果两个数组的标准差为零,则相关系数应为1
+	if varXDeci.IsZero() && varYDeci.IsZero() {
+		r = 1
+		return
+	}
 	sqrtVal, _ := varXDeci.Mul(varYDeci).Round(4).Float64()
 	//fmt.Println("sqrtVal:", sqrtVal)
 	sst := math.Sqrt(sqrtVal) // 平方根