Browse Source

feat:新增统计特征图

Roc 1 năm trước cách đây
mục cha
commit
b7731e566b

+ 116 - 0
controller/chart/chart_common.go

@@ -21,6 +21,7 @@ import (
 	"hongze/hongze_yb/services/chart/correlation"
 	"hongze/hongze_yb/services/chart/correlation"
 	future_goodServ "hongze/hongze_yb/services/chart/future_good"
 	future_goodServ "hongze/hongze_yb/services/chart/future_good"
 	"hongze/hongze_yb/services/chart/line_equation"
 	"hongze/hongze_yb/services/chart/line_equation"
+	"hongze/hongze_yb/services/chart/line_feature"
 	"hongze/hongze_yb/services/user"
 	"hongze/hongze_yb/services/user"
 	"hongze/hongze_yb/utils"
 	"hongze/hongze_yb/utils"
 	"io/ioutil"
 	"io/ioutil"
@@ -78,6 +79,8 @@ func CommonChartInfoDetailFromUniqueCode(c *gin.Context) {
 		resp, isOk, msg, errMsg = getCorrelationChartInfoDetail(chartInfo, myChartClassifyId, user.GetInfoByClaims(c))
 		resp, isOk, msg, errMsg = getCorrelationChartInfoDetail(chartInfo, myChartClassifyId, user.GetInfoByClaims(c))
 	case utils.CHART_SOURCE_LINE_EQUATION:
 	case utils.CHART_SOURCE_LINE_EQUATION:
 		resp, isOk, msg, errMsg = getChartInfoDetailFromUniqueCode(chartInfo, myChartClassifyId, user.GetInfoByClaims(c))
 		resp, isOk, msg, errMsg = getChartInfoDetailFromUniqueCode(chartInfo, myChartClassifyId, user.GetInfoByClaims(c))
+	case utils.CHART_SOURCE_LINE_FEATURE_STANDARD_DEVIATION, utils.CHART_SOURCE_LINE_FEATURE_PERCENTILE, utils.CHART_SOURCE_LINE_FEATURE_FREQUENCY:
+		resp, isOk, msg, errMsg = getLineFeatureChartInfoDetailFromUniqueCode(chartInfo, myChartClassifyId, user.GetInfoByClaims(c))
 	default:
 	default:
 		msg := "错误的图表"
 		msg := "错误的图表"
 		errMsg := "错误的图表"
 		errMsg := "错误的图表"
@@ -454,6 +457,119 @@ func getChartInfoDetailFromUniqueCode(chartInfo *chartInfoModel.ChartInfoView, m
 	return
 	return
 }
 }
 
 
+// GetLineFeatureChartInfoDetailFromUniqueCode 根据编码获取统计特征图表详情
+func getLineFeatureChartInfoDetailFromUniqueCode(chartInfo *chartInfoModel.ChartInfoView, myChartClassifyId int, userInfo user.UserInfo) (resp *chart_info.ChartInfoDetailResp, isOk bool, msg, errMsg string) {
+	// 获取图表信息
+	var err error
+
+	// 获取图表关联指标
+	edbMappingList, err := chartEdbMappingModel.GetMappingListByChartInfoId(chartInfo.ChartInfoId)
+	if err != nil {
+		msg = "获取失败"
+		errMsg = "获取图表关联指标信息失败,Err:" + err.Error()
+		return
+	}
+	if len(edbMappingList) != 1 {
+		msg = "获取失败"
+		errMsg = fmt.Sprint("获取图表关联指标信息异常,数量:", len(edbMappingList))
+		return
+	}
+	edbMapping := edbMappingList[0]
+
+	var edbList []*chartEdbMappingModel.ChartEdbInfoMappingList
+	var resultResp interface{}
+	sourceArr := make([]string, 0)
+	switch chartInfo.Source {
+	case utils.CHART_SOURCE_LINE_FEATURE_STANDARD_DEVIATION:
+		calculateValue, tmpErr := strconv.Atoi(chartInfo.ExtraConfig)
+		if tmpErr != nil {
+			msg = "获取失败"
+			errMsg = "格式化配置项失败,Err:" + tmpErr.Error()
+			return
+		}
+		edbList, resultResp, sourceArr, err, msg = line_feature.GetStandardDeviationData(0, edbMapping, calculateValue)
+	case utils.CHART_SOURCE_LINE_FEATURE_PERCENTILE:
+		var percentileConfig request.Percentile
+		err = json.Unmarshal([]byte(chartInfo.ExtraConfig), &percentileConfig)
+		if err != nil {
+			msg = "获取失败"
+			errMsg = "格式化配置项失败,Err:" + err.Error()
+			return
+		}
+		edbList, resultResp, sourceArr, err, msg = line_feature.GetPercentileData(0, edbMapping, percentileConfig.CalculateValue, percentileConfig.CalculateUnit)
+	case utils.CHART_SOURCE_LINE_FEATURE_FREQUENCY:
+		var frequencyDistributionConfig request.FrequencyDistribution
+		err = json.Unmarshal([]byte(chartInfo.ExtraConfig), &frequencyDistributionConfig)
+		if err != nil {
+			msg = "获取失败"
+			errMsg = "格式化配置项失败,Err:" + err.Error()
+			return
+		}
+		// 获取图表中的指标数据
+		edbList, resultResp, sourceArr, err, errMsg = line_feature.GetFrequencyDistributionData(0, edbMapping, frequencyDistributionConfig.DateType, frequencyDistributionConfig.FrequencyValue, frequencyDistributionConfig.StartDate, frequencyDistributionConfig.EndDate)
+	default:
+		msg = `错误的图表`
+		errMsg = fmt.Sprint("错误的图表来源,source", chartInfo.Source)
+		return
+	}
+	if err != nil {
+		if msg == `` {
+			msg = "获取失败"
+		}
+		errMsg = "获取图表,指标信息失败,Err:" + err.Error()
+		return
+	}
+
+	sourceArr = append(sourceArr, "弘则研究")
+	chartInfo.ChartSource = strings.Join(sourceArr, ",")
+
+	//baseEdbInfo := edbList[0] //现货指标
+	//chartInfo.UnitEn = baseEdbInfo.UnitEn
+
+	// 访问记录-仅普通用户记录
+	ok, _, _ := user.GetAdminByUserInfo(userInfo)
+	if !ok {
+		go chart.SaveChartVisitLog(userInfo, chartInfo, myChartClassifyId)
+	}
+
+	// 用户是否有收藏该图表
+	{
+		ob := new(yb_my_chart.YbMyChart)
+		cond := `user_id = ? AND chart_info_id = ?`
+		pars := make([]interface{}, 0)
+		pars = append(pars, userInfo.UserID, chartInfo.ChartInfoId)
+		exists, e := ob.FetchByCondition(cond, pars)
+		if e != nil && e != utils.ErrNoRow {
+			msg = `操作失败`
+			errMsg = "获取用户图表失败, Err: " + e.Error()
+			return
+		}
+		myChartInfo := new(responseModel.MyChartItem)
+		if exists != nil && exists.MyChartID > 0 {
+			myChartInfo.MyChartID = exists.MyChartID
+			myChartInfo.MyChartClassifyID = exists.MyChartClassifyID
+			myChartInfo.ChartInfoID = exists.ChartInfoID
+			myChartInfo.ChartName = exists.ChartName
+			myChartInfo.UniqueCode = exists.UniqueCode
+			myChartInfo.ChartImage = exists.ChartImage
+			myChartInfo.UserID = exists.UserID
+			myChartInfo.ReportID = exists.ReportID
+			myChartInfo.ReportChapterID = exists.ReportChapterID
+			myChartInfo.CreateTime = utils.TimeTransferString(utils.FormatDateTime, exists.CreateTime)
+		}
+
+		resp.MyChartInfo = myChartInfo
+	}
+
+	resp.ChartInfo = chartInfo
+	resp.EdbInfoList = edbList
+	resp.DataResp = resultResp
+
+	isOk = true
+
+	return
+}
+
 // RefreshFutureGoodChartInfo 刷新商品价格曲线图表信息
 // RefreshFutureGoodChartInfo 刷新商品价格曲线图表信息
 // @Tags 图库模块
 // @Tags 图库模块
 // @Summary  刷新图表信息
 // @Summary  刷新图表信息

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 526
go.sum


+ 12 - 0
models/request/chart.go

@@ -162,3 +162,15 @@ type LineChartInfoReq struct {
 	YEdbInfoIdList []int  `description:"Y轴的指标id列表"`
 	YEdbInfoIdList []int  `description:"Y轴的指标id列表"`
 	Source         int    `description:"来源,5:斜率图;6:截距图;7:相关性图"`
 	Source         int    `description:"来源,5:斜率图;6:截距图;7:相关性图"`
 }
 }
