|
@@ -638,3 +638,69 @@ func GetChartPredictEdbInfoDataListByRuleTrendsHC(edbInfoId, configId int, start
|
|
|
}
|
|
|
return
|
|
|
}
|
|
|
+
|
|
|
+// GetChartPredictEdbInfoDataListByRuleFinalValueHc 根据 给定终值后插值 规则获取预测数据
|
|
|
+// 项目背景:
|
|
|
+//假设螺纹产量在2023年1月1号的预测值是255万吨,从当下到2023年1月1号,螺纹产量将会线性变化,那么每一期的螺纹产量是多少?
|
|
|
+//算法:从当下(2022/10/28)到2023/1/1号,一共65天,从当前值(305.02)到255,差值-50.02,
|
|
|
+//则每日环差为-50.02/65=-0.7695。因为数据点是周度频率,每周环差为,-0.3849*7=-5.3868。
|
|
|
+//从以上计算过程可看出,“给定终值后差值”的算法,是在“环差”算法的基础上,做的一个改动。即这个”环差值”=【(终值-最新值)/终值与最新值得日期差】*数据频率
|
|
|
+//需求说明:
|
|
|
+//1、增加一个预测规则,名为“给定终值后插值”,给定预测截止日期和预测终值,计算最新数据日期至预测截止日期的时间差T,计算最新数据和预测终值的数据差S,数据频率与指标频度有关,日度=1,周度=7,旬度=10,月度=30,季度=90,年度=365,环差值=S/T*频率,预测数值=前一天数值+环差值;
|
|
|
+//2、最新数据值和日期改动后,需重新计算环差值和预测数值;
|
|
|
+func GetChartPredictEdbInfoDataListByRuleFinalValueHc(edbInfoId int, finalValue float64, startDate, endDate time.Time, frequency string, realPredictEdbInfoData, predictEdbInfoData []*EdbInfoSearchData, existMap map[string]float64) (newPredictEdbInfoData []*EdbInfoSearchData, minValue, maxValue float64) {
|
|
|
+ allDataList := make([]*EdbInfoSearchData, 0)
|
|
|
+ allDataList = append(allDataList, realPredictEdbInfoData...)
|
|
|
+ allDataList = append(allDataList, predictEdbInfoData...)
|
|
|
+ newPredictEdbInfoData = predictEdbInfoData
|
|
|
+
|
|
|
+ index := len(allDataList)
|
|
|
+ //获取后面的预测日期
|
|
|
+ dayList := getPredictEdbDayList(startDate, endDate, frequency)
|
|
|
+ lenDay := len(dayList)
|
|
|
+ if lenDay <= 0 {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ var hcValue float64
|
|
|
+ lastValueDeciamal := decimal.NewFromFloat(allDataList[index-1].Value) // 实际数据的最后一个值
|
|
|
+ finalValueDeciamal := decimal.NewFromFloat(finalValue) // 给定的终止数据
|
|
|
+ dayDecimal := decimal.NewFromInt(int64(lenDay)) // 需要作为分母的期数
|
|
|
+ hcValue, _ = finalValueDeciamal.Sub(lastValueDeciamal).Div(dayDecimal).Float64() // 计算出来的环差值
|
|
|
+
|
|
|
+ //获取后面的预测数据
|
|
|
+ predictEdbInfoData = make([]*EdbInfoSearchData, 0)
|
|
|
+ lastK := lenDay - 1 // 最后的日期
|
|
|
+ for k, currentDate := range dayList {
|
|
|
+ tmpK := index + k - 1 //上1期的值
|
|
|
+
|
|
|
+ var val float64
|
|
|
+ // 环差别值计算
|
|
|
+ if k == lastK { //如果是最后一天,那么就用最终值,否则就计算
|
|
|
+ val = finalValue
|
|
|
+ } else {
|
|
|
+ val = PredictHczDiv(allDataList[tmpK].Value, hcValue)
|
|
|
+ }
|
|
|
+
|
|
|
+ currentDateStr := currentDate.Format(utils.FormatDate)
|
|
|
+ tmpData := &EdbInfoSearchData{
|
|
|
+ EdbDataId: edbInfoId + 10000000000 + index + k,
|
|
|
+ //EdbInfoId: edbInfoId,
|
|
|
+ DataTime: currentDateStr,
|
|
|
+ Value: val,
|
|
|
+ //DataTimestamp: (currentDate.UnixNano() / 1e6) + 1000, //前端需要让加1s,说是2022-09-01 00:00:00 这样的整点不合适
|
|
|
+ }
|
|
|
+ newPredictEdbInfoData = append(newPredictEdbInfoData, tmpData)
|
|
|
+ allDataList = append(allDataList, tmpData)
|
|
|
+ existMap[currentDateStr] = val
|
|
|
+
|
|
|
+ // 最大最小值
|
|
|
+ if val < minValue {
|
|
|
+ minValue = val
|
|
|
+ }
|
|
|
+ if val > maxValue {
|
|
|
+ maxValue = val
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|