|
@@ -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
|
|
|
-}
|