Переглянути джерело

Merge branch 'feature/eta2.1.2_predit_edb' into debug

xyxie 7 місяців тому
батько
коміт
e2d783e485
1 змінених файлів з 26 додано та 10 видалено
  1. 26 10
      models/predict_edb_info_rule.go

+ 26 - 10
models/predict_edb_info_rule.go

@@ -1461,15 +1461,17 @@ type AnnualValueInversionConf struct {
 }
 
 // GetChartPredictEdbInfoDataListByRuleAnnualValueInversion 根据 年度值倒推 规则获取预测数据
-// ETA预测规则:年度值倒推:设定年度值,余额=年度值-年初至今累计值(算法参考累计值),进行余额分配,均值法分配时保证每期数值相等(日度/周度:剩余期数=剩余自然日历天数/今年指标最新日期自然日历天数*今年至今指标数据期数;旬度/月度/季度/半年度:剩余期数=全年期数(36\12\4\2)-今年至今自然日历期数),同比法保证每期同比相等(同比增速=余额/同比年份相应日期的余额,预测值等于同比年份同期值*同比增速)
-// 举例:
-// 指标A 日度 最新日期 2023-05-19 年初至今累计值100
-// 设置年度值1000
-// 则余额=1000-100=900
-// 均值法分配:剩余期数=226/139*120=195.11
-// 今年之后的每一期预测值=900/195.11=4.6128
-// 同比法分配:同比增速=900/同比年份5.19的余额
-// 预测值=同比年份5-20的值*(1+同比增速)
+// 预测指标-年度值倒推
+// 1、年度值倒推,选择同比法,支持选择多个年份(当前只可选择一个年份)。选择多个年份时,计算多个年份的余额平均,和同期平均。
+// 2、年度值倒推,同比法的算法优化:旬度,月度,季度,半年度的算法,同原先算法。
+// 日度、周度值算法更新(假设指标实际值最新日期月2024/3/1):
+// 1、设定年度值
+// 2、计算余额:年度值-年初至今累计值
+// 3、年初至今累计值计算方法:用后置填充变频成连续自然日日度数据。计算1/1至指标最新日期(2024/3/3/1)的累计值。
+// 4、计算同比年份全年累计值,年初至指标最新值同期(2023/3/1)累计值,两者相减得到同比年份同期余额,再取平均值,作为最终的同期余额
+// 5、用今年余额/去年同期余额得到同比增速。
+// 6、每一期预测值,为同比年份的同期值,乘以(1+同比)。去年同期,用变频后的序列对应。
+// 7、如果选择的同比年份是多个。则计算多个年份的平均余额。今年余额/平均余额=同比增速。同比基数为多个年份的同期平均值
 func GetChartPredictEdbInfoDataListByRuleAnnualValueInversion(edbInfoId int, configValue string, dayList []time.Time, frequency string, realPredictEdbInfoData, predictEdbInfoData []*EdbInfoSearchData, existMap map[string]float64) (newPredictEdbInfoData []*EdbInfoSearchData, minValue, maxValue float64, err error) {
 	if frequency == "年度" {
 		err = errors.New("当前指标频度是年度,不允许配置年度值倒推")
@@ -1688,7 +1690,12 @@ func GetChartPredictEdbInfoDataListByRuleAnnualValueInversion(edbInfoId int, con
 			}
 			//计算每一天的年初至今累计值
 			yearVal := yearTotalMap[currentDate.Year()]
-			yearVal = yearVal + val
+			if frequency == "周度" {
+				// 每日累计值需要当前值除7
+				yearVal = yearVal + val/7
+			} else {
+				yearVal = yearVal + val
+			}
 			yearTotalMap[currentDate.Year()] = yearVal
 			dateTotalMap[currentDate] = yearVal
 			dateIndexMap[currentDate] = i
@@ -1712,12 +1719,16 @@ func GetChartPredictEdbInfoDataListByRuleAnnualValueInversion(edbInfoId int, con
 	}
 	// 当年的余额
 	currYearBalance := yearValueConfig - yearTotalMap[currDayTime.Year()]
+	//fmt.Printf("当年的余额%.4f=给定额度%.4f-当年累计值%.4f\n", currYearBalance, yearValueConfig, yearTotalMap[currDayTime.Year()])
 	// 循环统计同比年份同期余额
 	var sum, avg float64
 	for _, year := range yearList {
 		yearTotal := yearTotalMap[year]
+		//fmt.Printf("同比年份的累计值%.4f\n", yearTotal)
 		tmpDate := time.Date(year, currDayTime.Month(), currDayTime.Day(), 0, 0, 0, 0, currDayTime.Location())
+		//fmt.Printf("同比年份的同期%s\n", tmpDate)
 		dateTotal, ok := dateTotalMap[tmpDate]
+		//fmt.Printf("同比年份的同期累计值%.4f\n", dateTotal)
 		if ok {
 			sum = sum + (yearTotal - dateTotal)
 		} else {
@@ -1727,6 +1738,7 @@ func GetChartPredictEdbInfoDataListByRuleAnnualValueInversion(edbInfoId int, con
 				for tmpDateTime := indexDateMap[tmpIndex+1]; tmpDateTime.Year() == year; tmpDateTime = indexDateMap[tmpIndex+1] {
 					dateTotal, ok = dateTotalMap[tmpDateTime]
 					if ok {
+						//fmt.Printf("同比年份的同期累计值%.4f\n", dateTotal)
 						sum = sum + (yearTotal - dateTotal)
 						break
 					}
@@ -1735,9 +1747,13 @@ func GetChartPredictEdbInfoDataListByRuleAnnualValueInversion(edbInfoId int, con
 			}
 		}
 	}
+	//fmt.Printf("同比年份的余额%.4f\n", sum)
 	avg = sum / float64(len(yearList))
+	//fmt.Printf("同比年份的余额%.4f\n", avg)
 	// 同比增速=当年余额/同比年份上一期日期的余额
 	tbVal := decimal.NewFromFloat(currYearBalance).Div(decimal.NewFromFloat(avg))
+	/*tbVal11, _ := tbVal.Round(4).Float64()
+	fmt.Printf("同比增速%.4f\n", tbVal11)*/
 	//(同比增速=余额/同比年份相应日期的余额的平均值,预测值等于同比年份同期值*同比增速);
 	for k, currentDate := range dayList {
 		// 循环遍历多个同比年份