ziwen 1 year ago
parent
commit
8b7085c3c0

+ 1 - 1
controllers/data_manage/chart_common.go

@@ -92,7 +92,7 @@ func (this *ChartInfoController) CommonChartInfoDetailFromUniqueCode() {
 		br.Success = true
 		br.Msg = "获取成功"
 		br.Data = resp
-	case utils.CHART_SOURCE_CORRELATION:
+	case utils.CHART_SOURCE_CORRELATION, utils.CHART_SOURCE_ROLLING_CORRELATION:
 		resp, isOk, msg, errMsg := correlation.GetChartInfoDetailFromUniqueCode(chartInfo, isCache, sysUser)
 		if !isOk {
 			br.Msg = msg

+ 70 - 40
controllers/data_manage/correlation/correlation_chart_info.go

@@ -9,7 +9,6 @@ import (
 	"hongze/hongze_ETA_mobile_api/services/data"
 	correlationServ "hongze/hongze_ETA_mobile_api/services/data/correlation"
 	"hongze/hongze_ETA_mobile_api/utils"
-	"strings"
 	"time"
 )
 
@@ -64,19 +63,6 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 
 	chartInfoId := chartInfo.ChartInfoId
 
-	startDate := chartInfo.StartDate
-	endDate := chartInfo.EndDate
-
-	// 兼容日期错误
-	{
-		if strings.Count(startDate, "-") == 1 {
-			startDate = startDate + "-01"
-		}
-		if strings.Count(endDate, "-") == 1 {
-			endDate = endDate + "-01"
-		}
-	}
-
 	// 相关性图表信息
 	correlationChart := new(data_manage.ChartInfoCorrelation)
 	if e := correlationChart.GetItemById(chartInfoId); e != nil {
@@ -84,24 +70,6 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 		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 := data_manage.GetChartEdbMappingByEdbInfoId(correlationChart.EdbInfoIdFirst)
@@ -117,13 +85,60 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 		return
 	}
 
-	xEdbIdValue := xData
-	yDataList := make([]data_manage.YData, 0)
-	yDate := "0000-00-00"
-	yDataList = append(yDataList, data_manage.YData{
-		Date:  yDate,
-		Value: yData,
-	})
+	var dataResp interface{} // 绘图数据返回(目前是滚动相关性的图)
+	var xEdbIdValue []int
+	var xDateTimeValue []string
+	var yDataList []data_manage.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 = correlationServ.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 := data_manage.GetMultipleGraphConfigChartMappingByChartId(chartInfo.ChartInfoId)
+		if e != nil {
+			msg = "获取失败"
+			errMsg = "获取滚动相关性图表的配置信息失败, Err:" + e.Error()
+			return
+		}
+		baseChartMultipleGraphConfigChartMapping, e := data_manage.GetMultipleGraphConfigChartMappingByIdAndSource(multipleGraphConfigChartMapping.MultipleGraphConfigId, 2)
+		if e != nil {
+			msg = "获取失败"
+			errMsg = "获取相关性图表的配置信息失败, Err:" + e.Error()
+			return
+		}
+		baseChartCorrelationChart := new(data_manage.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 = correlationServ.GetRollingCorrelationChartDataByEdbInfo(edbInfoMappingA, edbInfoMappingB, correlationChart.LeadValue, correlationChart.LeadUnit, correlationChart.CalculateValue, correlationChart.CalculateUnit, startDate, endDate)
+		dataResp = data_manage.RollingCorrelationChartDataResp{
+			XDateTimeValue: xDateTimeValue,
+			YDataList:      yDataList,
+		}
+	}
 
 	// 完善指标信息
 	edbList, e := correlationServ.GetChartEdbInfoFormat(chartInfo.ChartInfoId, edbInfoMappingA, edbInfoMappingB)
@@ -135,6 +150,8 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 	correlationInfo := new(data_manage.CorrelationInfo)
 	correlationInfo.LeadValue = correlationChart.LeadValue
 	correlationInfo.LeadUnit = correlationChart.LeadUnit
+	correlationInfo.CalculateValue = correlationChart.CalculateValue
+	correlationInfo.CalculateUnit = correlationChart.CalculateUnit
 	correlationInfo.StartDate = correlationChart.StartDate.Format(utils.FormatDate)
 	correlationInfo.EndDate = correlationChart.EndDate.Format(utils.FormatDate)
 	correlationInfo.LeadValue = correlationChart.LeadValue
@@ -171,12 +188,25 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 	chartInfo.IsEnChart = data.CheckIsEnChart(chartInfo.ChartNameEn, edbList[0:1], chartInfo.Source, chartInfo.ChartType)
 	chartInfo.UnitEn = edbInfoMappingA.UnitEn
 
+	isSaveAs := true
+	if chartInfo.Source == utils.CHART_SOURCE_ROLLING_CORRELATION {
+		isSaveAs = false
+	}
+	// 另存为
+	chartInfo.Button = data_manage.ChartViewButton{
+		IsEdit:    chartInfo.IsEdit,
+		IsEnChart: chartInfo.IsEnChart,
+		IsAdd:     chartInfo.IsAdd,
+		IsCopy:    isSaveAs,
+		IsSetName: chartInfo.IsSetName,
+	}
+
 	resp.ChartInfo = chartInfo
 	resp.EdbInfoList = edbList
 	resp.XEdbIdValue = xEdbIdValue
 	resp.YDataList = yDataList
 	resp.CorrelationChartInfo = correlationInfo
-	//resp.BarChartInfo = barConfig
+	resp.DataResp = dataResp
 	resp.Status = true
 
 	// 将数据加入缓存

+ 9 - 0
models/data_manage/chart_info.go

@@ -825,6 +825,15 @@ type ChartInfoView struct {
 	Source            int    `description:"1:ETA图库;2:商品价格曲线;3:相关性图表"`
 	//CorrelationLeadUnit string `description:"相关性图表-领先单位"`
 	ExtraConfig string `description:"图表额外配置,json数据"`
+	Button      ChartViewButton `description:"操作按钮"`
+}
+
+type ChartViewButton struct {
+	IsEdit    bool `description:"是否有编辑权限"`
+	IsEnChart bool `description:"是否展示英文标识"`
+	IsAdd     bool `description:"true:已加入我的图库,false:未加入我的图库"`
+	IsCopy    bool `description:"是否有另存为按钮"`
+	IsSetName int  `description:"设置名称"`
 }
 
 type ImageSvgToPngResp struct {

+ 12 - 1
models/data_manage/chart_info_correlation.go

@@ -12,6 +12,8 @@ type ChartInfoCorrelation struct {
 	CorrelationChartInfoId int       `orm:"column(correlation_chart_info_id);pk" description:"相关性图表ID(chart_info表source=3的)"`
 	LeadValue              int       `description:"领先值"`
 	LeadUnit               string    `description:"领先单位"`
+	CalculateValue         int       `description:"计算窗口"`
+	CalculateUnit          string    `description:"计算频度"`
 	StartDate              time.Time `description:"开始日期"`
 	EndDate                time.Time `description:"结束日期"`
 	EdbInfoIdFirst         int       `description:"A指标ID"`
@@ -21,10 +23,11 @@ type ChartInfoCorrelation struct {
 	CreateTime             time.Time `description:"创建时间"`
 	ModifyTime             time.Time `description:"更新时间"`
 }
-
 type CorrelationInfo struct {
 	LeadValue       int    `description:"领先值"`
 	LeadUnit        string `description:"领先单位"`
+	CalculateValue  int    `description:"计算窗口"`
+	CalculateUnit   string `description:"计算频度"`
 	StartDate       string `description:"开始日期"`
 	EndDate         string `description:"结束日期"`
 	EdbInfoIdFirst  int    `description:"A指标ID"`
@@ -33,6 +36,7 @@ type CorrelationInfo struct {
 	CorrelationData string `description:"Y轴-相关性系数"`
 }
 
+
 func (m *ChartInfoCorrelation) TableName() string {
 	return "chart_info_correlation"
 }
@@ -127,3 +131,10 @@ func CreateCorrelationChartAndEdb(chartInfo *ChartInfo, edbMappingList []*ChartE
 	}
 	return
 }
+
+
+// RollingCorrelationChartDataResp 滚动相关性图
+type RollingCorrelationChartDataResp struct {
+	XDateTimeValue []string `description:"滚动相关性图的x轴数据,日期数据"`
+	YDataList      []YData  `description:"滚动相关性图的y轴数据"`
+}

+ 62 - 0
models/data_manage/multiple_graph_config_chart_mapping.go

@@ -0,0 +1,62 @@
+package data_manage
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+// MultipleGraphConfigChartMapping 图表与多图配置的关系表
+type MultipleGraphConfigChartMapping struct {
+	Id                    int       `orm:"column(id);pk"`
+	MultipleGraphConfigId int       `description:"多图配置id"`
+	ChartInfoId           int       `description:"图表id"`
+	Source                int       `description:"来源,1:曲线图,2:相关性图;3:滚动相关性图1;4:滚动相关性图2;"`
+	ModifyTime            time.Time `description:"最近一次修改时间"`
+	CreateTime            time.Time `description:"添加时间"`
+}
+
+// AddMultipleGraphConfigChartMapping 新增多图配置
+func AddMultipleGraphConfigChartMapping(item *MultipleGraphConfigChartMapping) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	// 表格信息入库
+	lastId, err := o.Insert(item)
+	if err != nil {
+		return
+	}
+	item.Id = int(lastId)
+	return
+}
+
+// Update 更新 基础信息
+func (item *MultipleGraphConfigChartMapping) Update(cols []string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Update(item, cols...)
+	return
+}
+
+// GetMultipleGraphConfigChartMappingByIdAndSource 根据配置id和来源获取关联关系
+func GetMultipleGraphConfigChartMappingByIdAndSource(configId, source int) (item *MultipleGraphConfigChartMapping, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM multiple_graph_config_chart_mapping WHERE multiple_graph_config_id = ? AND source = ? `
+	err = o.Raw(sql, configId, source).QueryRow(&item)
+
+	return
+}
+
+// GetMultipleGraphConfigChartMappingByChartId 根据图表id和来源获取关联关系
+func GetMultipleGraphConfigChartMappingByChartId(chartId int) (item *MultipleGraphConfigChartMapping, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM multiple_graph_config_chart_mapping WHERE chart_info_id = ?  `
+	err = o.Raw(sql, chartId).QueryRow(&item)
+
+	return
+}
+
+// GetMultipleGraphConfigChartMappingListById 根据配置id获取所有关联关系
+func GetMultipleGraphConfigChartMappingListById(configId int) (items []*MultipleGraphConfigChartMapping, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM multiple_graph_config_chart_mapping WHERE multiple_graph_config_id = ? `
+	_, err = o.Raw(sql, configId).QueryRows(&items)
+
+	return
+}

+ 291 - 0
services/data/correlation/chart_info.go

@@ -1,6 +1,7 @@
 package correlation
 
 import (
+	"errors"
 	"fmt"
 	"github.com/shopspring/decimal"
 	"hongze/hongze_ETA_mobile_api/models/data_manage"
@@ -210,3 +211,293 @@ func GetChartAndCorrelationInfo(chartInfoId int) (chartInfo *data_manage.ChartIn
 	}
 	return
 }
+
+// GetChartDataByEdbInfo 相关性图表-根据指标信息获取x轴和y轴
+func GetChartDataByEdbInfo(edbInfoMappingA, edbInfoMappingB *data_manage.ChartEdbInfoMapping, leadValue int, leadUnit, startDate, endDate string) (xEdbIdValue []int, yDataList []data_manage.YData, err error) {
+	xData := make([]int, 0)
+	yData := make([]float64, 0)
+	if leadValue == 0 {
+		xData = append(xData, 0)
+	}
+	if leadValue > 0 {
+		leadMin := 0 - leadValue
+		xLen := 2*leadValue + 1
+		for i := 0; i < xLen; i++ {
+			n := leadMin + i
+			xData = append(xData, n)
+		}
+	}
+
+	// 计算窗口,不包含第一天
+	startDateTime, _ := time.ParseInLocation(utils.FormatDate, startDate, time.Local)
+	startDate = startDateTime.AddDate(0, 0, 1).Format(utils.FormatDate)
+
+	//// 2023-03-02 时间序列始终以指标B为基准, 始终是A进行平移
+	//baseEdbInfo := edbInfoMappingB
+	//changeEdbInfo := edbInfoMappingA
+	// 2023-03-17 时间序列始终以指标A为基准, 始终是B进行平移
+	baseEdbInfo := edbInfoMappingA
+	changeEdbInfo := edbInfoMappingB
+
+	// 获取时间基准指标在时间区间内的值
+	aDataList := make([]*data_manage.EdbDataList, 0)
+	switch baseEdbInfo.EdbInfoCategoryType {
+	case 0:
+		aDataList, err = data_manage.GetEdbDataList(baseEdbInfo.Source, baseEdbInfo.EdbInfoId, startDate, endDate)
+	case 1:
+		_, aDataList, _, _, err, _ = data.GetPredictDataListByPredictEdbInfoId(baseEdbInfo.EdbInfoId, startDate, endDate, false)
+	default:
+		err = errors.New("指标base类型异常")
+		return
+	}
+
+	// 获取变频指标所有日期的值, 插值法完善数据
+	bDataList := make([]*data_manage.EdbDataList, 0)
+	switch changeEdbInfo.EdbInfoCategoryType {
+	case 0:
+		bDataList, err = data_manage.GetEdbDataList(changeEdbInfo.Source, changeEdbInfo.EdbInfoId, "", "")
+	case 1:
+		_, bDataList, _, _, err, _ = data.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([]*data_manage.EdbDataList, 0)
+	baseDataMap := make(map[string]float64)
+	changeDataList := make([]*data_manage.EdbDataList, 0)
+	changeDataMap := make(map[string]float64)
+
+	// 先把低频指标升频为高频
+	{
+		frequencyIntMap := map[string]int{
+			"日度": 1,
+			"周度": 2,
+			"旬度": 3,
+			"月度": 4,
+			"季度": 5,
+			"年度": 6,
+		}
+
+		// 如果A指标是高频,那么就需要对B指标进行升频
+		if frequencyIntMap[edbInfoMappingA.Frequency] < frequencyIntMap[edbInfoMappingB.Frequency] {
+			tmpNewChangeDataList, e := HandleDataByLinearRegression(aDataList, baseDataMap)
+			if e != nil {
+				err = fmt.Errorf("获取变频指标插值法Map失败, Err: %s", e.Error())
+				return
+			}
+			baseDataList = tmpNewChangeDataList
+		} else {
+			baseDataList = aDataList
+			for _, v := range baseDataList {
+				baseDataMap[v.DataTime] = v.Value
+			}
+		}
+		// 如果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 changeDataList {
+				changeDataMap[v.DataTime] = v.Value
+			}
+		}
+
+	}
+
+	// 计算不领先也不滞后时的相关系数
+	baseCalculateData := make([]float64, 0)
+	baseDataTimeArr := make([]string, 0)
+	for i := range baseDataList {
+		baseDataTimeArr = append(baseDataTimeArr, baseDataList[i].DataTime)
+		baseCalculateData = append(baseCalculateData, baseDataList[i].Value)
+	}
+
+	zeroBaseData := make([]float64, 0)
+	zeroCalculateData := make([]float64, 0)
+	for i := range baseDataTimeArr {
+		tmpBaseVal, ok1 := baseDataMap[baseDataTimeArr[i]]
+		tmpCalculateVal, ok2 := changeDataMap[baseDataTimeArr[i]]
+		if ok1 && ok2 {
+			zeroBaseData = append(zeroBaseData, tmpBaseVal)
+			zeroCalculateData = append(zeroCalculateData, tmpCalculateVal)
+		}
+	}
+	if len(zeroBaseData) != len(zeroCalculateData) {
+		err = fmt.Errorf("相关系数两组序列元素数不一致, %d-%d", len(baseCalculateData), len(zeroCalculateData))
+		return
+	}
+	zeroRatio := utils.CalculateCorrelationByIntArr(zeroBaseData, zeroCalculateData)
+	if leadValue == 0 {
+		yData = append(yData, zeroRatio)
+	}
+
+	// 计算领先/滞后N期
+	if leadValue > 0 {
+		// 平移变频指标领先/滞后的日期(单位天)
+		moveUnitDays := utils.FrequencyDaysMap[leadUnit]
+
+		for i := range xData {
+			if xData[i] == 0 {
+				yData = append(yData, zeroRatio)
+				continue
+			}
+			xCalculateData := make([]float64, 0)
+			yCalculateData := make([]float64, 0)
+
+			// 平移指定天数
+			mDays := int(moveUnitDays) * xData[i]
+			_, dMap := MoveDataDaysToNewDataList(changeDataList, mDays)
+
+			// 取出对应的基准日期的值
+			for i2 := range baseDataTimeArr {
+				if yVal, ok := dMap[baseDataTimeArr[i2]]; ok {
+					xCalculateData = append(xCalculateData, baseCalculateData[i2])
+					yCalculateData = append(yCalculateData, yVal)
+				}
+			}
+			if len(yCalculateData) <= 0 {
+				//err = fmt.Errorf("领先滞后相关系数两组序列元素数不一致, %d-%d", len(baseCalculateData), len(yCalculateData))
+				//return
+				// 领先滞后后,没有可以计算的数据了
+				continue
+			}
+
+			// 公式计算出领先/滞后频度对应点的相关性系数
+			ratio := utils.CalculateCorrelationByIntArr(xCalculateData, yCalculateData)
+			yData = append(yData, ratio)
+		}
+	}
+
+	xEdbIdValue = xData
+	yDataList = make([]data_manage.YData, 0)
+	yDate := "0000-00-00"
+	yDataList = append(yDataList, data_manage.YData{
+		Date:  yDate,
+		Value: yData,
+	})
+	return
+}
+
+// GetRollingCorrelationChartDataByEdbInfo 滚动相关性计算
+func GetRollingCorrelationChartDataByEdbInfo(edbInfoMappingA, edbInfoMappingB *data_manage.ChartEdbInfoMapping, leadValue int, leadUnit string, calculateValue int, calculateUnit string, startDate, endDate string) (xDateTimeValue []string, yDataList []data_manage.YData, err error) {
+	xDateTimeValue = make([]string, 0)
+	yData := make([]float64, 0)
+
+	// 计算窗口,不包含第一天
+	startDateTime, _ := time.ParseInLocation(utils.FormatDate, startDate, time.Local)
+	startDate = startDateTime.AddDate(0, 0, 1).Format(utils.FormatDate)
+
+	baseEdbInfo := edbInfoMappingA
+	changeEdbInfo := edbInfoMappingB
+
+	// 获取时间基准指标在时间区间内的值
+	aDataList := make([]*data_manage.EdbDataList, 0)
+	switch baseEdbInfo.EdbInfoCategoryType {
+	case 0:
+		aDataList, err = data_manage.GetEdbDataList(baseEdbInfo.Source, baseEdbInfo.EdbInfoId, startDate, endDate)
+	case 1:
+		_, aDataList, _, _, err, _ = data.GetPredictDataListByPredictEdbInfoId(baseEdbInfo.EdbInfoId, startDate, endDate, false)
+	default:
+		err = errors.New("指标base类型异常")
+		return
+	}
+
+	// 获取变频指标所有日期的值, 插值法完善数据
+	bDataList := make([]*data_manage.EdbDataList, 0)
+	switch changeEdbInfo.EdbInfoCategoryType {
+	case 0:
+		bDataList, err = data_manage.GetEdbDataList(changeEdbInfo.Source, changeEdbInfo.EdbInfoId, "", "")
+	case 1:
+		_, bDataList, _, _, err, _ = data.GetPredictDataListByPredictEdbInfoId(changeEdbInfo.EdbInfoId, "", "", false)
+	default:
+		err = errors.New("指标change类型异常")
+		return
+	}
+
+	// 数据平移变频指标领先/滞后的日期(单位天)
+	// 2023-03-17 时间序列始终以指标A为基准, 始终是B进行平移
+	//baseDataList := make([]*data_manage.EdbDataList, 0)
+	baseDataMap := make(map[string]float64)
+	changeDataList := make([]*data_manage.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
+	}
+	// B指标不管三七二十一,先变个频再说
+	{
+		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)
+
+				tmpBaseValue, ok1 := baseDataMap[iDay]
+				tmpChangeValue, ok2 := changeDataMap[iDay]
+				if ok1 && ok2 {
+					baseCalculateData = append(baseCalculateData, tmpBaseValue)
+					yCalculateData = append(yCalculateData, tmpChangeValue)
+				} else {
+					continue
+				}
+			}
+
+			// 公式计算出领先/滞后频度对应点的相关性系数
+			var ratio float64
+			if len(baseCalculateData) > 0 {
+				ratio = utils.CalculateCorrelationByIntArr(baseCalculateData, yCalculateData)
+			}
+			yData = append(yData, ratio)
+			xDateTimeValue = append(xDateTimeValue, currDay.AddDate(0, 0, calculateDay-1).Format(utils.FormatDate))
+		}
+	}
+
+	yDataList = make([]data_manage.YData, 0)
+	yDate := "0000-00-00"
+	yDataList = append(yDataList, data_manage.YData{
+		Date:  yDate,
+		Value: yData,
+	})
+	return
+}

+ 7 - 1
utils/constants.go

@@ -402,6 +402,7 @@ const (
 	CHART_SOURCE_DEFAULT     = 1
 	CHART_SOURCE_FUTURE_GOOD = 2
 	CHART_SOURCE_CORRELATION = 3 // 相关性图表
+	CHART_SOURCE_ROLLING_CORRELATION = 4 // 滚动相关性图表
 )
 
 // 图表样式类型
@@ -418,4 +419,9 @@ const (
 
 const (
 	key = "Y2kBxILL6jTkc80N860qbHc6" //全局加密KEY
-)
+)
+
+// FrequencyDaysMap 频度日期的map关系
+var FrequencyDaysMap = map[string]int{
+	"天": 1, "周": 7, "月": 30, "季": 90, "年": 365,
+}