chart_correlation.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. package logic
  2. import (
  3. "eta_gn/eta_index_lib/models"
  4. "eta_gn/eta_index_lib/utils"
  5. "fmt"
  6. )
  7. func CalculateCorrelation(leadValue int, leadUnit, frequencyA, frequencyB string, dataListA, dataListB []*models.EdbInfoSearchData) (xEdbIdValue []int, yDataList []YData, err error) {
  8. xData := make([]int, 0)
  9. yData := make([]float64, 0)
  10. if leadValue == 0 {
  11. xData = append(xData, 0)
  12. }
  13. if leadValue > 0 {
  14. leadMin := 0 - leadValue
  15. xLen := 2*leadValue + 1
  16. for i := 0; i < xLen; i++ {
  17. n := leadMin + i
  18. xData = append(xData, n)
  19. }
  20. }
  21. baseDataList := make([]*models.EdbInfoSearchData, 0)
  22. baseDataMap := make(map[string]float64)
  23. changeDataList := make([]*models.EdbInfoSearchData, 0)
  24. changeDataMap := make(map[string]float64)
  25. {
  26. frequencyIntMap := map[string]int{
  27. "日度": 1,
  28. "周度": 2,
  29. "旬度": 3,
  30. "月度": 4,
  31. "季度": 5,
  32. "年度": 6,
  33. }
  34. if frequencyIntMap[frequencyA] < frequencyIntMap[frequencyB] {
  35. tmpNewChangeDataList, e := models.HandleDataByLinearRegression(dataListB, changeDataMap)
  36. if e != nil {
  37. err = fmt.Errorf("获取变频指标插值法Map失败, Err: %s", e.Error())
  38. return
  39. }
  40. changeDataList = tmpNewChangeDataList
  41. baseDataList = dataListA
  42. for _, v := range baseDataList {
  43. baseDataMap[v.DataTime] = v.Value
  44. }
  45. } else if frequencyIntMap[frequencyA] > frequencyIntMap[frequencyB] {
  46. tmpNewChangeDataList, e := models.HandleDataByLinearRegression(dataListA, baseDataMap)
  47. if e != nil {
  48. err = fmt.Errorf("获取变频指标插值法Map失败, Err: %s", e.Error())
  49. return
  50. }
  51. baseDataList = tmpNewChangeDataList
  52. changeDataList = dataListB
  53. for _, v := range changeDataList {
  54. changeDataMap[v.DataTime] = v.Value
  55. }
  56. } else {
  57. baseDataList = dataListA
  58. for _, v := range baseDataList {
  59. baseDataMap[v.DataTime] = v.Value
  60. }
  61. changeDataList = dataListB
  62. for _, v := range changeDataList {
  63. changeDataMap[v.DataTime] = v.Value
  64. }
  65. }
  66. }
  67. baseCalculateData := make([]float64, 0)
  68. baseDataTimeArr := make([]string, 0)
  69. for i := range baseDataList {
  70. baseDataTimeArr = append(baseDataTimeArr, baseDataList[i].DataTime)
  71. baseCalculateData = append(baseCalculateData, baseDataList[i].Value)
  72. }
  73. if leadValue > 0 {
  74. moveUnitDays := utils.FrequencyDaysMap[leadUnit]
  75. for i := range xData {
  76. xCalculateData := make([]float64, 0)
  77. yCalculateData := make([]float64, 0)
  78. mDays := int(moveUnitDays) * xData[i]
  79. _, dMap := models.MoveDataDaysToNewDataList(changeDataList, mDays)
  80. for i2 := range baseDataTimeArr {
  81. tmpDate := baseDataTimeArr[i2]
  82. if yVal, ok := dMap[tmpDate]; ok {
  83. xCalculateData = append(xCalculateData, baseCalculateData[i2])
  84. yCalculateData = append(yCalculateData, yVal)
  85. }
  86. }
  87. if len(yCalculateData) <= 0 {
  88. continue
  89. }
  90. ratio := utils.CalculateCorrelationByIntArr(xCalculateData, yCalculateData)
  91. yData = append(yData, ratio)
  92. }
  93. }
  94. xEdbIdValue = xData
  95. yDataList = make([]YData, 0)
  96. yDate := "0000-00-00"
  97. yDataList = append(yDataList, YData{
  98. Date: yDate,
  99. Value: yData,
  100. })
  101. return
  102. }