+type Percentile struct {
+	CalculateValue int    `description:"时间长度期数"`
+	CalculateUnit  string `description:"时间长度频度"`
+}
+
+type FrequencyDistribution struct {
+	//最近3月 最近6月 最近1年 最近2年 最近3年 最近5年 最近10年
+	DateType       int    `description:"日期类型:1:最近3月;2:最近6月;3:最近1年;4:最近2年;5:最近3年;6:最近5年;7:最近10年,8:自定义时间"`
+	StartDate      string `description:"自定义开始日期"`
+	EndDate        string `description:"自定义结束日期"`
+	FrequencyValue int    `description:"频段数,10/20"`
+}

+ 8 - 0
models/tables/edb_data/query.go

@@ -139,6 +139,14 @@ func GetEdbDataTableName(source int) (tableName string) {
 		tableName = "edb_data_predict_calculate_ljz"
 		tableName = "edb_data_predict_calculate_ljz"
 	case utils.DATA_SOURCE_PREDICT_CALCULATE_LJZNCZJ: //预测指标 - 累计值(年初至今) -> 66
 	case utils.DATA_SOURCE_PREDICT_CALCULATE_LJZNCZJ: //预测指标 - 累计值(年初至今) -> 66
 		tableName = "edb_data_predict_calculate_ljznczj"
 		tableName = "edb_data_predict_calculate_ljznczj"
+	case utils.DATA_SOURCE_CALCULATE_STANDARD_DEVIATION: //标准差->67
+		tableName = "edb_data_calculate_standard_deviation"
+	case utils.DATA_SOURCE_CALCULATE_PERCENTILE: //百分位->68
+		tableName = "edb_data_calculate_percentile"
+	case utils.DATA_SOURCE_PREDICT_CALCULATE_STANDARD_DEVIATION: //预测标准差->69
+		tableName = "edb_data_predict_ccalculate_standard_deviation"
+	case utils.DATA_SOURCE_PREDICT_CALCULATE_PERCENTILE: //预测百分位->70
+		tableName = "edb_data_predict_ccalculate_percentile"
 	default:
 	default:
 		tableName = ""
 		tableName = ""
 	}
 	}

+ 350 - 0
services/chart/line_feature/chart_info.go

