123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212 |
- package correlation
- import (
- "fmt"
- "github.com/shopspring/decimal"
- "hongze/hongze_ETA_mobile_api/models/data_manage"
- "hongze/hongze_ETA_mobile_api/services/data"
- "hongze/hongze_ETA_mobile_api/utils"
- "math"
- "time"
- )
- // HandleDataByLinearRegression 线性方程插值法补全数据
- func HandleDataByLinearRegression(originList []*data_manage.EdbDataList, handleDataMap map[string]float64) (newList []*data_manage.EdbDataList, err error) {
- if len(originList) < 2 {
- return
- }
- var startEdbInfoData *data_manage.EdbDataList
- for _, v := range originList {
- handleDataMap[v.DataTime] = v.Value
- // 第一个数据就给过滤了,给后面的试用
- if startEdbInfoData == nil {
- startEdbInfoData = v
- newList = append(newList, &data_manage.EdbDataList{
- DataTime: v.DataTime,
- Value: v.Value,
- })
- continue
- }
- // 获取两条数据之间相差的天数
- startDataTime, _ := time.ParseInLocation(utils.FormatDate, startEdbInfoData.DataTime, time.Local)
- currDataTime, _ := time.ParseInLocation(utils.FormatDate, v.DataTime, time.Local)
- betweenHour := int(currDataTime.Sub(startDataTime).Hours())
- betweenDay := betweenHour / 24
- // 如果相差一天,那么过滤
- if betweenDay <= 1 {
- startEdbInfoData = v
- newList = append(newList, &data_manage.EdbDataList{
- DataTime: v.DataTime,
- Value: v.Value,
- })
- continue
- }
- // 生成线性方程式
- var a, b float64
- {
- coordinateData := make([]utils.Coordinate, 0)
- tmpCoordinate1 := utils.Coordinate{
- X: 1,
- Y: startEdbInfoData.Value,
- }
- coordinateData = append(coordinateData, tmpCoordinate1)
- tmpCoordinate2 := utils.Coordinate{
- X: float64(betweenDay) + 1,
- Y: v.Value,
- }
- coordinateData = append(coordinateData, tmpCoordinate2)
- a, b = utils.GetLinearResult(coordinateData)
- if math.IsNaN(a) || math.IsNaN(b) {
- err = fmt.Errorf("线性方程公式生成失败")
- return
- }
- }
- // 生成对应的值
- {
- for i := 1; i < betweenDay; i++ {
- tmpDataTime := startDataTime.AddDate(0, 0, i)
- aDecimal := decimal.NewFromFloat(a)
- xDecimal := decimal.NewFromInt(int64(i) + 1)
- bDecimal := decimal.NewFromFloat(b)
- val, _ := aDecimal.Mul(xDecimal).Add(bDecimal).Round(4).Float64()
- handleDataMap[tmpDataTime.Format(utils.FormatDate)] = val
- newList = append(newList, &data_manage.EdbDataList{
- DataTime: tmpDataTime.Format(utils.FormatDate),
- Value: val,
- })
- }
- }
- startEdbInfoData = v
- }
- return
- }
- // MoveDataDaysToNewDataList 平移指标数据生成新的数据序列
- func MoveDataDaysToNewDataList(dataList []*data_manage.EdbDataList, moveDay int) (newDataList []data_manage.EdbDataList, dateDataMap map[string]float64) {
- dateMap := make(map[time.Time]float64)
- var minDate, maxDate time.Time
- dateDataMap = make(map[string]float64)
- for _, v := range dataList {
- currDate, _ := time.ParseInLocation(utils.FormatDate, v.DataTime, time.Local)
- if minDate.IsZero() || currDate.Before(minDate) {
- minDate = currDate
- }
- if maxDate.IsZero() || currDate.After(maxDate) {
- maxDate = currDate
- }
- dateMap[currDate] = v.Value
- }
- // 处理领先、滞后数据
- newDateMap := make(map[time.Time]float64)
- for currDate, value := range dateMap {
- newDate := currDate.AddDate(0, 0, moveDay)
- newDateMap[newDate] = value
- }
- minDate = minDate.AddDate(0, 0, moveDay)
- maxDate = maxDate.AddDate(0, 0, moveDay)
- // 获取日期相差日
- dayNum := utils.GetTimeSubDay(minDate, maxDate)
- for i := 0; i <= dayNum; i++ {
- currDate := minDate.AddDate(0, 0, i)
- tmpValue, ok := newDateMap[currDate]
- if !ok {
- //找不到数据,那么就用前面的数据吧
- if len(newDataList)-1 < 0 {
- tmpValue = 0
- } else {
- tmpValue = newDataList[len(newDataList)-1].Value
- }
- }
- tmpData := data_manage.EdbDataList{
- DataTime: currDate.Format(utils.FormatDate),
- Value: tmpValue,
- }
- dateDataMap[tmpData.DataTime] = tmpData.Value
- newDataList = append(newDataList, tmpData)
- }
- return
- }
- // GetChartEdbInfoFormat 相关性图表-获取指标信息
- func GetChartEdbInfoFormat(chartInfoId int, edbInfoMappingA, edbInfoMappingB *data_manage.ChartEdbInfoMapping) (edbList []*data_manage.ChartEdbInfoMapping, err error) {
- edbList = make([]*data_manage.ChartEdbInfoMapping, 0)
- if edbInfoMappingA == nil || edbInfoMappingB == nil {
- err = fmt.Errorf("指标信息有误")
- return
- }
- edbInfoMappingA.FrequencyEn = data.GetFrequencyEn(edbInfoMappingA.Frequency)
- if edbInfoMappingA.Unit == `无` {
- edbInfoMappingA.Unit = ``
- }
- if edbInfoMappingB.Unit == `无` {
- edbInfoMappingB.Unit = ``
- }
- if chartInfoId <= 0 {
- edbInfoMappingA.IsAxis = 1
- edbInfoMappingA.LeadValue = 0
- edbInfoMappingA.LeadUnit = ""
- edbInfoMappingA.ChartEdbMappingId = 0
- edbInfoMappingA.ChartInfoId = 0
- edbInfoMappingA.IsOrder = false
- edbInfoMappingA.EdbInfoType = 1
- edbInfoMappingA.ChartStyle = ""
- edbInfoMappingA.ChartColor = ""
- edbInfoMappingA.ChartWidth = 0
- edbInfoMappingB.IsAxis = 1
- edbInfoMappingB.LeadValue = 0
- edbInfoMappingB.LeadUnit = ""
- edbInfoMappingB.ChartEdbMappingId = 0
- edbInfoMappingB.ChartInfoId = 0
- edbInfoMappingB.IsOrder = false
- edbInfoMappingB.EdbInfoType = 1
- edbInfoMappingB.ChartStyle = ""
- edbInfoMappingB.ChartColor = ""
- edbInfoMappingB.ChartWidth = 0
- } else {
- edbInfoMappingA.LeadUnitEn = data.GetLeadUnitEn(edbInfoMappingA.LeadUnit)
- edbInfoMappingB.LeadUnitEn = data.GetLeadUnitEn(edbInfoMappingB.LeadUnit)
- }
- edbList = append(edbList, edbInfoMappingA, edbInfoMappingB)
- return
- }
- // GetChartAndCorrelationInfo 获取图表信息和相关信息信息
- func GetChartAndCorrelationInfo(chartInfoId int) (chartInfo *data_manage.ChartInfo, correlationInfo *data_manage.ChartInfoCorrelation, tips string, err error) {
- item, e := data_manage.GetChartInfoById(chartInfoId)
- if e != nil {
- if e.Error() == utils.ErrNoRow() {
- tips = "图表已被删除, 请刷新页面"
- err = fmt.Errorf("图表已被删除, 请刷新页面")
- return
- }
- err = fmt.Errorf("获取图表信息失败, Err: %s", e.Error())
- return
- }
- if item.Source != utils.CHART_SOURCE_CORRELATION {
- tips = "该图不是相关性图表"
- err = fmt.Errorf("该图不是相关性图表")
- return
- }
- chartInfo = item
- correlationInfo = new(data_manage.ChartInfoCorrelation)
- if e = correlationInfo.GetItemById(chartInfo.ChartInfoId); e != nil {
- err = fmt.Errorf("获取图表相关性信息失败, Err: %s", e.Error())
- return
- }
- return
- }
|