|
@@ -11,7 +11,7 @@ import (
|
|
|
)
|
|
|
|
|
|
// GetStandardDeviationData 获取标准差图表的指标数据
|
|
|
-func GetStandardDeviationData(chartInfoId int, mappingInfo *models.ChartEdbInfoMapping, calculateValue int) (edbList []*models.ChartEdbInfoMapping, err error, errMsg string) {
|
|
|
+func GetStandardDeviationData(chartInfoId int, mappingInfo *models.ChartEdbInfoMapping, calculateValue int) (edbList []*models.ChartEdbInfoMapping, dataResp response.LineFeatureDataResp, err error, errMsg string) {
|
|
|
edbList = make([]*models.ChartEdbInfoMapping, 0)
|
|
|
|
|
|
// 指标对应的所有数据
|
|
@@ -20,37 +20,65 @@ func GetStandardDeviationData(chartInfoId int, mappingInfo *models.ChartEdbInfoM
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- for k, edb := range edbList {
|
|
|
- dataList := edb.DataList.([]*models.EdbDataList)
|
|
|
- newDataList := make([]models.EdbDataList, 0)
|
|
|
- lenData := len(dataList)
|
|
|
- if lenData >= calculateValue {
|
|
|
- tmpDataList := make([]float64, 0)
|
|
|
- for _, tmpData := range dataList {
|
|
|
- tmpDataList = append(tmpDataList, tmpData.Value)
|
|
|
+ if len(edbList) != 1 {
|
|
|
+ errMsg = `指标异常`
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ edb := edbList[0]
|
|
|
+ dataList := edb.DataList.([]*models.EdbDataList)
|
|
|
+ newDataList := make([]models.EdbDataList, 0)
|
|
|
+ lenData := len(dataList)
|
|
|
+
|
|
|
+ var minVal, maxVal float64
|
|
|
+ if lenData >= calculateValue {
|
|
|
+ tmpDataList := make([]float64, 0)
|
|
|
+ for _, tmpData := range dataList {
|
|
|
+ tmpDataList = append(tmpDataList, tmpData.Value)
|
|
|
+ }
|
|
|
+ for i := calculateValue; i <= lenData; i++ {
|
|
|
+ tmpV := utils.CalculateStandardDeviation(tmpDataList[i-calculateValue : i])
|
|
|
+ tmpV, _ = decimal.NewFromFloat(tmpV).Round(4).Float64()
|
|
|
+ newDataList = append(newDataList, models.EdbDataList{
|
|
|
+ EdbDataId: i,
|
|
|
+ EdbInfoId: edb.EdbInfoId,
|
|
|
+ DataTime: dataList[i-1].DataTime,
|
|
|
+ DataTimestamp: dataList[i-1].DataTimestamp,
|
|
|
+ Value: tmpV,
|
|
|
+ })
|
|
|
+ if tmpV > maxVal {
|
|
|
+ maxVal = tmpV
|
|
|
}
|
|
|
- for i := calculateValue; i <= lenData; i++ {
|
|
|
- tmpV := utils.CalculateStandardDeviation(tmpDataList[i-calculateValue : i])
|
|
|
- tmpV, _ = decimal.NewFromFloat(tmpV).Round(4).Float64()
|
|
|
- newDataList = append(newDataList, models.EdbDataList{
|
|
|
- EdbDataId: i,
|
|
|
- EdbInfoId: edb.EdbInfoId,
|
|
|
- DataTime: dataList[i-1].DataTime,
|
|
|
- DataTimestamp: dataList[i-1].DataTimestamp,
|
|
|
- Value: tmpV,
|
|
|
- })
|
|
|
+ if tmpV < minVal {
|
|
|
+ minVal = tmpV
|
|
|
}
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- edb.DataList = newDataList
|
|
|
- edbList[k] = edb
|
|
|
+ dataResp = response.LineFeatureDataResp{
|
|
|
+ MaxData: maxVal,
|
|
|
+ MinData: minVal,
|
|
|
+ LatestDate: edb.LatestDate,
|
|
|
+ EdbInfoCategoryType: edb.EdbInfoCategoryType,
|
|
|
+ ChartColor: `#00F`,
|
|
|
+ ChartStyle: `spline`,
|
|
|
+ PredictChartColor: `#00F`,
|
|
|
+ ChartType: 0,
|
|
|
+ ChartWidth: 3,
|
|
|
+ EdbName: "标准差",
|
|
|
+ EdbNameEn: "standard deviation",
|
|
|
+ Unit: edb.Unit,
|
|
|
+ UnitEn: edb.UnitEn,
|
|
|
+ IsAxis: 1,
|
|
|
+ DataList: newDataList,
|
|
|
}
|
|
|
|
|
|
return
|
|
|
}
|
|
|
|
|
|
// GetPercentileData 获取百分位图表的指标数据
|
|
|
-func GetPercentileData(chartInfoId int, mappingInfo *models.ChartEdbInfoMapping, calculateValue int, calculateUnit string) (edbList []*models.ChartEdbInfoMapping, err error, errMsg string) {
|
|
|
+func GetPercentileData(chartInfoId int, mappingInfo *models.ChartEdbInfoMapping, calculateValue int, calculateUnit string) (edbList []*models.ChartEdbInfoMapping, dataResp response.LineFeatureDataResp, err error, errMsg string) {
|
|
|
edbList = make([]*models.ChartEdbInfoMapping, 0)
|
|
|
moveUnitDays, ok := utils.FrequencyDaysMap[calculateUnit]
|
|
|
if !ok {
|
|
@@ -64,51 +92,79 @@ func GetPercentileData(chartInfoId int, mappingInfo *models.ChartEdbInfoMapping,
|
|
|
if err != nil {
|
|
|
return
|
|
|
}
|
|
|
- for k, edb := range edbList {
|
|
|
- dataList := edb.DataList.([]*models.EdbDataList)
|
|
|
- newDataList := make([]models.EdbDataList, 0)
|
|
|
|
|
|
- dataMap := make(map[time.Time]float64, 0)
|
|
|
- for _, tmpData := range dataList {
|
|
|
- currDateTime, _ := time.ParseInLocation(utils.FormatDate, tmpData.DataTime, time.Local)
|
|
|
- dataMap[currDateTime] = tmpData.Value
|
|
|
- }
|
|
|
+ if len(edbList) != 1 {
|
|
|
+ errMsg = `指标异常`
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ return
|
|
|
+ }
|
|
|
|
|
|
- //百分位:对所选指标滚动地取对应时间长度的数据值,取最大值Max,最小值Min,计算Max-Min,百分位=(现值-Min)/(Max-Min),Max=Min时不予计算。
|
|
|
- for i, tmpData := range dataList {
|
|
|
- currDateTime, _ := time.ParseInLocation(utils.FormatDate, tmpData.DataTime, time.Local)
|
|
|
- maxVal := tmpData.Value
|
|
|
- minVal := tmpData.Value
|
|
|
- for i := 0; i < calculateDay; i++ {
|
|
|
- preVal, ok := dataMap[currDateTime.AddDate(0, 0, -i)]
|
|
|
- if ok {
|
|
|
- if preVal > maxVal {
|
|
|
- maxVal = preVal
|
|
|
- }
|
|
|
- if preVal < minVal {
|
|
|
- minVal = preVal
|
|
|
- }
|
|
|
+ edb := edbList[0]
|
|
|
+ dataList := edb.DataList.([]*models.EdbDataList)
|
|
|
+ newDataList := make([]models.EdbDataList, 0)
|
|
|
+
|
|
|
+ var edbMinVal, edbMaxVal float64
|
|
|
+ dataMap := make(map[time.Time]float64, 0)
|
|
|
+ for _, tmpData := range dataList {
|
|
|
+ currDateTime, _ := time.ParseInLocation(utils.FormatDate, tmpData.DataTime, time.Local)
|
|
|
+ dataMap[currDateTime] = tmpData.Value
|
|
|
+ }
|
|
|
+
|
|
|
+ //百分位:对所选指标滚动地取对应时间长度的数据值,取最大值Max,最小值Min,计算Max-Min,百分位=(现值-Min)/(Max-Min),Max=Min时不予计算。
|
|
|
+ for i, tmpData := range dataList {
|
|
|
+ currDateTime, _ := time.ParseInLocation(utils.FormatDate, tmpData.DataTime, time.Local)
|
|
|
+ maxVal := tmpData.Value
|
|
|
+ minVal := tmpData.Value
|
|
|
+ for i := 0; i < calculateDay; i++ {
|
|
|
+ preVal, ok := dataMap[currDateTime.AddDate(0, 0, -i)]
|
|
|
+ if ok {
|
|
|
+ if preVal > maxVal {
|
|
|
+ maxVal = preVal
|
|
|
+ }
|
|
|
+ if preVal < minVal {
|
|
|
+ minVal = preVal
|
|
|
}
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- if maxVal == minVal {
|
|
|
- continue
|
|
|
- }
|
|
|
- tmpV := (tmpData.Value) / (maxVal - minVal) * 100
|
|
|
- tmpV, _ = decimal.NewFromFloat(tmpV).Round(4).Float64()
|
|
|
- //百分位=(现值-Min)/(Max-Min)
|
|
|
- newDataList = append(newDataList, models.EdbDataList{
|
|
|
- EdbDataId: i,
|
|
|
- EdbInfoId: edb.EdbInfoId,
|
|
|
- DataTime: dataList[i-1].DataTime,
|
|
|
- DataTimestamp: dataList[i-1].DataTimestamp,
|
|
|
- Value: tmpV,
|
|
|
- })
|
|
|
+ if maxVal == minVal {
|
|
|
+ continue
|
|
|
}
|
|
|
- edb.Unit = "%"
|
|
|
- edb.UnitEn = "%"
|
|
|
- edb.DataList = newDataList
|
|
|
- edbList[k] = edb
|
|
|
+ tmpV := (tmpData.Value) / (maxVal - minVal) * 100
|
|
|
+ tmpV, _ = decimal.NewFromFloat(tmpV).Round(4).Float64()
|
|
|
+ //百分位=(现值-Min)/(Max-Min)
|
|
|
+ newDataList = append(newDataList, models.EdbDataList{
|
|
|
+ EdbDataId: i,
|
|
|
+ EdbInfoId: edb.EdbInfoId,
|
|
|
+ DataTime: dataList[i-1].DataTime,
|
|
|
+ DataTimestamp: dataList[i-1].DataTimestamp,
|
|
|
+ Value: tmpV,
|
|
|
+ })
|
|
|
+
|
|
|
+ if tmpV < edbMinVal {
|
|
|
+ edbMinVal = tmpV
|
|
|
+ }
|
|
|
+ if tmpV > edbMaxVal {
|
|
|
+ edbMaxVal = tmpV
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ dataResp = response.LineFeatureDataResp{
|
|
|
+ MaxData: edbMaxVal,
|
|
|
+ MinData: edbMinVal,
|
|
|
+ LatestDate: edb.LatestDate,
|
|
|
+ EdbInfoCategoryType: edb.EdbInfoCategoryType,
|
|
|
+ ChartColor: `#00F`,
|
|
|
+ ChartStyle: `spline`,
|
|
|
+ PredictChartColor: `#00F`,
|
|
|
+ ChartType: 0,
|
|
|
+ ChartWidth: 3,
|
|
|
+ EdbName: "百分位",
|
|
|
+ EdbNameEn: "percentile",
|
|
|
+ Unit: "%",
|
|
|
+ UnitEn: "%",
|
|
|
+ IsAxis: 1,
|
|
|
+ DataList: newDataList,
|
|
|
}
|
|
|
|
|
|
return
|