|
@@ -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 {
|
|
|
// 循环遍历多个同比年份
|