Przeglądaj źródła

feat:数据处理,单独拧出来一个文件吧

Roc 2 lat temu
rodzic
commit
528739389d
2 zmienionych plików z 79 dodań i 71 usunięć
  1. 1 71
      models/edb_data_calculate_cjjx.go
  2. 78 0
      models/handle_data.go

+ 1 - 71
models/edb_data_calculate_cjjx.go

@@ -7,7 +7,6 @@ import (
 	"github.com/nosixtools/solarlunar"
 	"github.com/shopspring/decimal"
 	"hongze/hongze_edb_lib/utils"
-	"math"
 	"strconv"
 	"strings"
 	"time"
@@ -255,7 +254,7 @@ func refreshAllCalculateCjjx(to orm.TxOrmer, edbInfoId, source int, fromEdbInfo
 
 	// 通过插值法补全所有数据(包含周末)
 	handleDataMap := make(map[string]float64)
-	err = handleDataByLinearRegression(dataList, handleDataMap)
+	err = HandleDataByLinearRegression(dataList, handleDataMap)
 	if err != nil {
 		return
 	}
@@ -471,72 +470,3 @@ func CjjxSub(currValue float64, pastValue []float64) (value string) {
 	valStr := decimal.NewFromFloat(val).RoundCeil(4).String()
 	return valStr
 }
-
-// handleDataByLinearRegression 插值法补充数据(线性方程式)
-func handleDataByLinearRegression(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
-		}
-
-		// 生成线性方程式
-		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).RoundCeil(4).Float64()
-				handleDataMap[tmpDataTime.Format(utils.FormatDate)] = val
-			}
-		}
-
-		startEdbInfoData = v
-	}
-
-	return
-}

+ 78 - 0
models/handle_data.go

@@ -0,0 +1,78 @@
+package models
+
+import (
+	"errors"
+	"github.com/shopspring/decimal"
+	"hongze/hongze_edb_lib/utils"
+	"math"
+	"time"
+)
+
+// HandleDataByLinearRegression 插值法补充数据(线性方程式)
+func HandleDataByLinearRegression(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
+		}
+
+		// 生成线性方程式
+		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
+			}
+		}
+
+		startEdbInfoData = v
+	}
+
+	return
+}