@@ -0,0 +1,350 @@
+package line_feature
+
+import (
+	"errors"
+	"github.com/shopspring/decimal"
+	chartEdbMappingModel "hongze/hongze_yb/models/tables/chart_edb_mapping"
+	edbDataModel "hongze/hongze_yb/models/tables/edb_data"
+	"hongze/hongze_yb/services/chart"
+	"hongze/hongze_yb/utils"
+	"time"
+)
+
+// LineFeatureDataResp 曲线图的一些数据返回
+type LineFeatureDataResp struct {
+	MaxData             float64
+	MinData             float64
+	LatestDate          time.Time `description:"真实数据的最后日期"`
+	EdbInfoCategoryType int
+	ChartColor          string
+	ChartStyle          string
+	PredictChartColor   string
+	ChartType           int
+	ChartWidth          float64
+	EdbName             string
+	EdbNameEn           string
+	Unit                string
+	UnitEn              string
+	IsAxis              int
+	DataList            []edbDataModel.EdbDataList
+}
+
+// FrequencyDistributionResp 频率分布图数据
+type FrequencyDistributionResp struct {
+	LeftMinValue  float64
+	LeftMaxValue  float64
+	RightMinValue float64
+	RightMaxValue float64
+	DataList      []FrequencyDistributionData
+}
+
+// FrequencyDistributionData 频率分布的值
+type FrequencyDistributionData struct {
+	Name   string      `description:"别名"`
+	NameEn string      `description:"英文别名"`
+	Unit   string      `description:"单位"`
+	UnitEn string      `description:"单位别名"`
+	Value  interface{} `description:"每个指标的值"`
+	Color  string      `description:"数据颜色"`
+	IsAxis int         `description:"1:左轴,0:右轴"`
+}
+
+// FrequencyDistributionYData 频率分布的实际数据
+type FrequencyDistributionYData struct {
+	X float64
+	Y float64
+}
+
+// GetStandardDeviationData 获取标准差图表的指标数据
+func GetStandardDeviationData(chartInfoId int, mappingInfo *chartEdbMappingModel.ChartEdbInfoMapping, calculateValue int) (edbList []*chartEdbMappingModel.ChartEdbInfoMappingList, dataResp LineFeatureDataResp, sourceArr []string, err error, errMsg string) {
+	edbList = make([]*chartEdbMappingModel.ChartEdbInfoMappingList, 0)
+
+	// 指标对应的所有数据
+	_, edbList, sourceArr, err = chart.GetEdbDataMapList(chartInfoId, 1, `公历`, ``, ``, []*chartEdbMappingModel.ChartEdbInfoMapping{mappingInfo})
+	if err != nil {
+		return
+	}
+
+	if len(edbList) != 1 {
+		errMsg = `指标异常`
+		err = errors.New(errMsg)
+		return
+	}
+
+	edb := edbList[0]
+	dataList := edb.DataList.([]*edbDataModel.EdbDataList)
+	newDataList := make([]edbDataModel.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, edbDataModel.EdbDataList{
+				EdbDataId:     i,
+				EdbInfoId:     edb.EdbInfoId,
+				DataTime:      dataList[i-1].DataTime,
+				DataTimestamp: dataList[i-1].DataTimestamp,
+				Value:         tmpV,
+			})
+			if tmpV > maxVal {
+				maxVal = tmpV
+			}
+			if tmpV < minVal {
+				minVal = tmpV
+			}
+		}
+	}
+
+	dataResp = 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 *chartEdbMappingModel.ChartEdbInfoMapping, calculateValue int, calculateUnit string) (edbList []*chartEdbMappingModel.ChartEdbInfoMappingList, dataResp LineFeatureDataResp, sourceArr []string, err error, errMsg string) {
+	edbList = make([]*chartEdbMappingModel.ChartEdbInfoMappingList, 0)
+	moveUnitDays, ok := utils.FrequencyDaysMap[calculateUnit]
+	if !ok {
+		errMsg = `错误的周期`
+		err = errors.New(errMsg)
+		return
+	}
+	calculateDay := calculateValue * moveUnitDays
+	// 指标对应的所有数据
+	_, edbList, sourceArr, err = chart.GetEdbDataMapList(chartInfoId, 1, `公历`, ``, ``, []*chartEdbMappingModel.ChartEdbInfoMapping{mappingInfo})
+	if err != nil {
+		return
+	}
+
+	if len(edbList) != 1 {
+		errMsg = `指标异常`
+		err = errors.New(errMsg)
+		return
+	}
+
+	edb := edbList[0]
+	dataList := edb.DataList.([]*edbDataModel.EdbDataList)
+	newDataList := make([]edbDataModel.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, edbDataModel.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 = 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
+}
+
+// GetFrequencyDistributionData 获取频率分布的图表数据
+func GetFrequencyDistributionData(chartInfoId int, mappingInfo *chartEdbMappingModel.ChartEdbInfoMapping, dateType, stepVal int, startDate, endDate string) (edbList []*chartEdbMappingModel.ChartEdbInfoMappingList, dataResp FrequencyDistributionResp, sourceArr []string, err error, errMsg string) {
+	//日期类型:1:最近3月;2:最近6月;3:最近1年;4:最近2年;5:最近3年;6:最近5年;7:最近10年,8:自定义时间
+	startDate, endDate = utils.GetDateByDateType2(dateType, startDate, endDate)
+	if startDate == `` {
+		errMsg = "错误的日期"
+		err = errors.New(errMsg)
+		return
+	}
+	XDataList := make([]float64, 0)
+	// 频度
+	Y1DataList := make([]FrequencyDistributionYData, 0)
+	// 累计频率
+	Y2DataList := make([]FrequencyDistributionYData, 0)
+	edbList = make([]*chartEdbMappingModel.ChartEdbInfoMappingList, 0)
+
+	// 指标对应的所有数据
+	_, edbList, sourceArr, err = chart.GetEdbDataMapList(chartInfoId, 1, `公历`, startDate, endDate, []*chartEdbMappingModel.ChartEdbInfoMapping{mappingInfo})
+	if err != nil {
+		return
+	}
+	if len(edbList) != 1 {
+		err = errors.New("指标异常")
+		return
+	}
+	startDateTime, _ := time.ParseInLocation(utils.FormatDate, startDate, time.Local)
+	var endDateTime time.Time
+	if endDate != `` {
+		endDateTime, _ = time.ParseInLocation(utils.FormatDate, endDate, time.Local)
+	}
+
+	edb := edbList[0]
+	dataList := edb.DataList.([]*edbDataModel.EdbDataList)
+
+	if len(dataList) <= 0 {
+		return
+	}
+	maxVal := dataList[0].Value
+	minVal := dataList[0].Value
+	dataValMap := make(map[float64]int)
+	total := 0 // 数据总量
+	for _, tmpData := range dataList {
+		currDateTime, _ := time.ParseInLocation(utils.FormatDate, tmpData.DataTime, time.Local)
+		if (currDateTime.Equal(startDateTime) || currDateTime.After(startDateTime)) && (endDateTime.IsZero() || currDateTime.Before(endDateTime)) {
+			if maxVal < tmpData.Value {
+				maxVal = tmpData.Value
+			}
+			if minVal > tmpData.Value {
+				minVal = tmpData.Value
+			}
+
+			num, ok := dataValMap[tmpData.Value]
+			if ok {
+				dataValMap[tmpData.Value] = num + 1
+			} else {
+				dataValMap[tmpData.Value] = 1
+			}
+			total++
+		}
+	}
+
+	if total <= 0 {
+		errMsg = `没有数据`
+		err = errors.New(errMsg)
+		return
+	}
+
+	// 最大最小值 向上/下取整
+	minVal = utils.GetFloorNewNum(minVal, 2)
+	maxVal = utils.GetCeilNewNum(maxVal, 2)
+	//间距
+	spacing, _ := (decimal.NewFromFloat(maxVal).Sub(decimal.NewFromFloat(minVal))).Div(decimal.NewFromInt(int64(stepVal))).Float64()
+
+	distributionDataNumMap := make(map[float64]int)
+	for i := 1; i <= stepVal; i++ {
+		tmpMinVal, _ := decimal.NewFromFloat(minVal).Add((decimal.NewFromFloat(spacing)).Mul(decimal.NewFromInt(int64(i - 1)))).Float64()
+		tmpMaxVal, _ := decimal.NewFromFloat(minVal).Add((decimal.NewFromFloat(spacing)).Mul(decimal.NewFromInt(int64(i)))).Float64()
+		XDataList = append(XDataList, tmpMinVal)
+		distributionDataNumMap[tmpMinVal] = 0
+		for tmpVal, num := range dataValMap {
+			if tmpMinVal <= tmpVal && tmpVal < tmpMaxVal {
+				distributionDataNumMap[tmpMinVal] += num
+			}
+		}
+	}
+
+	tmpNum := 0
+	for _, tmpMinVal := range XDataList {
+		// 频率
+		frequencyYNum := distributionDataNumMap[tmpMinVal]
+		Y1DataList = append(Y1DataList, FrequencyDistributionYData{
+			X: tmpMinVal,
+			Y: float64(frequencyYNum),
+		})
+		// 累计数
+		tmpNum += frequencyYNum
+		// 累计频率
+		tmpTotalFrequency, _ := decimal.NewFromInt(int64(tmpNum)).Div(decimal.NewFromInt(int64(total))).Mul(decimal.NewFromInt(100)).Round(4).Float64()
+		Y2DataList = append(Y2DataList, FrequencyDistributionYData{
+			X: tmpMinVal,
+			Y: tmpTotalFrequency,
+		})
+	}
+
+	newDataList := []FrequencyDistributionData{
+		{
+			Name:   "频率",
+			NameEn: "Frequency",
+			Unit:   "",
+			UnitEn: "",
+			Value:  Y1DataList,
+			Color:  "#00F",
+			IsAxis: 1,
+		}, {
+			Name:   "累计频率",
+			NameEn: "Total Frequency",
+			Unit:   "%",
+			UnitEn: "%",
+			Value:  Y2DataList,
+			Color:  "#F00",
+			IsAxis: 0,
+		},
+	}
+	edbList[0].DataList = nil
+	dataResp = FrequencyDistributionResp{
+		LeftMinValue:  minVal,
+		LeftMaxValue:  maxVal,
+		RightMinValue: 0,
+		RightMaxValue: 100,
+		DataList:      newDataList,
+	}
+	return
+}

+ 28 - 0
utils/calculate.go

@@ -161,3 +161,31 @@ func CalculationDecisive(sList []Coordinate) (r2 float64) {
 
 
 	return
 	return
 }
 }
