|
@@ -297,7 +297,7 @@ func SavePredictCalculateNhcc(req *EdbInfoCalculateBatchSaveReq, firstEdbInfo, s
|
|
|
err = fmt.Errorf("删除历史数据失败,Err:" + err.Error())
|
|
|
return
|
|
|
}
|
|
|
- }else{
|
|
|
+ } else {
|
|
|
return
|
|
|
}
|
|
|
}
|
|
@@ -402,7 +402,7 @@ func refreshAllPredictCalculateNhcc(to orm.TxOrmer, edbInfo, firstEdbInfo, secon
|
|
|
|
|
|
if latestDateA.Before(latestDateB) {
|
|
|
latestDateStr = latestDateA.Format(utils.FormatDate)
|
|
|
- }else{
|
|
|
+ } else {
|
|
|
latestDateStr = latestDateB.Format(utils.FormatDate)
|
|
|
}
|
|
|
|
|
@@ -417,84 +417,7 @@ func refreshAllPredictCalculateNhcc(to orm.TxOrmer, edbInfo, firstEdbInfo, secon
|
|
|
|
|
|
addDataList := make([]*EdbDataPredictCalculateNhcc, 0)
|
|
|
|
|
|
- //第一个指标
|
|
|
- aDataList := make([]EdbInfoSearchData, 0)
|
|
|
- aDataMap := make(map[string]float64)
|
|
|
- {
|
|
|
- /*var condition string
|
|
|
- var pars []interface{}
|
|
|
-
|
|
|
- condition += " AND edb_info_id=? "
|
|
|
- pars = append(pars, existItemA.FromEdbInfoId)
|
|
|
-
|
|
|
- //第一个指标的数据列表
|
|
|
- firstDataList, tmpErr := GetEdbDataListAllByTo(to, condition, pars, existItemA.FromSource, 0)
|
|
|
- if tmpErr != nil {
|
|
|
-
|
|
|
- return tmpErr
|
|
|
- }*/
|
|
|
- var firstDataList []*EdbInfoSearchData
|
|
|
- firstDataList, err = GetPredictEdbDataListAllByStartDate(firstEdbInfo, 0, "")
|
|
|
- if err != nil {
|
|
|
- return
|
|
|
- }
|
|
|
- aDataList, aDataMap = handleNhccData(firstDataList, existItemA.MoveValue)
|
|
|
- }
|
|
|
-
|
|
|
- //第二个指标
|
|
|
- bDataList := make([]EdbInfoSearchData, 0)
|
|
|
- secondDataList := make([]*EdbInfoSearchData, 0)
|
|
|
- bDataMap := make(map[string]float64)
|
|
|
- {
|
|
|
- /*condition = ``
|
|
|
- pars = make([]interface{}, 0)
|
|
|
-
|
|
|
- condition += " AND edb_info_id = ? "
|
|
|
- pars = append(pars, existItemB.FromEdbInfoId)
|
|
|
-
|
|
|
- //第二个指标的数据列表
|
|
|
- secondDataList, err = GetEdbDataListAllByTo(to, condition, pars, existItemB.FromSource, 0)
|
|
|
- if err != nil {
|
|
|
- return
|
|
|
- }*/
|
|
|
- secondDataList, err = GetPredictEdbDataListAllByStartDate(secondEdbInfo, 0, "")
|
|
|
- if err != nil {
|
|
|
- return
|
|
|
- }
|
|
|
- bDataList, bDataMap = handleNhccData(secondDataList, existItemB.MoveValue)
|
|
|
- }
|
|
|
-
|
|
|
- if len(aDataList) <= 0 {
|
|
|
- err = errors.New("指标A没有数据")
|
|
|
- return
|
|
|
- }
|
|
|
- if len(bDataList) <= 0 {
|
|
|
- err = errors.New("指标B没有数据")
|
|
|
- return
|
|
|
- }
|
|
|
- // 拟合残差计算的结束日期判断
|
|
|
- {
|
|
|
- endAData := aDataList[len(aDataList)-1]
|
|
|
- tmpEndDate, tmpErr := time.ParseInLocation(utils.FormatDate, endAData.DataTime, time.Local)
|
|
|
- if tmpErr != nil {
|
|
|
- err = tmpErr
|
|
|
- return
|
|
|
- }
|
|
|
- // 如果A指标的最新数据日期早于拟合残差的结束日期,那么就用A指标的最新数据日期
|
|
|
- if tmpEndDate.Before(nhccDate.EndDate) {
|
|
|
- nhccDate.EndDate = tmpEndDate
|
|
|
- }
|
|
|
- endBData := bDataList[len(bDataList)-1]
|
|
|
- tmpEndDate, tmpErr = time.ParseInLocation(utils.FormatDate, endBData.DataTime, time.Local)
|
|
|
- if tmpErr != nil {
|
|
|
- err = tmpErr
|
|
|
- return
|
|
|
- }
|
|
|
- // 如果B指标的最新数据日期早于拟合残差的结束日期,那么就用B指标的最新数据日期
|
|
|
- if tmpEndDate.Before(nhccDate.EndDate) {
|
|
|
- nhccDate.EndDate = tmpEndDate
|
|
|
- }
|
|
|
- }
|
|
|
+ aDataList, secondDataList, aDataMap, bDataMap, err := getPredictNhccData(firstEdbInfo, secondEdbInfo, existItemA, existItemB, nhccDate)
|
|
|
|
|
|
// 计算线性方程公式
|
|
|
var a, b float64
|
|
@@ -639,9 +562,169 @@ func refreshAllPredictCalculateNhcc(to orm.TxOrmer, edbInfo, firstEdbInfo, secon
|
|
|
err = tmpErr
|
|
|
}
|
|
|
return
|
|
|
- }else{
|
|
|
+ } else {
|
|
|
latestDateStr = finalLast.DataTime
|
|
|
latestValue = finalLast.Value
|
|
|
}
|
|
|
return
|
|
|
}
|
|
|
+
|
|
|
+// CalculatePredictComputeCorrelation 计算相关性结果
|
|
|
+func CalculatePredictComputeCorrelation(req *EdbInfoCalculateBatchSaveReq, firstEdbInfo, secondEdbInfo *EdbInfo, nhccDate NhccDate) (r float64, err error) {
|
|
|
+ var existItemA, existItemB *EdbInfoCalculateMapping
|
|
|
+ //第一个指标
|
|
|
+ {
|
|
|
+ existItemA = &EdbInfoCalculateMapping{
|
|
|
+ EdbInfoCalculateMappingId: 0,
|
|
|
+ FromEdbInfoId: firstEdbInfo.EdbInfoId,
|
|
|
+ FromEdbCode: firstEdbInfo.EdbCode,
|
|
|
+ FromEdbName: firstEdbInfo.EdbName,
|
|
|
+ FromSource: firstEdbInfo.Source,
|
|
|
+ FromSourceName: firstEdbInfo.SourceName,
|
|
|
+ FromTag: "A",
|
|
|
+ MoveValue: req.EdbInfoIdArr[0].MoveValue,
|
|
|
+ Sort: 1,
|
|
|
+ CreateTime: time.Now(),
|
|
|
+ ModifyTime: time.Now(),
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //第二个指标
|
|
|
+ {
|
|
|
+ existItemB = &EdbInfoCalculateMapping{
|
|
|
+ EdbInfoCalculateMappingId: 0,
|
|
|
+ FromEdbInfoId: secondEdbInfo.EdbInfoId,
|
|
|
+ FromEdbCode: secondEdbInfo.EdbCode,
|
|
|
+ FromEdbName: secondEdbInfo.EdbName,
|
|
|
+ FromSource: secondEdbInfo.Source,
|
|
|
+ FromSourceName: secondEdbInfo.SourceName,
|
|
|
+ FromTag: "B",
|
|
|
+ MoveValue: req.EdbInfoIdArr[1].MoveValue,
|
|
|
+ Sort: 1,
|
|
|
+ CreateTime: time.Now(),
|
|
|
+ ModifyTime: time.Now(),
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ o := orm.NewOrm()
|
|
|
+ to, err := o.Begin()
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("RefreshAllCalculateNhcc,Err:" + err.Error())
|
|
|
+ _ = to.Rollback()
|
|
|
+ } else {
|
|
|
+ _ = to.Commit()
|
|
|
+ }
|
|
|
+ }()
|
|
|
+ // 获取相关数据
|
|
|
+ _, _, aDataMap, bDataMap, err := getPredictNhccData(firstEdbInfo, secondEdbInfo, existItemA, existItemB, nhccDate)
|
|
|
+
|
|
|
+ // 计算相关性
|
|
|
+ coordinateData := make([]utils.Coordinate, 0)
|
|
|
+ for i := nhccDate.StartDate; i.Before(nhccDate.EndDate) || i.Equal(nhccDate.EndDate); i = i.AddDate(0, 0, 1) {
|
|
|
+ dateStr := i.Format(utils.FormatDate)
|
|
|
+ xValue, ok := aDataMap[dateStr]
|
|
|
+ if !ok {
|
|
|
+ err = errors.New("指标A日期:" + dateStr + "数据异常,导致计算线性方程公式失败")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ yValue, ok := bDataMap[dateStr]
|
|
|
+ if !ok {
|
|
|
+ err = errors.New("指标B日期:" + dateStr + "数据异常,导致计算线性方程公式失败")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ tmpCoordinate := utils.Coordinate{
|
|
|
+ X: xValue,
|
|
|
+ Y: yValue,
|
|
|
+ }
|
|
|
+ coordinateData = append(coordinateData, tmpCoordinate)
|
|
|
+ }
|
|
|
+ r = utils.ComputeCorrelation(coordinateData)
|
|
|
+
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// getNhccData 获取拟合残差需要的数据
|
|
|
+func getPredictNhccData(firstEdbInfo, secondEdbInfo *EdbInfo, existItemA, existItemB *EdbInfoCalculateMapping, nhccDate NhccDate) (aDataList []EdbInfoSearchData, secondDataList []*EdbInfoSearchData, aDataMap, bDataMap map[string]float64, err error) {
|
|
|
+ //第一个指标
|
|
|
+ aDataList = make([]EdbInfoSearchData, 0)
|
|
|
+ aDataMap = make(map[string]float64)
|
|
|
+ {
|
|
|
+ /*var condition string
|
|
|
+ var pars []interface{}
|
|
|
+
|
|
|
+ condition += " AND edb_info_id=? "
|
|
|
+ pars = append(pars, existItemA.FromEdbInfoId)
|
|
|
+
|
|
|
+ //第一个指标的数据列表
|
|
|
+ firstDataList, tmpErr := GetEdbDataListAllByTo(to, condition, pars, existItemA.FromSource, 0)
|
|
|
+ if tmpErr != nil {
|
|
|
+
|
|
|
+ return tmpErr
|
|
|
+ }*/
|
|
|
+ var firstDataList []*EdbInfoSearchData
|
|
|
+ firstDataList, err = GetPredictEdbDataListAllByStartDate(firstEdbInfo, 0, "")
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ aDataList, aDataMap = handleNhccData(firstDataList, existItemA.MoveValue)
|
|
|
+ }
|
|
|
+
|
|
|
+ //第二个指标
|
|
|
+ bDataList := make([]EdbInfoSearchData, 0)
|
|
|
+ secondDataList = make([]*EdbInfoSearchData, 0)
|
|
|
+ bDataMap = make(map[string]float64)
|
|
|
+ {
|
|
|
+ /*condition = ``
|
|
|
+ pars = make([]interface{}, 0)
|
|
|
+
|
|
|
+ condition += " AND edb_info_id = ? "
|
|
|
+ pars = append(pars, existItemB.FromEdbInfoId)
|
|
|
+
|
|
|
+ //第二个指标的数据列表
|
|
|
+ secondDataList, err = GetEdbDataListAllByTo(to, condition, pars, existItemB.FromSource, 0)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }*/
|
|
|
+ secondDataList, err = GetPredictEdbDataListAllByStartDate(secondEdbInfo, 0, "")
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ bDataList, bDataMap = handleNhccData(secondDataList, existItemB.MoveValue)
|
|
|
+ }
|
|
|
+
|
|
|
+ if len(aDataList) <= 0 {
|
|
|
+ err = errors.New("指标A没有数据")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if len(bDataList) <= 0 {
|
|
|
+ err = errors.New("指标B没有数据")
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 拟合残差计算的结束日期判断
|
|
|
+ {
|
|
|
+ endAData := aDataList[len(aDataList)-1]
|
|
|
+ tmpEndDate, tmpErr := time.ParseInLocation(utils.FormatDate, endAData.DataTime, time.Local)
|
|
|
+ if tmpErr != nil {
|
|
|
+ err = tmpErr
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 如果A指标的最新数据日期早于拟合残差的结束日期,那么就用A指标的最新数据日期
|
|
|
+ if tmpEndDate.Before(nhccDate.EndDate) {
|
|
|
+ nhccDate.EndDate = tmpEndDate
|
|
|
+ }
|
|
|
+ endBData := bDataList[len(bDataList)-1]
|
|
|
+ tmpEndDate, tmpErr = time.ParseInLocation(utils.FormatDate, endBData.DataTime, time.Local)
|
|
|
+ if tmpErr != nil {
|
|
|
+ err = tmpErr
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 如果B指标的最新数据日期早于拟合残差的结束日期,那么就用B指标的最新数据日期
|
|
|
+ if tmpEndDate.Before(nhccDate.EndDate) {
|
|
|
+ nhccDate.EndDate = tmpEndDate
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return
|
|
|
+}
|