handle_data.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package data
  2. import (
  3. "errors"
  4. "eta_gn/eta_chart_lib/models"
  5. "eta_gn/eta_chart_lib/utils"
  6. "github.com/shopspring/decimal"
  7. "math"
  8. "time"
  9. )
  10. func HandleDataByLinearRegression(edbInfoDataList []*models.EdbDataList, handleDataMap map[string]float64) (err error) {
  11. if len(edbInfoDataList) < 2 {
  12. return
  13. }
  14. var startEdbInfoData *models.EdbDataList
  15. for _, v := range edbInfoDataList {
  16. handleDataMap[v.DataTime] = v.Value
  17. if startEdbInfoData == nil {
  18. startEdbInfoData = v
  19. continue
  20. }
  21. startDataTime, _ := time.ParseInLocation(utils.FormatDate, startEdbInfoData.DataTime, time.Local)
  22. currDataTime, _ := time.ParseInLocation(utils.FormatDate, v.DataTime, time.Local)
  23. betweenHour := int(currDataTime.Sub(startDataTime).Hours())
  24. betweenDay := betweenHour / 24
  25. if betweenDay <= 1 {
  26. startEdbInfoData = v
  27. continue
  28. }
  29. var a, b float64
  30. {
  31. coordinateData := make([]utils.Coordinate, 0)
  32. tmpCoordinate1 := utils.Coordinate{
  33. X: 1,
  34. Y: startEdbInfoData.Value,
  35. }
  36. coordinateData = append(coordinateData, tmpCoordinate1)
  37. tmpCoordinate2 := utils.Coordinate{
  38. X: float64(betweenDay) + 1,
  39. Y: v.Value,
  40. }
  41. coordinateData = append(coordinateData, tmpCoordinate2)
  42. a, b = utils.GetLinearResult(coordinateData)
  43. if math.IsNaN(a) || math.IsNaN(b) {
  44. err = errors.New("线性方程公式生成失败")
  45. return
  46. }
  47. }
  48. {
  49. for i := 1; i < betweenDay; i++ {
  50. tmpDataTime := startDataTime.AddDate(0, 0, i)
  51. aDecimal := decimal.NewFromFloat(a)
  52. xDecimal := decimal.NewFromInt(int64(i) + 1)
  53. bDecimal := decimal.NewFromFloat(b)
  54. val, _ := aDecimal.Mul(xDecimal).Add(bDecimal).Round(4).Float64()
  55. handleDataMap[tmpDataTime.Format(utils.FormatDate)] = val
  56. }
  57. }
  58. startEdbInfoData = v
  59. }
  60. return
  61. }