package models import ( "errors" "eta_gn/eta_index_lib/utils" "github.com/shopspring/decimal" "math" "time" ) func HandleDataByLinearRegression(edbInfoDataList []*EdbInfoSearchData, handleDataMap map[string]float64) (newList []*EdbInfoSearchData, err error) { if len(edbInfoDataList) < 2 { return } var startEdbInfoData *EdbInfoSearchData for _, v := range edbInfoDataList { handleDataMap[v.DataTime] = v.Value if startEdbInfoData == nil { startEdbInfoData = v newList = append(newList, &EdbInfoSearchData{ EdbDataId: v.EdbDataId, DataTime: v.DataTime, Value: v.Value, }) continue } startDataTime, _ := time.ParseInLocation(utils.FormatDate, startEdbInfoData.DataTime, time.Local) currDataTime, _ := time.ParseInLocation(utils.FormatDate, v.DataTime, time.Local) betweenHour := int(currDataTime.Sub(startDataTime).Hours()) betweenDay := betweenHour / 24 if betweenDay <= 1 { startEdbInfoData = v newList = append(newList, &EdbInfoSearchData{ EdbDataId: v.EdbDataId, DataTime: v.DataTime, Value: v.Value, }) continue } var a, b float64 { coordinateData := make([]utils.Coordinate, 0) tmpCoordinate1 := utils.Coordinate{ X: 1, Y: startEdbInfoData.Value, } coordinateData = append(coordinateData, tmpCoordinate1) tmpCoordinate2 := utils.Coordinate{ X: float64(betweenDay) + 1, Y: v.Value, } coordinateData = append(coordinateData, tmpCoordinate2) a, b = utils.GetLinearResult(coordinateData) if math.IsNaN(a) || math.IsNaN(b) { err = errors.New("线性方程公式生成失败") return } } { for i := 1; i < betweenDay; i++ { tmpDataTime := startDataTime.AddDate(0, 0, i) aDecimal := decimal.NewFromFloat(a) xDecimal := decimal.NewFromInt(int64(i) + 1) bDecimal := decimal.NewFromFloat(b) val, _ := aDecimal.Mul(xDecimal).Add(bDecimal).Round(4).Float64() handleDataMap[tmpDataTime.Format(utils.FormatDate)] = val newList = append(newList, &EdbInfoSearchData{ DataTime: tmpDataTime.Format(utils.FormatDate), Value: val, }) } } newList = append(newList, &EdbInfoSearchData{ EdbDataId: v.EdbDataId, DataTime: v.DataTime, Value: v.Value, }) startEdbInfoData = v } return } func HandleDataByPreviousData(edbInfoDataList []*EdbInfoSearchData, handleDataMap map[string]float64) (err error) { if len(edbInfoDataList) < 2 { return } var startEdbInfoData *EdbInfoSearchData for _, v := range edbInfoDataList { handleDataMap[v.DataTime] = v.Value if startEdbInfoData == nil { startEdbInfoData = v continue } startDataTime, _ := time.ParseInLocation(utils.FormatDate, startEdbInfoData.DataTime, time.Local) currDataTime, _ := time.ParseInLocation(utils.FormatDate, v.DataTime, time.Local) betweenHour := int(currDataTime.Sub(startDataTime).Hours()) betweenDay := betweenHour / 24 if betweenDay <= 1 { startEdbInfoData = v continue } { for i := 1; i < betweenDay; i++ { tmpDataTime := startDataTime.AddDate(0, 0, i) handleDataMap[tmpDataTime.Format(utils.FormatDate)] = startEdbInfoData.Value } } startEdbInfoData = v } return } func HandleDataByLinearRegressionByTime(edbInfoDataList []*EdbInfoData, handleDataMap map[time.Time]float64) (newList []*EdbInfoData, err error) { if len(edbInfoDataList) < 2 { return } var startEdbInfoData *EdbInfoData for _, v := range edbInfoDataList { handleDataMap[v.DataTime] = v.Value if startEdbInfoData == nil { startEdbInfoData = v newList = append(newList, &EdbInfoData{ EdbDataId: v.EdbDataId, DataTime: v.DataTime, Value: v.Value, }) continue } startDataTime := startEdbInfoData.DataTime currDataTime := v.DataTime betweenHour := int(currDataTime.Sub(startDataTime).Hours()) betweenDay := betweenHour / 24 if betweenDay <= 1 { startEdbInfoData = v newList = append(newList, &EdbInfoData{ EdbDataId: v.EdbDataId, DataTime: v.DataTime, Value: v.Value, }) continue } var a, b float64 { coordinateData := make([]utils.Coordinate, 0) tmpCoordinate1 := utils.Coordinate{ X: 1, Y: startEdbInfoData.Value, } coordinateData = append(coordinateData, tmpCoordinate1) tmpCoordinate2 := utils.Coordinate{ X: float64(betweenDay) + 1, Y: v.Value, } coordinateData = append(coordinateData, tmpCoordinate2) a, b = utils.GetLinearResult(coordinateData) if math.IsNaN(a) || math.IsNaN(b) { err = errors.New("线性方程公式生成失败") return } } { for i := 1; i < betweenDay; i++ { tmpDataTime := startDataTime.AddDate(0, 0, i) aDecimal := decimal.NewFromFloat(a) xDecimal := decimal.NewFromInt(int64(i) + 1) bDecimal := decimal.NewFromFloat(b) val, _ := aDecimal.Mul(xDecimal).Add(bDecimal).Round(4).Float64() handleDataMap[tmpDataTime] = val newList = append(newList, &EdbInfoData{ DataTime: tmpDataTime, Value: val, }) } } newList = append(newList, &EdbInfoData{ EdbDataId: v.EdbDataId, DataTime: v.DataTime, Value: v.Value, }) startEdbInfoData = v } return }