Browse Source

feat支持滚动相关性图表

Roc 2 years ago
parent
commit
d159e85949

+ 59 - 26
controller/chart/chart_common.go

@@ -14,6 +14,7 @@ import (
 	chartInfoModel "hongze/hongze_yb/models/tables/chart_info"
 	"hongze/hongze_yb/models/tables/chart_info_correlation"
 	"hongze/hongze_yb/models/tables/chart_info_log"
+	"hongze/hongze_yb/models/tables/multiple_graph_config_chart_mapping"
 	"hongze/hongze_yb/models/tables/yb_my_chart"
 	"hongze/hongze_yb/services/alarm_msg"
 	"hongze/hongze_yb/services/chart"
@@ -79,7 +80,7 @@ func CommonChartInfoDetailFromUniqueCode(c *gin.Context) {
 		}
 		response.OkData("获取成功", resp, c)
 		return
-	case utils.CHART_SOURCE_CORRELATION:
+	case utils.CHART_SOURCE_CORRELATION, utils.CHART_SOURCE_ROLLING_CORRELATION:
 		resp, isOk, msg, errMsg := getCorrelationChartInfoDetail(chartInfo, myChartClassifyId, user.GetInfoByClaims(c))
 		if !isOk {
 			response.FailMsg(msg, errMsg, c)
@@ -414,24 +415,6 @@ func getCorrelationChartInfoDetail(chartInfo *chartInfoModel.ChartInfoView, myCh
 		errMsg = "获取图表相关性信息失败, Err:" + e.Error()
 		return
 	}
-	if correlationChart.PeriodData == "" || correlationChart.CorrelationData == "" {
-		msg = "获取失败"
-		errMsg = "相关性图表数据有误"
-		return
-	}
-	//chartInfo.CorrelationLeadUnit = correlationChart.LeadUnit
-	xData := make([]int, 0)
-	yData := make([]float64, 0)
-	if e := json.Unmarshal([]byte(correlationChart.PeriodData), &xData); e != nil {
-		msg = "获取失败"
-		errMsg = "相关性图表X轴数据有误, Err:" + e.Error()
-		return
-	}
-	if e := json.Unmarshal([]byte(correlationChart.CorrelationData), &yData); e != nil {
-		msg = "获取失败"
-		errMsg = "相关性图表X轴数据有误, Err:" + e.Error()
-		return
-	}
 
 	// 获取指标信息
 	edbInfoMappingA, e := chartEdbMappingModel.GetChartEdbMappingByEdbInfoId(correlationChart.EdbInfoIdFirst)
@@ -447,13 +430,62 @@ func getCorrelationChartInfoDetail(chartInfo *chartInfoModel.ChartInfoView, myCh
 		return
 	}
 
-	xEdbIdValue := xData
-	yDataList := make([]chart_info.YData, 0)
-	yDate := "0000-00-00"
-	yDataList = append(yDataList, chart_info.YData{
-		Date:  yDate,
-		Value: yData,
-	})
+	var dataResp interface{} // 绘图数据返回(目前是滚动相关性的图)
+	var xEdbIdValue []int
+	var xDateTimeValue []string
+	var yDataList []chart_info.YData
+	switch chartInfo.Source {
+	case utils.CHART_SOURCE_CORRELATION: // 相关性图
+		moveUnitDays, ok := utils.FrequencyDaysMap[correlationChart.CalculateUnit]
+		if !ok {
+			msg = "错误的分析周期"
+			errMsg = "相关性图表数据有误"
+			return
+		}
+		startDate := time.Now().AddDate(0, 0, -correlationChart.CalculateValue*moveUnitDays).Format(utils.FormatDate)
+		endDate := time.Now().Format(utils.FormatDate)
+
+		xEdbIdValue, yDataList, e = correlation.GetChartDataByEdbInfo(edbInfoMappingA, edbInfoMappingB, correlationChart.LeadValue, correlationChart.LeadUnit, startDate, endDate)
+		if e != nil {
+			msg = "获取失败"
+			errMsg = "获取相关性图表, 图表计算值失败, Err:" + e.Error()
+			return
+		}
+	case utils.CHART_SOURCE_ROLLING_CORRELATION: // 滚动相关性图
+		multipleGraphConfigChartMapping, e := multiple_graph_config_chart_mapping.GetMultipleGraphConfigChartMappingByChartId(chartInfo.ChartInfoId)
+		if e != nil {
+			msg = "获取失败"
+			errMsg = "获取滚动相关性图表的配置信息失败, Err:" + e.Error()
+			return
+		}
+		baseChartMultipleGraphConfigChartMapping, e := multiple_graph_config_chart_mapping.GetMultipleGraphConfigChartMappingByIdAndSource(multipleGraphConfigChartMapping.MultipleGraphConfigID, 2)
+		if e != nil {
+			msg = "获取失败"
+			errMsg = "获取相关性图表的配置信息失败, Err:" + e.Error()
+			return
+		}
+
+		baseChartCorrelationChart := new(chart_info_correlation.ChartInfoCorrelation)
+		if e := baseChartCorrelationChart.GetItemById(baseChartMultipleGraphConfigChartMapping.ChartInfoID); e != nil {
+			msg = "获取失败"
+			errMsg = "获取基础相关性图表信息失败, Err:" + e.Error()
+			return
+		}
+
+		moveUnitDays, ok := utils.FrequencyDaysMap[baseChartCorrelationChart.CalculateUnit]
+		if !ok {
+			msg = "错误的分析周期"
+			errMsg = "错误的分析周期"
+			return
+		}
+		startDate := time.Now().AddDate(0, 0, -baseChartCorrelationChart.CalculateValue*moveUnitDays).Format(utils.FormatDate)
+		endDate := time.Now().Format(utils.FormatDate)
+		xDateTimeValue, yDataList, e = correlation.GetRollingCorrelationChartDataByEdbInfo(edbInfoMappingA, edbInfoMappingB, correlationChart.LeadValue, correlationChart.LeadUnit, correlationChart.CalculateValue, correlationChart.CalculateUnit, startDate, endDate)
+		dataResp = chart_info.RollingCorrelationChartDataResp{
+			XDateTimeValue: xDateTimeValue,
+			YDataList:      yDataList,
+		}
+	}
 
 	// 完善指标信息
 	edbList, e := correlation.GetChartEdbInfoFormat(chartInfo.ChartInfoId, edbInfoMappingA, edbInfoMappingB)
@@ -514,6 +546,7 @@ func getCorrelationChartInfoDetail(chartInfo *chartInfoModel.ChartInfoView, myCh
 	resp.XEdbIdValue = xEdbIdValue
 	resp.YDataList = yDataList
 	resp.CorrelationChartInfo = correlationInfo
+	resp.DataResp = dataResp
 	isOk = true
 	return
 }

+ 6 - 0
models/response/chart_info/chart_info.go

@@ -44,3 +44,9 @@ type CorrelationInfo struct {
 	PeriodData      string `description:"X轴-期数数据"`
 	CorrelationData string `description:"Y轴-相关性系数"`
 }
+
+// RollingCorrelationChartDataResp 滚动相关性图
+type RollingCorrelationChartDataResp struct {
+	XDateTimeValue []string `description:"滚动相关性图的x轴数据,日期数据"`
+	YDataList      []YData  `description:"滚动相关性图的y轴数据"`
+}

+ 6 - 0
models/tables/chart_info_correlation/entity.go

@@ -7,6 +7,8 @@ type ChartInfoCorrelation struct {
 	CorrelationChartInfoId int       `gorm:"primaryKey;column:correlation_chart_info_id;type:int(10) unsigned;not null" json:"-"`       // 相关性图表ID(chart_info表source=3的)
 	LeadValue              int       `gorm:"column:lead_value;type:int(10) unsigned;not null;default:0" json:"leadValue"`               // 领先值
 	LeadUnit               string    `gorm:"column:lead_unit;type:varchar(16);not null;default:''" json:"leadUnit"`                     // 领先单位
+	CalculateValue         int       `gorm:"column:calculate_value;type:int(9);default:null;default:0" json:"calculateValue"`           // 计算窗口
+	CalculateUnit          string    `gorm:"column:calculate_unit;type:varchar(16);default:null;default:''" json:"calculateUnit"`       // 计算窗口的单位
 	StartDate              time.Time `gorm:"column:start_date;type:date" json:"startDate"`                                              // 开始日期
 	EndDate                time.Time `gorm:"column:end_date;type:date" json:"endDate"`                                                  // 结束日期
 	EdbInfoIdFirst         int       `gorm:"column:edb_info_id_first;type:int(10) unsigned;not null;default:0" json:"edbInfoIdFirst"`   // A指标ID
@@ -27,6 +29,8 @@ var ChartInfoCorrelationColumns = struct {
 	CorrelationChartInfoID string
 	LeadValue              string
 	LeadUnit               string
+	CalculateValue         string
+	CalculateUnit          string
 	StartDate              string
 	EndDate                string
 	EdbInfoIDFirst         string
@@ -39,6 +43,8 @@ var ChartInfoCorrelationColumns = struct {
 	CorrelationChartInfoID: "correlation_chart_info_id",
 	LeadValue:              "lead_value",
 	LeadUnit:               "lead_unit",
+	CalculateValue:         "calculate_value",
+	CalculateUnit:          "calculate_unit",
 	StartDate:              "start_date",
 	EndDate:                "end_date",
 	EdbInfoIDFirst:         "edb_info_id_first",

+ 49 - 0
models/tables/multiple_graph_config/entity.go

@@ -0,0 +1,49 @@
+package multiple_graph_config
+
+import (
+	"time"
+)
+
+// MultipleGraphConfig 多图配置
+type MultipleGraphConfig struct {
+	MultipleGraphConfigID uint32    `gorm:"primaryKey;column:multiple_graph_config_id;type:int(9) unsigned;not null" json:"-"`          // 多图的配置id
+	EdbInfoIDA            int       `gorm:"column:edb_info_id_a;type:int(9);default:null;default:0" json:"edbInfoIdA"`                  // 指标A
+	EdbInfoIDB            int       `gorm:"column:edb_info_id_b;type:int(9);default:null;default:0" json:"edbInfoIdB"`                  // 指标B
+	Curve                 string    `gorm:"column:curve;type:text;default:null" json:"curve"`                                           // 曲线图配置
+	Correlation           string    `gorm:"column:correlation;type:text;default:null" json:"correlation"`                               // 相关性配置
+	RollingCorrelation    string    `gorm:"column:rolling_correlation;type:text;default:null" json:"rollingCorrelation"`                // 滚动相关性配置
+	SysUserID             int       `gorm:"column:sys_user_id;type:int(9);default:null;default:0" json:"sysUserId"`                     // 操作人id
+	SysUserRealName       string    `gorm:"column:sys_user_real_name;type:varchar(64);default:null;default:''" json:"sysUserRealName"`  // 操作人真实姓名
+	ModifyTime            time.Time `gorm:"column:modify_time;type:timestamp;default:null;default:CURRENT_TIMESTAMP" json:"modifyTime"` // 最近一次修改时间
+	CreateTime            time.Time `gorm:"column:create_time;type:datetime;default:null" json:"createTime"`                            // 添加时间
+}
+
+// TableName get sql table name.获取数据库表名
+func (m *MultipleGraphConfig) TableName() string {
+	return "multiple_graph_config"
+}
+
+// MultipleGraphConfigColumns get sql column name.获取数据库列名
+var MultipleGraphConfigColumns = struct {
+	MultipleGraphConfigID string
+	EdbInfoIDA            string
+	EdbInfoIDB            string
+	Curve                 string
+	Correlation           string
+	RollingCorrelation    string
+	SysUserID             string
+	SysUserRealName       string
+	ModifyTime            string
+	CreateTime            string
+}{
+	MultipleGraphConfigID: "multiple_graph_config_id",
+	EdbInfoIDA:            "edb_info_id_a",
+	EdbInfoIDB:            "edb_info_id_b",
+	Curve:                 "curve",
+	Correlation:           "correlation",
+	RollingCorrelation:    "rolling_correlation",
+	SysUserID:             "sys_user_id",
+	SysUserRealName:       "sys_user_real_name",
+	ModifyTime:            "modify_time",
+	CreateTime:            "create_time",
+}

+ 37 - 0
models/tables/multiple_graph_config_chart_mapping/entity.go

@@ -0,0 +1,37 @@
+package multiple_graph_config_chart_mapping
+
+import (
+	"time"
+)
+
+// MultipleGraphConfigChartMapping 图表与多图配置的关系表
+type MultipleGraphConfigChartMapping struct {
+	ID                    uint32    `gorm:"primaryKey;column:id;type:int(9) unsigned;not null" json:"-"`
+	MultipleGraphConfigID int       `gorm:"uniqueIndex:idx_confid_source;column:multiple_graph_config_id;type:int(9);default:null;default:0" json:"multipleGraphConfigId"` // 多图配置id
+	ChartInfoID           int       `gorm:"unique;column:chart_info_id;type:int(9);default:null;default:0" json:"chartInfoId"`                                             // 图表id
+	Source                int8      `gorm:"uniqueIndex:idx_confid_source;column:source;type:tinyint(9);default:null" json:"source"`                                        // 来源,1:曲线图,2:相关性图;3:滚动相关性图1;4:滚动相关性图2;
+	ModifyTime            time.Time `gorm:"column:modify_time;type:timestamp;default:null;default:CURRENT_TIMESTAMP" json:"modifyTime"`                                    // 最后一次修改时间
+	CreateTime            time.Time `gorm:"column:create_time;type:datetime;default:null" json:"createTime"`                                                               // 关系建立时间
+}
+
+// TableName get sql table name.获取数据库表名
+func (m *MultipleGraphConfigChartMapping) TableName() string {
+	return "multiple_graph_config_chart_mapping"
+}
+
+// MultipleGraphConfigChartMappingColumns get sql column name.获取数据库列名
+var MultipleGraphConfigChartMappingColumns = struct {
+	ID                    string
+	MultipleGraphConfigID string
+	ChartInfoID           string
+	Source                string
+	ModifyTime            string
+	CreateTime            string
+}{
+	ID:                    "id",
+	MultipleGraphConfigID: "multiple_graph_config_id",
+	ChartInfoID:           "chart_info_id",
+	Source:                "source",
+	ModifyTime:            "modify_time",
+	CreateTime:            "create_time",
+}

+ 19 - 0
models/tables/multiple_graph_config_chart_mapping/query.go

@@ -0,0 +1,19 @@
+package multiple_graph_config_chart_mapping
+
+import (
+	"hongze/hongze_yb/global"
+)
+
+// GetMultipleGraphConfigChartMappingByChartId 根据图表id和来源获取关联关系
+func GetMultipleGraphConfigChartMappingByChartId(chartId int) (item *MultipleGraphConfigChartMapping, err error) {
+	err = global.MYSQL["data"].Model(MultipleGraphConfigChartMapping{}).Where("chart_info_id = ?", chartId).First(&item).Error
+
+	return
+}
+
+// GetMultipleGraphConfigChartMappingByIdAndSource 根据配置id和来源获取关联关系
+func GetMultipleGraphConfigChartMappingByIdAndSource(configId, source int) (item *MultipleGraphConfigChartMapping, err error) {
+	err = global.MYSQL["data"].Model(MultipleGraphConfigChartMapping{}).Where("multiple_graph_config_id = ? AND source = ?", configId, source).First(&item).Error
+
+	return
+}

+ 162 - 18
services/chart/correlation/chart_info.go

@@ -211,38 +211,85 @@ func GetChartDataByEdbInfo(edbInfoMappingA, edbInfoMappingB *chart_edb_mapping.C
 		}
 	}
 
-	// 2023-03-02 时间序列始终以指标B为基准, 始终是A进行平移
-	baseEdbInfo := edbInfoMappingB
-	changeEdbInfo := edbInfoMappingA
+	//// 2023-03-02 时间序列始终以指标B为基准, 始终是A进行平移
+	//baseEdbInfo := edbInfoMappingB
+	//changeEdbInfo := edbInfoMappingA
+	// 2023-03-17 时间序列始终以指标A为基准, 始终是B进行平移
+	baseEdbInfo := edbInfoMappingA
+	changeEdbInfo := edbInfoMappingB
 
 	// 获取时间基准指标在时间区间内的值
-	baseDataList := make([]*edb_data.EdbDataList, 0)
+	aDataList := make([]*edb_data.EdbDataList, 0)
 	switch baseEdbInfo.EdbInfoCategoryType {
 	case 0:
-		baseDataList, err = edb_data.GetEdbDataList(baseEdbInfo.Source, baseEdbInfo.EdbInfoId, startDate, endDate)
+		aDataList, err = edb_data.GetEdbDataList(baseEdbInfo.Source, baseEdbInfo.EdbInfoId, startDate, endDate)
 	case 1:
-		_, baseDataList, _, _, err, _ = chart.GetPredictDataListByPredictEdbInfoId(baseEdbInfo.EdbInfoId, startDate, endDate, false)
+		_, aDataList, _, _, err, _ = chart.GetPredictDataListByPredictEdbInfoId(baseEdbInfo.EdbInfoId, startDate, endDate, false)
 	default:
 		err = errors.New("指标base类型异常")
 		return
 	}
 
 	// 获取变频指标所有日期的值, 插值法完善数据
-	changeDataList := make([]*edb_data.EdbDataList, 0)
+	bDataList := make([]*edb_data.EdbDataList, 0)
 	switch changeEdbInfo.EdbInfoCategoryType {
 	case 0:
-		changeDataList, err = edb_data.GetEdbDataList(changeEdbInfo.Source, changeEdbInfo.EdbInfoId, "", "")
+		bDataList, err = edb_data.GetEdbDataList(changeEdbInfo.Source, changeEdbInfo.EdbInfoId, "", "")
 	case 1:
-		_, changeDataList, _, _, err, _ = chart.GetPredictDataListByPredictEdbInfoId(changeEdbInfo.EdbInfoId, "", "", false)
+		_, bDataList, _, _, err, _ = chart.GetPredictDataListByPredictEdbInfoId(changeEdbInfo.EdbInfoId, "", "", false)
 	default:
 		err = errors.New("指标change类型异常")
 		return
 	}
+	//changeDataMap := make(map[string]float64)
+	//newChangeDataList, e := HandleDataByLinearRegression(bDataList, changeDataMap)
+	//if e != nil {
+	//	err = fmt.Errorf("获取变频指标插值法Map失败, Err: %s", e.Error())
+	//	return
+	//}
+
+	// 2023-03-17 时间序列始终以指标A为基准, 始终是B进行平移
+	baseDataList := make([]*edb_data.EdbDataList, 0)
+	changeDataList := make([]*edb_data.EdbDataList, 0)
 	changeDataMap := make(map[string]float64)
-	newChangeDataList, e := HandleDataByLinearRegression(changeDataList, changeDataMap)
-	if e != nil {
-		err = fmt.Errorf("获取变频指标插值法Map失败, Err: %s", e.Error())
-		return
+
+	// 先把低频指标升频为高频
+	{
+		frequencyIntMap := map[string]int{
+			"日度": 1,
+			"周度": 2,
+			"旬度": 3,
+			"月度": 4,
+			"季度": 5,
+			"年度": 6,
+		}
+
+		// 如果A指标是高频,那么就需要对B指标进行升频
+		if frequencyIntMap[edbInfoMappingA.Frequency] < frequencyIntMap[edbInfoMappingB.Frequency] {
+			aDataMap := make(map[string]float64)
+			tmpNewChangeDataList, e := HandleDataByLinearRegression(aDataList, aDataMap)
+			if e != nil {
+				err = fmt.Errorf("获取变频指标插值法Map失败, Err: %s", e.Error())
+				return
+			}
+			baseDataList = tmpNewChangeDataList
+		} else {
+			baseDataList = aDataList
+		}
+		// 如果B指标是高频,那么就需要对A指标进行升频
+		if frequencyIntMap[edbInfoMappingA.Frequency] > frequencyIntMap[edbInfoMappingB.Frequency] {
+			tmpNewChangeDataList, e := HandleDataByLinearRegression(bDataList, changeDataMap)
+			if e != nil {
+				err = fmt.Errorf("获取变频指标插值法Map失败, Err: %s", e.Error())
+				return
+			}
+			changeDataList = tmpNewChangeDataList
+		} else {
+			changeDataList = bDataList
+			for _, v := range baseDataList {
+				changeDataMap[v.DataTime] = v.Value
+			}
+		}
 	}
 
 	// 计算不领先也不滞后时的相关系数
@@ -268,10 +315,7 @@ func GetChartDataByEdbInfo(edbInfoMappingA, edbInfoMappingB *chart_edb_mapping.C
 	// 计算领先/滞后N期
 	if leadValue > 0 {
 		// 平移变频指标领先/滞后的日期(单位天)
-		frequencyDaysMap := map[string]float64{
-			"天": 1, "周": 7, "月": 30, "季": 90, "年": 365,
-		}
-		moveUnitDays := frequencyDaysMap[leadUnit]
+		moveUnitDays := utils.FrequencyDaysMap[leadUnit]
 
 		for i := range xData {
 			if xData[i] == 0 {
@@ -282,7 +326,7 @@ func GetChartDataByEdbInfo(edbInfoMappingA, edbInfoMappingB *chart_edb_mapping.C
 
 			// 平移指定天数
 			mDays := int(moveUnitDays) * xData[i]
-			_, dMap := MoveDataDaysToNewDataList(newChangeDataList, mDays)
+			_, dMap := MoveDataDaysToNewDataList(changeDataList, mDays)
 
 			// 取出对应的基准日期的值
 			for i2 := range baseDataTimeArr {
@@ -309,6 +353,106 @@ func GetChartDataByEdbInfo(edbInfoMappingA, edbInfoMappingB *chart_edb_mapping.C
 	return
 }
 
+// GetRollingCorrelationChartDataByEdbInfo 滚动相关性计算
+func GetRollingCorrelationChartDataByEdbInfo(edbInfoMappingA, edbInfoMappingB *chart_edb_mapping.ChartEdbInfoMapping, leadValue int, leadUnit string, calculateValue int, calculateUnit string, startDate, endDate string) (xDateTimeValue []string, yDataList []chart_info.YData, err error) {
+	xDateTimeValue = make([]string, 0)
+	yData := make([]float64, 0)
+
+	baseEdbInfo := edbInfoMappingA
+	changeEdbInfo := edbInfoMappingB
+
+	// 获取时间基准指标在时间区间内的值
+	aDataList := make([]*edb_data.EdbDataList, 0)
+	switch baseEdbInfo.EdbInfoCategoryType {
+	case 0:
+		aDataList, err = edb_data.GetEdbDataList(baseEdbInfo.Source, baseEdbInfo.EdbInfoId, startDate, endDate)
+	case 1:
+		_, aDataList, _, _, err, _ = chart.GetPredictDataListByPredictEdbInfoId(baseEdbInfo.EdbInfoId, startDate, endDate, false)
+	default:
+		err = errors.New("指标base类型异常")
+		return
+	}
+
+	// 获取变频指标所有日期的值, 插值法完善数据
+	bDataList := make([]*edb_data.EdbDataList, 0)
+	switch changeEdbInfo.EdbInfoCategoryType {
+	case 0:
+		bDataList, err = edb_data.GetEdbDataList(changeEdbInfo.Source, changeEdbInfo.EdbInfoId, "", "")
+	case 1:
+		_, bDataList, _, _, err, _ = chart.GetPredictDataListByPredictEdbInfoId(changeEdbInfo.EdbInfoId, "", "", false)
+	default:
+		err = errors.New("指标change类型异常")
+		return
+	}
+
+	// 数据平移变频指标领先/滞后的日期(单位天)
+	// 2023-03-17 时间序列始终以指标A为基准, 始终是B进行平移
+	//baseDataList := make([]*edb_data.EdbDataList, 0)
+	baseDataMap := make(map[string]float64)
+	changeDataList := make([]*edb_data.EdbDataList, 0)
+	changeDataMap := make(map[string]float64)
+
+	// A指标不管三七二十一,先变个频再说
+	{
+		_, e := HandleDataByLinearRegression(aDataList, baseDataMap)
+		if e != nil {
+			err = fmt.Errorf("获取变频指标插值法Map失败, Err: %s", e.Error())
+			return
+		}
+		//baseDataList = tmpNewChangeDataList
+	}
+	// A指标不管三七二十一,先变个频再说
+	{
+		tmpNewChangeDataList, e := HandleDataByLinearRegression(bDataList, changeDataMap)
+		if e != nil {
+			err = fmt.Errorf("获取变频指标插值法Map失败, Err: %s", e.Error())
+			return
+		}
+		changeDataList = tmpNewChangeDataList
+
+		// 平移下日期
+		moveUnitDays := utils.FrequencyDaysMap[leadUnit]
+		_, changeDataMap = MoveDataDaysToNewDataList(changeDataList, leadValue*moveUnitDays)
+	}
+
+	// 计算计算时,需要多少个日期内数据
+	calculateDay := utils.FrequencyDaysMap[calculateUnit] * calculateValue
+
+	// 计算 每个日期的相关性值
+	{
+		startDateTime, _ := time.ParseInLocation(utils.FormatDate, startDate, time.Local)
+		endDateTime, _ := time.ParseInLocation(utils.FormatDate, endDate, time.Local)
+
+		for currDay := startDateTime; !currDay.After(endDateTime); currDay = currDay.AddDate(0, 0, 1) {
+			yCalculateData := make([]float64, 0)
+			baseCalculateData := make([]float64, 0)
+
+			// 取出对应的基准日期的值
+			for i := 0; i < calculateDay; i++ {
+				iDay := currDay.AddDate(0, 0, i).Format(utils.FormatDate)
+				baseCalculateData = append(baseCalculateData, baseDataMap[iDay])
+				yCalculateData = append(yCalculateData, changeDataMap[iDay])
+			}
+
+			// 公式计算出领先/滞后频度对应点的相关性系数
+			var ratio float64
+			if len(baseCalculateData) > 0 {
+				ratio = utils.CalculateCorrelationByIntArr(baseCalculateData, yCalculateData)
+			}
+			yData = append(yData, ratio)
+			xDateTimeValue = append(xDateTimeValue, currDay.AddDate(0, 0, calculateDay).Format(utils.FormatDate))
+		}
+	}
+
+	yDataList = make([]chart_info.YData, 0)
+	yDate := "0000-00-00"
+	yDataList = append(yDataList, chart_info.YData{
+		Date:  yDate,
+		Value: yData,
+	})
+	return
+}
+
 // ChartInfoRefresh 图表刷新
 func ChartInfoRefresh(chartInfoId int) (err error) {
 	var errMsg string

+ 16 - 3
utils/constants.go

@@ -246,7 +246,20 @@ const ALIYUN_OSS_HOST = "https://hzstatic.hzinsights.com"
 
 // 图表类型
 const (
-	CHART_SOURCE_DEFAULT     = 1
-	CHART_SOURCE_FUTURE_GOOD = 2
-	CHART_SOURCE_CORRELATION = 3 // 相关性图表
+	CHART_SOURCE_DEFAULT             = 1
+	CHART_SOURCE_FUTURE_GOOD         = 2
+	CHART_SOURCE_CORRELATION         = 3 // 相关性图表
+	CHART_SOURCE_ROLLING_CORRELATION = 4 // 滚动相关性图表
 )
+
+// 图表样式类型
+const (
+	CHART_TYPE_CURVE           = 1  //曲线图
+	CHART_TYPE_BAR             = 7  //柱形图
+	CHART_TYPE_SECTION_SCATTER = 10 //截面散点图样式
+)
+
+// FrequencyDaysMap 频度日期的map关系
+var FrequencyDaysMap = map[string]int{
+	"天": 1, "周": 7, "月": 30, "季": 90, "年": 365,
+}