|
@@ -5,6 +5,7 @@ import (
|
|
|
"eta/eta_index_lib/global"
|
|
|
"eta/eta_index_lib/utils"
|
|
|
"fmt"
|
|
|
+ "github.com/shopspring/decimal"
|
|
|
"gorm.io/gorm"
|
|
|
"math"
|
|
|
"sort"
|
|
@@ -198,46 +199,55 @@ func refreshAllCalculateResidualAnalysis(edbInfoId, source, subSource, formulaIn
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
+ for _, edbList := range mappingEdbList {
|
|
|
+ if edbList.EdbInfoId == 0 {
|
|
|
+ for _, edbData := range edbList.DataList {
|
|
|
+ value, _ := strconv.ParseFloat(edbData.Value, 64)
|
|
|
+ edbDataResidualAnalysisList = append(edbDataResidualAnalysisList, edbDataResidualAnalysis{
|
|
|
+ EdbInfoId: int(mapping.EdbInfoId),
|
|
|
+ EdbCode: edbInfo.EdbCode,
|
|
|
+ DataTime: edbData.DataTime,
|
|
|
+ Value: value,
|
|
|
+ CreateTime: time.Now(),
|
|
|
+ ModifyTime: time.Now(),
|
|
|
+ DataTimeStamp: edbData.DataTimestamp,
|
|
|
+ })
|
|
|
+ }
|
|
|
|
|
|
- for _, edbData := range mappingEdbList[0].DataList {
|
|
|
- value, _ := strconv.ParseFloat(edbData.Value, 64)
|
|
|
- edbDataResidualAnalysisList = append(edbDataResidualAnalysisList, edbDataResidualAnalysis{
|
|
|
- EdbInfoId: int(mapping.EdbInfoId),
|
|
|
- EdbCode: edbInfo.EdbCode,
|
|
|
- DataTime: edbData.DataTime,
|
|
|
- Value: value,
|
|
|
- CreateTime: time.Now(),
|
|
|
- ModifyTime: time.Now(),
|
|
|
- DataTimeStamp: edbData.DataTimestamp,
|
|
|
- })
|
|
|
+ err = AddResidualAnalysisData(edbDataResidualAnalysisList)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ break
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- err = AddResidualAnalysisData(edbDataResidualAnalysisList)
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
} else if mapping.IndexType == 2 {
|
|
|
edbInfo, err := GetEdbInfoById(int(mapping.EdbInfoId))
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
+ for _, edbList := range residualEdbList {
|
|
|
+ if edbList.EdbInfoId == 0 {
|
|
|
+ for _, edbData := range edbList.DataList {
|
|
|
+ value, _ := strconv.ParseFloat(edbData.Value, 64)
|
|
|
+ edbDataResidualAnalysisList = append(edbDataResidualAnalysisList, edbDataResidualAnalysis{
|
|
|
+ EdbInfoId: int(mapping.EdbInfoId),
|
|
|
+ EdbCode: edbInfo.EdbCode,
|
|
|
+ DataTime: edbData.DataTime,
|
|
|
+ Value: value,
|
|
|
+ CreateTime: time.Now(),
|
|
|
+ ModifyTime: time.Now(),
|
|
|
+ DataTimeStamp: edbData.DataTimestamp,
|
|
|
+ })
|
|
|
+ }
|
|
|
|
|
|
- for _, edbData := range residualEdbList[0].DataList {
|
|
|
- value, _ := strconv.ParseFloat(edbData.Value, 64)
|
|
|
- edbDataResidualAnalysisList = append(edbDataResidualAnalysisList, edbDataResidualAnalysis{
|
|
|
- EdbInfoId: int(mapping.EdbInfoId),
|
|
|
- EdbCode: edbInfo.EdbCode,
|
|
|
- DataTime: edbData.DataTime,
|
|
|
- Value: value,
|
|
|
- CreateTime: time.Now(),
|
|
|
- ModifyTime: time.Now(),
|
|
|
- DataTimeStamp: edbData.DataTimestamp,
|
|
|
- })
|
|
|
- }
|
|
|
-
|
|
|
- err = AddResidualAnalysisData(edbDataResidualAnalysisList)
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
+ err = AddResidualAnalysisData(edbDataResidualAnalysisList)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ break
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -257,9 +267,10 @@ func fillResidualChartInfo(config ResidualAnalysisConfig, req *EdbInfo, edbInfoM
|
|
|
dataAList := edbInfoA.DataList
|
|
|
edbData := make([]*EdbDataList, len(dataAList))
|
|
|
for i, data := range dataAList {
|
|
|
- f, _ := strconv.ParseFloat(data.Value, 64)
|
|
|
+ //f, _ := strconv.ParseFloat(data.Value, 64)
|
|
|
+ f, _ := decimal.NewFromString(data.Value)
|
|
|
edbData[i] = &EdbDataList{
|
|
|
- Value: f,
|
|
|
+ Value: f.InexactFloat64(),
|
|
|
DataTimestamp: data.DataTimestamp,
|
|
|
DataTime: data.DataTime,
|
|
|
EdbInfoId: data.EdbInfoId,
|
|
@@ -380,7 +391,12 @@ func fillMappingChartInfo(config ResidualAnalysisConfig, req *EdbInfo, edbInfoMa
|
|
|
}
|
|
|
|
|
|
dataList := edbInfoMappingB.DataList
|
|
|
+ sort.Sort(ByDataTime(dataList))
|
|
|
+ for _, indexData := range dataList {
|
|
|
+ fmt.Printf("%s--%s\n", indexData.Value, indexData.DataTime)
|
|
|
+ }
|
|
|
|
|
|
+ fmt.Println("========================================================================================================")
|
|
|
// 指标B数据补充
|
|
|
// 新建一个切片来保存补充的数据
|
|
|
var replenishDataList []*EdbData
|
|
@@ -414,7 +430,13 @@ func fillMappingChartInfo(config ResidualAnalysisConfig, req *EdbInfo, edbInfoMa
|
|
|
|
|
|
// 排序
|
|
|
sort.Sort(ByDataTime(dataList))
|
|
|
+ // 排序
|
|
|
+ sort.Sort(ByDataTime(dataList))
|
|
|
+ for _, indexData := range dataList {
|
|
|
+ fmt.Printf("%s--%s\n", indexData.Value, indexData.DataTime)
|
|
|
+ }
|
|
|
|
|
|
+ fmt.Println("========================================================================================================")
|
|
|
// 拟合残差 计算a,b
|
|
|
var coordinateList []utils.Coordinate
|
|
|
var replenishADataList []*EdbDataList
|
|
@@ -514,7 +536,9 @@ func fillMappingChartInfo(config ResidualAnalysisConfig, req *EdbInfo, edbInfoMa
|
|
|
|
|
|
// 填充映射指标值 使得时间长度一致
|
|
|
dataList = FillDataBList(dataList, edbInfoMappingA)
|
|
|
-
|
|
|
+ for _, indexData := range dataList {
|
|
|
+ fmt.Printf("%s--%s\n", indexData.Value, indexData.DataTime)
|
|
|
+ }
|
|
|
// 根据指标A的时间key,在B的映射指标中筛选出对应的值
|
|
|
var dataBList []*EdbDataList
|
|
|
|
|
@@ -528,9 +552,10 @@ func fillMappingChartInfo(config ResidualAnalysisConfig, req *EdbInfo, edbInfoMa
|
|
|
indexDataCopy := *indexData
|
|
|
|
|
|
// 计算指标B映射值
|
|
|
- f, _ := strconv.ParseFloat(indexData.Value, 64)
|
|
|
- indexDataCopy.Value = fmt.Sprintf("%f", math.Round((a*f+b)*10000)/10000)
|
|
|
-
|
|
|
+ //f, _ := strconv.ParseFloat(indexData.Value, 64)
|
|
|
+ f, _ := decimal.NewFromString(indexData.Value)
|
|
|
+ indexDataCopy.Value = fmt.Sprintf("%f", math.Round((a*f.InexactFloat64()+b)*10000)/10000)
|
|
|
+ //fmt.Printf("%s--%s%s\n", indexData.Value, indexDataCopy.Value, indexData.DataTime)
|
|
|
// 比较最大值
|
|
|
if indexData.Value > indexMax {
|
|
|
indexMax = indexData.Value
|
|
@@ -581,6 +606,7 @@ func FillDataBList(dataList []*EdbData, edbInfoMappingA *EdbInfoList) []*EdbData
|
|
|
dataAList := edbInfoMappingA.DataList
|
|
|
|
|
|
if len(dataList) > 0 && len(dataAList) > 0 {
|
|
|
+ fmt.Println("len(dataList):", len(dataList), "len(dataAList):", len(dataAList))
|
|
|
for utils.StringToTime(dataList[len(dataList)-1].DataTime).Before(utils.StringToTime(dataAList[len(dataAList)-1].DataTime)) {
|
|
|
// 使用A的时间填充时间差
|
|
|
timeDiff := utils.GetNextDayN(dataList[len(dataList)-1].DataTime, 1)
|
|
@@ -626,7 +652,7 @@ func fillOriginalChart(config ResidualAnalysisConfig, req *EdbInfo, mappingList
|
|
|
return nil, nil, nil, fmt.Errorf("领先值不能小于0")
|
|
|
} else if config.LeadValue > 0 {
|
|
|
edbInfoMapping.EdbName = v.EdbName + "(领先" + strconv.Itoa(config.LeadValue) + config.LeadFrequency + ")"
|
|
|
- for _, indexData := range dataList {
|
|
|
+ for _, indexData := range data {
|
|
|
switch config.LeadFrequency {
|
|
|
case "天":
|
|
|
indexData.DataTime = utils.GetNextDayN(indexData.DataTime, config.LeadValue)
|