package logic import ( "eta_gn/eta_index_lib/models" "eta_gn/eta_index_lib/utils" "fmt" ) func CalculateCorrelation(leadValue int, leadUnit, frequencyA, frequencyB string, dataListA, dataListB []*models.EdbInfoSearchData) (xEdbIdValue []int, yDataList []YData, err error) { xData := make([]int, 0) yData := make([]float64, 0) if leadValue == 0 { xData = append(xData, 0) } if leadValue > 0 { leadMin := 0 - leadValue xLen := 2*leadValue + 1 for i := 0; i < xLen; i++ { n := leadMin + i xData = append(xData, n) } } baseDataList := make([]*models.EdbInfoSearchData, 0) baseDataMap := make(map[string]float64) changeDataList := make([]*models.EdbInfoSearchData, 0) changeDataMap := make(map[string]float64) { frequencyIntMap := map[string]int{ "日度": 1, "周度": 2, "旬度": 3, "月度": 4, "季度": 5, "年度": 6, } if frequencyIntMap[frequencyA] < frequencyIntMap[frequencyB] { tmpNewChangeDataList, e := models.HandleDataByLinearRegression(dataListB, changeDataMap) if e != nil { err = fmt.Errorf("获取变频指标插值法Map失败, Err: %s", e.Error()) return } changeDataList = tmpNewChangeDataList baseDataList = dataListA for _, v := range baseDataList { baseDataMap[v.DataTime] = v.Value } } else if frequencyIntMap[frequencyA] > frequencyIntMap[frequencyB] { tmpNewChangeDataList, e := models.HandleDataByLinearRegression(dataListA, baseDataMap) if e != nil { err = fmt.Errorf("获取变频指标插值法Map失败, Err: %s", e.Error()) return } baseDataList = tmpNewChangeDataList changeDataList = dataListB for _, v := range changeDataList { changeDataMap[v.DataTime] = v.Value } } else { baseDataList = dataListA for _, v := range baseDataList { baseDataMap[v.DataTime] = v.Value } changeDataList = dataListB for _, v := range changeDataList { changeDataMap[v.DataTime] = v.Value } } } baseCalculateData := make([]float64, 0) baseDataTimeArr := make([]string, 0) for i := range baseDataList { baseDataTimeArr = append(baseDataTimeArr, baseDataList[i].DataTime) baseCalculateData = append(baseCalculateData, baseDataList[i].Value) } if leadValue > 0 { moveUnitDays := utils.FrequencyDaysMap[leadUnit] for i := range xData { xCalculateData := make([]float64, 0) yCalculateData := make([]float64, 0) mDays := int(moveUnitDays) * xData[i] _, dMap := models.MoveDataDaysToNewDataList(changeDataList, mDays) for i2 := range baseDataTimeArr { tmpDate := baseDataTimeArr[i2] if yVal, ok := dMap[tmpDate]; ok { xCalculateData = append(xCalculateData, baseCalculateData[i2]) yCalculateData = append(yCalculateData, yVal) } } if len(yCalculateData) <= 0 { continue } ratio := utils.CalculateCorrelationByIntArr(xCalculateData, yCalculateData) yData = append(yData, ratio) } } xEdbIdValue = xData yDataList = make([]YData, 0) yDate := "0000-00-00" yDataList = append(yDataList, YData{ Date: yDate, Value: yData, }) return }