+
+// CalculateStandardDeviation 计算标准差
+func CalculateStandardDeviation(data []float64) float64 {
+	// 计算平均值
+	mean := calculateMean(data)
+	// 计算方差
+	variance := calculateVariance(data, mean)
+	return math.Sqrt(variance)
+}
+
+// 计算平均值
+func calculateMean(data []float64) float64 {
+	sum := 0.0
+	for _, value := range data {
+		sum += value
+	}
+	return sum / float64(len(data))
+}
+
+// 计算方差
+func calculateVariance(data []float64, mean float64) float64 {
+	sumSquaredDiff := 0.0
+	for _, value := range data {
+		diff := value - mean
+		sumSquaredDiff += diff * diff
+	}
+	return sumSquaredDiff / float64(len(data))
+}

+ 218 - 0
utils/common.go

@@ -9,6 +9,7 @@ import (
 	"encoding/json"
 	"encoding/json"
 	"errors"
 	"errors"
 	"fmt"
 	"fmt"
+	"github.com/shopspring/decimal"
 	"gorm.io/gorm"
 	"gorm.io/gorm"
 	"image"
 	"image"
 	"image/png"
 	"image/png"
@@ -1161,3 +1162,220 @@ func GetDateByDateType(dateType int, tmpStartDate, tmpEndDate string) (startDate
 
 
 	return
 	return
 }
 }
+
+// GetDateByDateType2 通过dateType获取需要的开始/结束日期(日期类型:1:最近3月;2:最近6月;3:最近1年;4:最近2年;5:最近3年;6:最近5年;7:最近10年,8:自定义时间)
+func GetDateByDateType2(dateType int, tmpStartDate, tmpEndDate string) (startDate, endDate string) {
+	startDate = tmpStartDate
+	endDate = tmpEndDate
+	currDate := time.Now()
+	switch dateType {
+	case 1:
+		startDate = currDate.AddDate(0, -3, 0).Format(FormatDate)
+		endDate = ""
+	case 2:
+		startDate = currDate.AddDate(0, -6, 0).Format(FormatDate)
+		endDate = ""
+	case 3:
+		startDate = currDate.AddDate(-1, 0, 0).Format(FormatDate)
+		endDate = ""
+	case 4:
+		startDate = currDate.AddDate(-2, 0, 0).Format(FormatDate)
+		endDate = ""
+	case 5:
+		startDate = currDate.AddDate(-3, 0, 0).Format(FormatDate)
+		endDate = ""
+	case 6:
+		startDate = currDate.AddDate(-5, 0, 0).Format(FormatDate)
+		endDate = ""
+	case 7:
+		startDate = currDate.AddDate(-10, 0, 0).Format(FormatDate)
+		endDate = ""
+	}
+
+	return
+}
+
+// GetCeilNewNum 保留n位有效数字的向上取整
+// @params num 实际数据
+// @params baseLen 需要保留的有效位数
+func GetCeilNewNum(num float64, baseLen int) (newNum float64) {
+	if num >= 1 {
+		tmpNum := int(math.Ceil(num)) // 向上取整
+		str := strconv.Itoa(tmpNum)
+		lenStr := len(str)
+
+		if lenStr > baseLen {
+			newNumStr := str[0:baseLen]
+			newNumInt, _ := strconv.Atoi(newNumStr)
+			newNum = float64(newNumInt) * math.Pow(10, float64(lenStr-baseLen))
+			if newNum < num {
+				newNumInt += 1
+				newNum = float64(newNumInt) * math.Pow(10, float64(lenStr-baseLen))
+			}
+		} else {
+			newNum = float64(tmpNum)
+		}
+		return
+	} else if num > 0 {
+		// 这是小数
+		str := strconv.FormatFloat(num, 'f', -1, 64)
+		// 去除小数点和负号
+		str = removeDecimalPoint(str)
+		// 计算字符串长度
+		lenStr := len(str)
+
+		if lenStr > baseLen {
+			newNumStr := str[0:baseLen]
+			newNumInt, _ := strconv.Atoi(newNumStr)
+			newNum, _ = decimal.NewFromInt(int64(newNumInt)).Div(decimal.NewFromFloat(math.Pow(10, float64(baseLen)))).Float64()
+			if newNum < num {
+				newNumInt += 1
+				newNum, _ = decimal.NewFromInt(int64(newNumInt)).Div(decimal.NewFromFloat(math.Pow(10, float64(baseLen)))).Float64()
+			}
+		} else {
+			newNum = num
+		}
+	} else if num > -1 {
+		// 这是小数
+		str := strconv.FormatFloat(num, 'f', -1, 64)
+		// 去除小数点和负号
+		str = removeDecimalPoint(str)
+		// 计算字符串长度
+		lenStr := len(str)
+
+		if lenStr > baseLen {
+			newNumStr := str[0:baseLen]
+			newNumInt, _ := strconv.Atoi(newNumStr)
+			newNum, _ = decimal.NewFromInt(int64(newNumInt)).Div(decimal.NewFromFloat(math.Pow(10, float64(baseLen)))).Float64()
+			newNum = -newNum
+			if newNum < num {
+				newNumInt -= 1
+				newNum, _ = decimal.NewFromInt(int64(newNumInt)).Div(decimal.NewFromFloat(math.Pow(10, float64(baseLen)))).Float64()
+				newNum = -newNum
+			}
+		} else {
+			newNum = num
+		}
+		if newNum == -0 {
+			newNum = 0
+		}
+	} else { // 小于等于-1
+		tmpNumFloat := math.Abs(num)
+		tmpNum := int(math.Floor(tmpNumFloat)) // 向上取整
+		str := strconv.Itoa(tmpNum)
+		lenStr := len(str)
+
+		if lenStr > baseLen {
+			newNumStr := str[0:baseLen]
+			//fmt.Println("newNumStr:", newNumStr)
+			newNumInt, _ := strconv.Atoi(newNumStr)
+			newNum = float64(newNumInt) * math.Pow(10, float64(lenStr-baseLen))
+			newNum = -newNum
+			if newNum < num {
+				newNumInt -= 1
+				newNum = float64(newNumInt) * math.Pow(10, float64(lenStr-baseLen))
+				newNum = -newNum
+			}
+		} else {
+			newNum = float64(-tmpNum)
+		}
+	}
+
+	return
+}
+
+// GetFloorNewNum 保留n位有效数字的向下取整
+// @params num 实际数据
+// @params baseLen 需要保留的有效位数
+func GetFloorNewNum(num float64, baseLen int) (newNum float64) {
+	if num >= 1 {
+		tmpNum := int(math.Floor(num)) // 向上取整
+		str := strconv.Itoa(tmpNum)
+		lenStr := len(str)
+
+		if lenStr > baseLen {
+			newNumStr := str[0:baseLen]
+			newNumInt, _ := strconv.Atoi(newNumStr)
+			newNum = float64(newNumInt) * math.Pow(10, float64(lenStr-baseLen))
+			if newNum < num {
+				newNumInt -= 1
+				newNum = float64(newNumInt) * math.Pow(10, float64(lenStr-baseLen))
+			}
+		} else {
+			newNum = float64(tmpNum)
+		}
+		return
+	} else if num > 0 {
+		// 这是小数
+		str := strconv.FormatFloat(num, 'f', -1, 64)
+		// 去除小数点和负号
+		str = removeDecimalPoint(str)
+		// 计算字符串长度
+		lenStr := len(str)
+
+		if lenStr > baseLen {
+			newNumStr := str[0:baseLen]
+			newNumInt, _ := strconv.Atoi(newNumStr)
+			newNum, _ = decimal.NewFromInt(int64(newNumInt)).Div(decimal.NewFromFloat(math.Pow(10, float64(baseLen)))).Float64()
+			if newNum > num {
+				newNumInt -= 1
+				newNum, _ = decimal.NewFromInt(int64(newNumInt)).Div(decimal.NewFromFloat(math.Pow(10, float64(baseLen)))).Float64()
+			}
+		} else {
+			newNum = num
+		}
+	} else if num > -1 {
+		// 这是小数
+		str := strconv.FormatFloat(num, 'f', -1, 64)
+		// 去除小数点和负号
+		str = removeDecimalPoint(str)
+		// 计算字符串长度
+		lenStr := len(str)
+
+		if lenStr > baseLen {
+			newNumStr := str[0:baseLen]
+			newNumInt, _ := strconv.Atoi(newNumStr)
+			newNum, _ = decimal.NewFromInt(int64(newNumInt)).Div(decimal.NewFromFloat(math.Pow(10, float64(baseLen)))).Float64()
+			newNum = -newNum
+			if newNum > num {
+				newNumInt += 1
+				newNum, _ = decimal.NewFromInt(int64(newNumInt)).Div(decimal.NewFromFloat(math.Pow(10, float64(baseLen)))).Float64()
+				newNum = -newNum
+			}
+		} else {
+			newNum = num
+		}
+		if newNum == -0 {
+			newNum = 0
+		}
+	} else { // 小于等于-1
+		tmpNumFloat := math.Abs(num)
+		tmpNum := int(math.Ceil(tmpNumFloat)) // 向上取整
+		str := strconv.Itoa(tmpNum)
+		lenStr := len(str)
+
+		if lenStr > baseLen {
+			newNumStr := str[0:baseLen]
+			//fmt.Println("newNumStr:", newNumStr)
+			newNumInt, _ := strconv.Atoi(newNumStr)
+			newNum = float64(newNumInt) * math.Pow(10, float64(lenStr-baseLen))
+			newNum = -newNum
+			if newNum > num {
+				newNumInt += 1
+				newNum = float64(newNumInt) * math.Pow(10, float64(lenStr-baseLen))
+				newNum = -newNum
+			}
+		} else {
+			newNum = float64(-tmpNum)
+		}
+	}
+
+	return
+}
+
+// 去除小数点和负号
+func removeDecimalPoint(str string) string {
+	// 去除小数点
+	str = str[strings.Index(str, ".")+1:]
+	return str
+}

+ 129 - 118
utils/constants.go

@@ -42,72 +42,76 @@ const (
 
 
 // 数据来源渠道
 // 数据来源渠道
 const (
 const (
-	DATA_SOURCE_THS                          = iota + 1 //同花顺
-	DATA_SOURCE_WIND                                    //wind
-	DATA_SOURCE_PB                                      //彭博
-	DATA_SOURCE_CALCULATE                               //指标运算
-	DATA_SOURCE_CALCULATE_LJZZY                         //累计值转月
-	DATA_SOURCE_CALCULATE_TBZ                           //同比值
-	DATA_SOURCE_CALCULATE_TCZ                           //同差值
-	DATA_SOURCE_CALCULATE_NSZYDPJJS                     //N数值移动平均计算
-	DATA_SOURCE_MANUAL                                  //手工指标
-	DATA_SOURCE_LZ                                      //隆众
-	DATA_SOURCE_YS                                      //有色
-	DATA_SOURCE_CALCULATE_HBZ                           //环比值->12
-	DATA_SOURCE_CALCULATE_HCZ                           //环差值->13
-	DATA_SOURCE_CALCULATE_BP                            //变频->14
-	DATA_SOURCE_GL                                      //钢联->15
-	DATA_SOURCE_ZZ                                      //郑商所->16
-	DATA_SOURCE_DL                                      //大商所->17
-	DATA_SOURCE_SH                                      //上期所->18
-	DATA_SOURCE_CFFEX                                   //中金所->19
-	DATA_SOURCE_SHFE                                    //上期能源->20
-	DATA_SOURCE_GIE                                     //欧洲天然气->21
-	DATA_SOURCE_CALCULATE_TIME_SHIFT                    //时间移位->22
-	DATA_SOURCE_CALCULATE_ZJPJ                          //直接拼接->23
-	DATA_SOURCE_CALCULATE_LJZTBPJ                       //累计值同比拼接->24
-	DATA_SOURCE_LT                                      //路透->25
-	DATA_SOURCE_COAL                                    //中国煤炭网->26
-	DATA_SOURCE_PYTHON                                  //python代码->27
-	DATA_SOURCE_PB_FINANCE                              //彭博财务数据->28
-	DATA_SOURCE_GOOGLE_TRAVEL                           //谷歌出行->29
-	DATA_SOURCE_PREDICT                                 //普通预测指标->30
-	DATA_SOURCE_PREDICT_CALCULATE                       //预测指标运算->31
-	DATA_SOURCE_PREDICT_CALCULATE_TBZ                   //预测指标同比值->32
-	DATA_SOURCE_PREDICT_CALCULATE_TCZ                   //预测指标同差值->33
-	DATA_SOURCE_MYSTEEL_CHEMICAL                        //钢联化工->34
-	DATA_SOURCE_CALCULATE_CJJX                          //超季节性->35
-	DATA_SOURCE_EIA_STEO                                //eia steo报告->36
-	DATA_SOURCE_CALCULATE_NHCC                          //计算指标(拟合残差)->37
-	DATA_SOURCE_COM_TRADE                               //联合国商品贸易数据->38
-	DATA_SOURCE_PREDICT_CALCULATE_NSZYDPJJS             //预测指标 - N数值移动平均计算 -> 39
-	DATA_SOURCE_CALCULATE_ADJUST                        //数据调整->40
-	DATA_SOURCE_SCI                                     //卓创数据(红桃三)-> 41
-	DATA_SOURCE_PREDICT_CALCULATE_LJZZY                 //预测指标 - 累计值转月->42
-	DATA_SOURCE_PREDICT_CALCULATE_HBZ                   //预测指标 - 环比值->43
-	DATA_SOURCE_PREDICT_CALCULATE_HCZ                   //预测指标 - 环差值->44
-	DATA_SOURCE_PREDICT_CALCULATE_BP                    //预测指标 - 变频->45
-	DATA_SOURCE_PREDICT_CALCULATE_TIME_SHIFT            //预测指标 - 时间移位->46
-	DATA_SOURCE_PREDICT_CALCULATE_ZJPJ                  //预测指标 - 直接拼接->47
-	DATA_SOURCE_PREDICT_CALCULATE_LJZTBPJ               //预测指标 - 累计值同比拼接->48
-	DATA_SOURCE_PREDICT_CALCULATE_CJJX                  //预测指标 - 超季节性->49
-	DATA_SOURCE_PREDICT_CALCULATE_NHCC                  //预测指标 - 计算指标(拟合残差)->50
-	DATA_SOURCE_CALCULATE_JP                            //降频->51
-	DATA_SOURCE_CALCULATE_NH                            //年化->52
-	DATA_SOURCE_CALCULATE_KSZS                          //扩散指数->53
-	DATA_SOURCE_PREDICT_CALCULATE_JP                    //预测指标 - 计算指标(降频)->54
-	DATA_SOURCE_PREDICT_CALCULATE_NH                    //预测指标 - 计算指标(年化)->55
-	DATA_SOURCE_PREDICT_CALCULATE_KSZS                  //预测指标 - 计算指标(扩散指数)->56
-	DATA_SOURCE_BAIINFO                                 //百川盈孚 ->57
-	DATA_SOURCE_STOCK_PLANT                             //存量装置 ->58
-	DATA_SOURCE_CALCULATE_CORRELATION                   //相关性计算->59
-	DATA_SOURCE_NATIONAL_STATISTICS                     //国家统计局->60
-	DATA_SOURCE_CALCULATE_LJZZJ                         //累计值转季 -> 61
-	DATA_SOURCE_CALCULATE_LJZ                           //累计值 -> 62
-	DATA_SOURCE_CALCULATE_LJZNCZJ                       //累计值(年初至今) -> 63
-	DATA_SOURCE_PREDICT_CALCULATE_LJZZJ                 //预测指标 - 累计值转季->64
-	DATA_SOURCE_PREDICT_CALCULATE_LJZ                   //预测指标 - 累计值 -> 65
-	DATA_SOURCE_PREDICT_CALCULATE_LJZNCZJ               //预测指标 - 累计值(年初至今) -> 66
+	DATA_SOURCE_THS                                  = iota + 1 //同花顺
+	DATA_SOURCE_WIND                                            //wind
+	DATA_SOURCE_PB                                              //彭博
+	DATA_SOURCE_CALCULATE                                       //指标运算
+	DATA_SOURCE_CALCULATE_LJZZY                                 //累计值转月
+	DATA_SOURCE_CALCULATE_TBZ                                   //同比值
+	DATA_SOURCE_CALCULATE_TCZ                                   //同差值
+	DATA_SOURCE_CALCULATE_NSZYDPJJS                             //N数值移动平均计算
+	DATA_SOURCE_MANUAL                                          //手工指标
+	DATA_SOURCE_LZ                                              //隆众
+	DATA_SOURCE_YS                                              //有色
+	DATA_SOURCE_CALCULATE_HBZ                                   //环比值->12
+	DATA_SOURCE_CALCULATE_HCZ                                   //环差值->13
+	DATA_SOURCE_CALCULATE_BP                                    //变频->14
+	DATA_SOURCE_GL                                              //钢联->15
+	DATA_SOURCE_ZZ                                              //郑商所->16
+	DATA_SOURCE_DL                                              //大商所->17
+	DATA_SOURCE_SH                                              //上期所->18
+	DATA_SOURCE_CFFEX                                           //中金所->19
+	DATA_SOURCE_SHFE                                            //上期能源->20
+	DATA_SOURCE_GIE                                             //欧洲天然气->21
+	DATA_SOURCE_CALCULATE_TIME_SHIFT                            //时间移位->22
+	DATA_SOURCE_CALCULATE_ZJPJ                                  //直接拼接->23
+	DATA_SOURCE_CALCULATE_LJZTBPJ                               //累计值同比拼接->24
+	DATA_SOURCE_LT                                              //路透->25
+	DATA_SOURCE_COAL                                            //中国煤炭网->26
+	DATA_SOURCE_PYTHON                                          //python代码->27
+	DATA_SOURCE_PB_FINANCE                                      //彭博财务数据->28
+	DATA_SOURCE_GOOGLE_TRAVEL                                   //谷歌出行->29
+	DATA_SOURCE_PREDICT                                         //普通预测指标->30
+	DATA_SOURCE_PREDICT_CALCULATE                               //预测指标运算->31
+	DATA_SOURCE_PREDICT_CALCULATE_TBZ                           //预测指标同比值->32
+	DATA_SOURCE_PREDICT_CALCULATE_TCZ                           //预测指标同差值->33
+	DATA_SOURCE_MYSTEEL_CHEMICAL                                //钢联化工->34
+	DATA_SOURCE_CALCULATE_CJJX                                  //超季节性->35
+	DATA_SOURCE_EIA_STEO                                        //eia steo报告->36
+	DATA_SOURCE_CALCULATE_NHCC                                  //计算指标(拟合残差)->37
+	DATA_SOURCE_COM_TRADE                                       //联合国商品贸易数据->38
+	DATA_SOURCE_PREDICT_CALCULATE_NSZYDPJJS                     //预测指标 - N数值移动平均计算 -> 39
+	DATA_SOURCE_CALCULATE_ADJUST                                //数据调整->40
+	DATA_SOURCE_SCI                                             //卓创数据(红桃三)-> 41
+	DATA_SOURCE_PREDICT_CALCULATE_LJZZY                         //预测指标 - 累计值转月->42
+	DATA_SOURCE_PREDICT_CALCULATE_HBZ                           //预测指标 - 环比值->43
+	DATA_SOURCE_PREDICT_CALCULATE_HCZ                           //预测指标 - 环差值->44
+	DATA_SOURCE_PREDICT_CALCULATE_BP                            //预测指标 - 变频->45
+	DATA_SOURCE_PREDICT_CALCULATE_TIME_SHIFT                    //预测指标 - 时间移位->46
+	DATA_SOURCE_PREDICT_CALCULATE_ZJPJ                          //预测指标 - 直接拼接->47
+	DATA_SOURCE_PREDICT_CALCULATE_LJZTBPJ                       //预测指标 - 累计值同比拼接->48
+	DATA_SOURCE_PREDICT_CALCULATE_CJJX                          //预测指标 - 超季节性->49
+	DATA_SOURCE_PREDICT_CALCULATE_NHCC                          //预测指标 - 计算指标(拟合残差)->50
+	DATA_SOURCE_CALCULATE_JP                                    //降频->51
+	DATA_SOURCE_CALCULATE_NH                                    //年化->52
+	DATA_SOURCE_CALCULATE_KSZS                                  //扩散指数->53
+	DATA_SOURCE_PREDICT_CALCULATE_JP                            //预测指标 - 计算指标(降频)->54
+	DATA_SOURCE_PREDICT_CALCULATE_NH                            //预测指标 - 计算指标(年化)->55
+	DATA_SOURCE_PREDICT_CALCULATE_KSZS                          //预测指标 - 计算指标(扩散指数)->56
+	DATA_SOURCE_BAIINFO                                         //百川盈孚 ->57
+	DATA_SOURCE_STOCK_PLANT                                     //存量装置 ->58
+	DATA_SOURCE_CALCULATE_CORRELATION                           //相关性计算->59
+	DATA_SOURCE_NATIONAL_STATISTICS                             //国家统计局->60
+	DATA_SOURCE_CALCULATE_LJZZJ                                 //累计值转季 -> 61
+	DATA_SOURCE_CALCULATE_LJZ                                   //累计值 -> 62
+	DATA_SOURCE_CALCULATE_LJZNCZJ                               //累计值(年初至今) -> 63
+	DATA_SOURCE_PREDICT_CALCULATE_LJZZJ                         //预测指标 - 累计值转季->64
+	DATA_SOURCE_PREDICT_CALCULATE_LJZ                           //预测指标 - 累计值 -> 65
+	DATA_SOURCE_PREDICT_CALCULATE_LJZNCZJ                       //预测指标 - 累计值(年初至今) -> 66
+	DATA_SOURCE_CALCULATE_STANDARD_DEVIATION                    //标准差->67
+	DATA_SOURCE_CALCULATE_PERCENTILE                            //百分位->68
+	DATA_SOURCE_PREDICT_CALCULATE_STANDARD_DEVIATION            //预测标准差->69
+	DATA_SOURCE_PREDICT_CALCULATE_PERCENTILE                    //预测百分位->70
 )
 )
 
 
 const (
 const (
@@ -197,52 +201,56 @@ const (
 
 
 // SystemSourceList 系统来源
 // SystemSourceList 系统来源
 var SystemSourceList = []int{
 var SystemSourceList = []int{
-	DATA_SOURCE_CALCULATE,                    //指标运算
-	DATA_SOURCE_CALCULATE_LJZZY,              //累计值转月
-	DATA_SOURCE_CALCULATE_TBZ,                //同比值
-	DATA_SOURCE_CALCULATE_TCZ,                //同差值
-	DATA_SOURCE_CALCULATE_NSZYDPJJS,          //N数值移动平均计算
-	DATA_SOURCE_MANUAL,                       //手工指标
-	DATA_SOURCE_CALCULATE_HBZ,                //环比值->12
-	DATA_SOURCE_CALCULATE_HCZ,                //环差值->13
-	DATA_SOURCE_CALCULATE_BP,                 //变频->14
-	DATA_SOURCE_CALCULATE_TIME_SHIFT,         //时间移位->22
-	DATA_SOURCE_CALCULATE_ZJPJ,               //直接拼接->23
-	DATA_SOURCE_CALCULATE_LJZTBPJ,            //累计值同比拼接->24
-	DATA_SOURCE_PYTHON,                       //python代码->27
-	DATA_SOURCE_PREDICT,                      //预测指标->30
-	DATA_SOURCE_PREDICT_CALCULATE,            //预测指标运算->31
-	DATA_SOURCE_PREDICT_CALCULATE_TBZ,        //预测指标同比值->32
-	DATA_SOURCE_PREDICT_CALCULATE_TCZ,        //预测指标同差值->33
-	DATA_SOURCE_MYSTEEL_CHEMICAL,             //钢联化工->34
-	DATA_SOURCE_CALCULATE_CJJX,               //超季节性->35
-	DATA_SOURCE_CALCULATE_NHCC,               //计算指标(拟合残差)->37
-	DATA_SOURCE_PREDICT_CALCULATE_NSZYDPJJS,  //预测指标 - N数值移动平均计算 -> 39
-	DATA_SOURCE_CALCULATE_ADJUST,             //数据调整->40
-	DATA_SOURCE_PREDICT_CALCULATE_LJZZY,      //预测指标 - 累计值转月->42
-	DATA_SOURCE_PREDICT_CALCULATE_HBZ,        //预测指标 - 环比值->43
-	DATA_SOURCE_PREDICT_CALCULATE_HCZ,        //预测指标 - 环差值->44
-	DATA_SOURCE_PREDICT_CALCULATE_BP,         //预测指标 - 变频->45
-	DATA_SOURCE_PREDICT_CALCULATE_TIME_SHIFT, //预测指标 - 时间移位->46
-	DATA_SOURCE_PREDICT_CALCULATE_ZJPJ,       //预测指标 - 直接拼接->47
-	DATA_SOURCE_PREDICT_CALCULATE_LJZTBPJ,    //预测指标 - 累计值同比拼接->48
-	DATA_SOURCE_PREDICT_CALCULATE_CJJX,       //预测指标 - 超季节性->49
-	DATA_SOURCE_PREDICT_CALCULATE_NHCC,       //预测指标 - 计算指标(拟合残差)->50
-	DATA_SOURCE_CALCULATE_JP,                 //降频->51
-	DATA_SOURCE_CALCULATE_NH,                 //年化->52
-	DATA_SOURCE_CALCULATE_KSZS,               //扩散指数->53
-	DATA_SOURCE_PREDICT_CALCULATE_JP,         //预测指标 - 计算指标(降频)->54
-	DATA_SOURCE_PREDICT_CALCULATE_NH,         //预测指标 - 计算指标(年化)->55
-	DATA_SOURCE_PREDICT_CALCULATE_KSZS,       //预测指标 - 计算指标(扩散指数)->56
-	DATA_SOURCE_STOCK_PLANT,                  //存量装置 ->58
-	DATA_SOURCE_CALCULATE_CORRELATION,        //相关性计算->59
-	DATA_SOURCE_NATIONAL_STATISTICS,          //国家统计局->60
-	DATA_SOURCE_CALCULATE_LJZZJ,              //累计值转季 -> 61
-	DATA_SOURCE_CALCULATE_LJZ,                //累计值 -> 62
-	DATA_SOURCE_CALCULATE_LJZNCZJ,            //累计值(年初至今) -> 63
-	DATA_SOURCE_PREDICT_CALCULATE_LJZZJ,      //预测指标 - 累计值转季->64
-	DATA_SOURCE_PREDICT_CALCULATE_LJZ,        //预测指标 - 累计值 -> 65
-	DATA_SOURCE_PREDICT_CALCULATE_LJZNCZJ,    //预测指标 - 累计值(年初至今) -> 66
+	DATA_SOURCE_CALCULATE,                            //指标运算
+	DATA_SOURCE_CALCULATE_LJZZY,                      //累计值转月
+	DATA_SOURCE_CALCULATE_TBZ,                        //同比值
+	DATA_SOURCE_CALCULATE_TCZ,                        //同差值
+	DATA_SOURCE_CALCULATE_NSZYDPJJS,                  //N数值移动平均计算
+	DATA_SOURCE_MANUAL,                               //手工指标
+	DATA_SOURCE_CALCULATE_HBZ,                        //环比值->12
+	DATA_SOURCE_CALCULATE_HCZ,                        //环差值->13
+	DATA_SOURCE_CALCULATE_BP,                         //变频->14
+	DATA_SOURCE_CALCULATE_TIME_SHIFT,                 //时间移位->22
+	DATA_SOURCE_CALCULATE_ZJPJ,                       //直接拼接->23
+	DATA_SOURCE_CALCULATE_LJZTBPJ,                    //累计值同比拼接->24
+	DATA_SOURCE_PYTHON,                               //python代码->27
+	DATA_SOURCE_PREDICT,                              //预测指标->30
+	DATA_SOURCE_PREDICT_CALCULATE,                    //预测指标运算->31
+	DATA_SOURCE_PREDICT_CALCULATE_TBZ,                //预测指标同比值->32
+	DATA_SOURCE_PREDICT_CALCULATE_TCZ,                //预测指标同差值->33
+	DATA_SOURCE_MYSTEEL_CHEMICAL,                     //钢联化工->34
+	DATA_SOURCE_CALCULATE_CJJX,                       //超季节性->35
+	DATA_SOURCE_CALCULATE_NHCC,                       //计算指标(拟合残差)->37
+	DATA_SOURCE_PREDICT_CALCULATE_NSZYDPJJS,          //预测指标 - N数值移动平均计算 -> 39
+	DATA_SOURCE_CALCULATE_ADJUST,                     //数据调整->40
+	DATA_SOURCE_PREDICT_CALCULATE_LJZZY,              //预测指标 - 累计值转月->42
+	DATA_SOURCE_PREDICT_CALCULATE_HBZ,                //预测指标 - 环比值->43
+	DATA_SOURCE_PREDICT_CALCULATE_HCZ,                //预测指标 - 环差值->44
+	DATA_SOURCE_PREDICT_CALCULATE_BP,                 //预测指标 - 变频->45
+	DATA_SOURCE_PREDICT_CALCULATE_TIME_SHIFT,         //预测指标 - 时间移位->46
+	DATA_SOURCE_PREDICT_CALCULATE_ZJPJ,               //预测指标 - 直接拼接->47
+	DATA_SOURCE_PREDICT_CALCULATE_LJZTBPJ,            //预测指标 - 累计值同比拼接->48
+	DATA_SOURCE_PREDICT_CALCULATE_CJJX,               //预测指标 - 超季节性->49
+	DATA_SOURCE_PREDICT_CALCULATE_NHCC,               //预测指标 - 计算指标(拟合残差)->50
+	DATA_SOURCE_CALCULATE_JP,                         //降频->51
+	DATA_SOURCE_CALCULATE_NH,                         //年化->52
+	DATA_SOURCE_CALCULATE_KSZS,                       //扩散指数->53
+	DATA_SOURCE_PREDICT_CALCULATE_JP,                 //预测指标 - 计算指标(降频)->54
+	DATA_SOURCE_PREDICT_CALCULATE_NH,                 //预测指标 - 计算指标(年化)->55
+	DATA_SOURCE_PREDICT_CALCULATE_KSZS,               //预测指标 - 计算指标(扩散指数)->56
+	DATA_SOURCE_STOCK_PLANT,                          //存量装置 ->58
+	DATA_SOURCE_CALCULATE_CORRELATION,                //相关性计算->59
+	DATA_SOURCE_NATIONAL_STATISTICS,                  //国家统计局->60
+	DATA_SOURCE_CALCULATE_LJZZJ,                      //累计值转季 -> 61
+	DATA_SOURCE_CALCULATE_LJZ,                        //累计值 -> 62
+	DATA_SOURCE_CALCULATE_LJZNCZJ,                    //累计值(年初至今) -> 63
+	DATA_SOURCE_PREDICT_CALCULATE_LJZZJ,              //预测指标 - 累计值转季->64
+	DATA_SOURCE_PREDICT_CALCULATE_LJZ,                //预测指标 - 累计值 -> 65
+	DATA_SOURCE_PREDICT_CALCULATE_LJZNCZJ,            //预测指标 - 累计值(年初至今) -> 66
+	DATA_SOURCE_CALCULATE_STANDARD_DEVIATION,         //标准差->67
+	DATA_SOURCE_CALCULATE_PERCENTILE,                 //百分位->68
+	DATA_SOURCE_PREDICT_CALCULATE_STANDARD_DEVIATION, //预测标准差->69
+	DATA_SOURCE_PREDICT_CALCULATE_PERCENTILE,         //预测百分位->70
 }
 }
 
 
 const (
 const (
@@ -264,12 +272,15 @@ const ALIYUN_OSS_HOST = "https://hzstatic.hzinsights.com"
 
 
 // 图表类型
 // 图表类型
 const (
 const (
-	CHART_SOURCE_DEFAULT             = 1
-	CHART_SOURCE_FUTURE_GOOD         = 2
-	CHART_SOURCE_CORRELATION         = 3 // 相关性图表
-	CHART_SOURCE_ROLLING_CORRELATION = 4 // 滚动相关性图表
-	CHART_SOURCE_FUTURE_GOOD_PROFIT  = 5 // 商品利润曲线
-	CHART_SOURCE_LINE_EQUATION       = 6 // 拟合方程图表
+	CHART_SOURCE_DEFAULT                         = 1
+	CHART_SOURCE_FUTURE_GOOD                     = 2
+	CHART_SOURCE_CORRELATION                     = 3 // 相关性图表
+	CHART_SOURCE_ROLLING_CORRELATION             = 4 // 滚动相关性图表
+	CHART_SOURCE_FUTURE_GOOD_PROFIT              = 5 // 商品利润曲线
+	CHART_SOURCE_LINE_EQUATION                   = 6 // 拟合方程图表
+	CHART_SOURCE_LINE_FEATURE_STANDARD_DEVIATION = 7 // 统计特征-标准差图表
+	CHART_SOURCE_LINE_FEATURE_PERCENTILE         = 8 // 统计特征-百分位图表
+	CHART_SOURCE_LINE_FEATURE_FREQUENCY          = 9 // 统计特征-频率分布图表
 )
 )
 
 
 // 图表类型
 // 图表类型

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác