factor_edb_series.go 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748
  1. package data_manage
  2. import (
  3. "encoding/json"
  4. "eta/eta_api/controllers"
  5. "eta/eta_api/models"
  6. "eta/eta_api/models/data_manage"
  7. "eta/eta_api/models/data_manage/request"
  8. "eta/eta_api/services/data"
  9. correlationServ "eta/eta_api/services/data/correlation"
  10. "eta/eta_api/utils"
  11. "fmt"
  12. "sort"
  13. "strings"
  14. "sync"
  15. "time"
  16. )
  17. // FactorEdbSeriesController 因子指标系列
  18. type FactorEdbSeriesController struct {
  19. controllers.BaseAuthController
  20. }
  21. // CalculateFuncList
  22. // @Title 计算方式列表
  23. // @Description 计算方式列表
  24. // @Param EdbInfoType query int false "指标计算类型: 0-普通指标; 1-预测指标"
  25. // @Success Ret=200 操作成功
  26. // @router /factor_edb_series/calculate_func/list [get]
  27. func (this *FactorEdbSeriesController) CalculateFuncList() {
  28. br := new(models.BaseResponse).Init()
  29. defer func() {
  30. if br.ErrMsg == "" {
  31. br.IsSendEmail = false
  32. }
  33. this.Data["json"] = br
  34. this.ServeJSON()
  35. }()
  36. sysUser := this.SysUser
  37. if sysUser == nil {
  38. br.Msg = "请登录"
  39. br.ErrMsg = "请登录,SysUser Is Empty"
  40. br.Ret = 408
  41. return
  42. }
  43. edbInfoType, _ := this.GetInt("EdbInfoType", 0)
  44. funcOb := new(data_manage.FactorEdbSeriesCalculateFunc)
  45. cond := fmt.Sprintf(` AND %s = ?`, funcOb.Cols().EdbInfoType)
  46. pars := make([]interface{}, 0)
  47. pars = append(pars, edbInfoType)
  48. list, e := funcOb.GetItemsByCondition(cond, pars, []string{}, fmt.Sprintf("%s ASC", funcOb.Cols().PrimaryId))
  49. if e != nil {
  50. br.Msg = "获取失败"
  51. br.ErrMsg = fmt.Sprintf("获取计算方式列表失败, Err: %v", e)
  52. return
  53. }
  54. resp := make([]*data_manage.FactorEdbSeriesCalculateFuncItem, 0)
  55. for _, v := range list {
  56. resp = append(resp, v.Format2Item())
  57. }
  58. br.Data = resp
  59. br.Ret = 200
  60. br.Success = true
  61. br.Msg = "获取成功"
  62. }
  63. // Add
  64. // @Title 新增
  65. // @Description 新增
  66. // @Param request body request.AddFactorEdbSeriesReq true "type json string"
  67. // @Success Ret=200 操作成功
  68. // @router /factor_edb_series/add [post]
  69. func (this *FactorEdbSeriesController) Add() {
  70. br := new(models.BaseResponse).Init()
  71. defer func() {
  72. if br.ErrMsg == "" {
  73. br.IsSendEmail = false
  74. }
  75. this.Data["json"] = br
  76. this.ServeJSON()
  77. }()
  78. sysUser := this.SysUser
  79. if sysUser == nil {
  80. br.Msg = "请登录"
  81. br.ErrMsg = "请登录,SysUser Is Empty"
  82. br.Ret = 408
  83. return
  84. }
  85. var req request.AddFactorEdbSeriesReq
  86. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  87. br.Msg = "参数解析异常"
  88. br.ErrMsg = fmt.Sprintf("参数解析异常, Err: %v", e)
  89. return
  90. }
  91. req.SeriesName = strings.TrimSpace(req.SeriesName)
  92. if req.SeriesName == "" {
  93. br.Msg = "请输入指标系列名称"
  94. return
  95. }
  96. if len(req.EdbInfoIds) <= 0 {
  97. br.Msg = "请选择因子指标系列"
  98. return
  99. }
  100. if len(req.EdbInfoIds) > 100 {
  101. br.Msg = "添加指标总数量不得超过100"
  102. return
  103. }
  104. calculateLen := len(req.Calculates)
  105. if calculateLen > 5 {
  106. br.Msg = "计算公式不可超过5个"
  107. return
  108. }
  109. var calculatesJson string
  110. if calculateLen > 0 {
  111. b, e := json.Marshal(req.Calculates)
  112. if e != nil {
  113. br.Msg = "计算方式格式有误"
  114. br.ErrMsg = "解析计算方式参数失败, Err: " + e.Error()
  115. return
  116. }
  117. calculatesJson = string(b)
  118. for _, v := range req.Calculates {
  119. switch v.Source {
  120. case utils.EdbBaseCalculateNszydpjjs, utils.EdbBaseCalculateHbz, utils.EdbBaseCalculateHcz, utils.EdbBaseCalculateCjjx:
  121. if v.Formula == nil {
  122. br.Msg = "请输入N值"
  123. return
  124. }
  125. formulaInt, ok := v.Formula.(float64)
  126. if !ok {
  127. br.Msg = "N值格式有误"
  128. return
  129. }
  130. if formulaInt <= 0 {
  131. br.Msg = "N值不可小于0, 重新输入"
  132. return
  133. }
  134. case utils.EdbBaseCalculateExponentialSmoothing:
  135. if v.Formula == nil {
  136. br.Msg = "请填写alpha值"
  137. return
  138. }
  139. alpha, ok := v.Formula.(float64)
  140. if ok {
  141. br.Msg = "alpha值格式有误"
  142. return
  143. }
  144. if alpha <= 0 || alpha >= 1 {
  145. br.Msg = "alpha值应在0-1之间, 请重新输入"
  146. return
  147. }
  148. }
  149. }
  150. }
  151. edbArr, e := data_manage.GetEdbInfoByIdList(req.EdbInfoIds)
  152. if e != nil {
  153. br.Msg = "操作失败"
  154. br.ErrMsg = "获取指标列表失败, Err: " + e.Error()
  155. return
  156. }
  157. if len(edbArr) == 0 {
  158. br.Msg = "因子指标系列有误"
  159. br.ErrMsg = "因子指标系列长度为0"
  160. return
  161. }
  162. // 新增指标系列
  163. seriesItem := new(data_manage.FactorEdbSeries)
  164. seriesItem.SeriesName = req.SeriesName
  165. seriesItem.EdbInfoType = req.EdbInfoType
  166. seriesItem.CreateTime = time.Now().Local()
  167. seriesItem.ModifyTime = time.Now().Local()
  168. if calculateLen > 0 {
  169. seriesItem.CalculateState = data_manage.FactorEdbSeriesCalculating
  170. seriesItem.CalculateStep = calculatesJson
  171. }
  172. mappings := make([]*data_manage.FactorEdbSeriesMapping, 0)
  173. for _, v := range edbArr {
  174. mappings = append(mappings, &data_manage.FactorEdbSeriesMapping{
  175. EdbInfoId: v.EdbInfoId,
  176. EdbCode: v.EdbCode,
  177. CreateTime: time.Now().Local(),
  178. ModifyTime: time.Now().Local(),
  179. })
  180. }
  181. seriesId, e := seriesItem.CreateSeriesAndMapping(seriesItem, mappings)
  182. if e != nil {
  183. br.Msg = "操作失败"
  184. br.ErrMsg = "新增因子指标系列失败, Err: " + e.Error()
  185. return
  186. }
  187. // 计算指标数据
  188. var calculateResp data_manage.FactorEdbSeriesStepCalculateResp
  189. if calculateLen > 0 {
  190. calculateResp, e = data.FactorEdbStepCalculate(seriesId, edbArr, req.Calculates, this.Lang, false)
  191. if e != nil {
  192. br.Msg = "操作失败"
  193. br.ErrMsg = "计算因子指标失败, Err: " + e.Error()
  194. return
  195. }
  196. // 更新系列计算状态
  197. cols := []string{seriesItem.Cols().CalculateState, seriesItem.Cols().ModifyTime}
  198. seriesItem.CalculateState = data_manage.FactorEdbSeriesCalculated
  199. seriesItem.ModifyTime = time.Now().Local()
  200. if e = seriesItem.Update(cols); e != nil {
  201. br.Msg = "操作失败"
  202. br.ErrMsg = "更新因子指标系列计算状态失败, Err: " + e.Error()
  203. return
  204. }
  205. } else {
  206. for _, v := range edbArr {
  207. calculateResp.Success = append(calculateResp.Success, data_manage.FactorEdbSeriesStepCalculateResult{
  208. EdbInfoId: v.EdbInfoId,
  209. EdbCode: v.EdbCode,
  210. Msg: "保存成功",
  211. })
  212. }
  213. }
  214. calculateResp.SeriesId = seriesId
  215. br.Data = calculateResp
  216. br.Ret = 200
  217. br.Success = true
  218. br.Msg = "操作成功"
  219. br.IsAddLog = true
  220. }
  221. // Edit
  222. // @Title 编辑
  223. // @Description 编辑
  224. // @Param request body request.EditFactorEdbSeriesReq true "type json string"
  225. // @Success Ret=200 操作成功
  226. // @router /factor_edb_series/edit [post]
  227. func (this *FactorEdbSeriesController) Edit() {
  228. br := new(models.BaseResponse).Init()
  229. defer func() {
  230. if br.ErrMsg == "" {
  231. br.IsSendEmail = false
  232. }
  233. this.Data["json"] = br
  234. this.ServeJSON()
  235. }()
  236. sysUser := this.SysUser
  237. if sysUser == nil {
  238. br.Msg = "请登录"
  239. br.ErrMsg = "请登录,SysUser Is Empty"
  240. br.Ret = 408
  241. return
  242. }
  243. var req request.EditFactorEdbSeriesReq
  244. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  245. br.Msg = "参数解析异常"
  246. br.ErrMsg = fmt.Sprintf("参数解析异常, Err: %v", e)
  247. return
  248. }
  249. if req.SeriesId <= 0 {
  250. br.Msg = "参数有误"
  251. br.ErrMsg = fmt.Sprintf("参数有误, SeriesId: %d", req.SeriesId)
  252. return
  253. }
  254. req.SeriesName = strings.TrimSpace(req.SeriesName)
  255. if req.SeriesName == "" {
  256. br.Msg = "请输入指标系列名称"
  257. return
  258. }
  259. if len(req.EdbInfoIds) <= 0 {
  260. br.Msg = "请选择因子指标系列"
  261. return
  262. }
  263. if len(req.EdbInfoIds) > 100 {
  264. br.Msg = "添加指标总数量不得超过100"
  265. return
  266. }
  267. calculateLen := len(req.Calculates)
  268. if calculateLen > 5 {
  269. br.Msg = "计算公式不可超过5个"
  270. return
  271. }
  272. var calculatesJson string
  273. if calculateLen > 0 {
  274. b, e := json.Marshal(req.Calculates)
  275. if e != nil {
  276. br.Msg = "计算方式格式有误"
  277. br.ErrMsg = "解析计算方式参数失败, Err: " + e.Error()
  278. return
  279. }
  280. calculatesJson = string(b)
  281. for _, v := range req.Calculates {
  282. switch v.Source {
  283. case utils.EdbBaseCalculateNszydpjjs, utils.EdbBaseCalculateHbz, utils.EdbBaseCalculateHcz, utils.EdbBaseCalculateCjjx:
  284. if v.Formula == nil {
  285. br.Msg = "请输入N值"
  286. return
  287. }
  288. formulaInt, ok := v.Formula.(float64)
  289. if !ok {
  290. br.Msg = "N值格式有误"
  291. return
  292. }
  293. if formulaInt <= 0 {
  294. br.Msg = "N值不可小于0, 重新输入"
  295. return
  296. }
  297. case utils.EdbBaseCalculateExponentialSmoothing:
  298. if v.Formula == nil {
  299. br.Msg = "请填写alpha值"
  300. return
  301. }
  302. alpha, ok := v.Formula.(float64)
  303. if ok {
  304. br.Msg = "alpha值格式有误"
  305. return
  306. }
  307. if alpha <= 0 || alpha >= 1 {
  308. br.Msg = "alpha值应在0-1之间, 请重新输入"
  309. return
  310. }
  311. }
  312. }
  313. }
  314. seriesOb := new(data_manage.FactorEdbSeries)
  315. seriesItem, e := seriesOb.GetItemById(req.SeriesId)
  316. if e != nil {
  317. if e.Error() == utils.ErrNoRow() {
  318. br.Msg = "该因子指标系列不存在"
  319. return
  320. }
  321. br.Msg = "获取失败"
  322. br.ErrMsg = "获取因子指标系列失败, Err: " + e.Error()
  323. return
  324. }
  325. edbArr, e := data_manage.GetEdbInfoByIdList(req.EdbInfoIds)
  326. if e != nil {
  327. br.Msg = "操作失败"
  328. br.ErrMsg = "获取指标列表失败, Err: " + e.Error()
  329. return
  330. }
  331. if len(edbArr) == 0 {
  332. br.Msg = "因子指标系列有误"
  333. br.ErrMsg = "因子指标系列长度为0"
  334. return
  335. }
  336. var calculateResp data_manage.FactorEdbSeriesStepCalculateResp
  337. calculateResp.SeriesId = seriesItem.FactorEdbSeriesId
  338. // 如果不需要进行重新计算(比如只改了系列名称)那么只更新指标系列
  339. seriesItem.SeriesName = req.SeriesName
  340. seriesItem.EdbInfoType = req.EdbInfoType
  341. seriesItem.ModifyTime = time.Now().Local()
  342. updateCols := []string{seriesOb.Cols().SeriesName, seriesOb.Cols().EdbInfoType, seriesOb.Cols().ModifyTime}
  343. if !req.Recalculate {
  344. if e = seriesItem.Update(updateCols); e != nil {
  345. br.Msg = "操作成功"
  346. br.ErrMsg = "更新因子指标系列信息失败, Err: " + e.Error()
  347. return
  348. }
  349. for _, v := range edbArr {
  350. calculateResp.Success = append(calculateResp.Success, data_manage.FactorEdbSeriesStepCalculateResult{
  351. EdbInfoId: v.EdbInfoId,
  352. EdbCode: v.EdbCode,
  353. Msg: "保存成功",
  354. })
  355. }
  356. br.Data = calculateResp
  357. br.Ret = 200
  358. br.Success = true
  359. br.Msg = "操作成功"
  360. return
  361. }
  362. // 更新系列信息和指标关联
  363. if calculateLen > 0 {
  364. seriesItem.CalculateState = data_manage.FactorEdbSeriesCalculating
  365. seriesItem.CalculateStep = calculatesJson
  366. updateCols = append(updateCols, seriesOb.Cols().CalculateState, seriesOb.Cols().CalculateStep)
  367. }
  368. mappings := make([]*data_manage.FactorEdbSeriesMapping, 0)
  369. for _, v := range edbArr {
  370. mappings = append(mappings, &data_manage.FactorEdbSeriesMapping{
  371. EdbInfoId: v.EdbInfoId,
  372. EdbCode: v.EdbCode,
  373. CreateTime: time.Now().Local(),
  374. ModifyTime: time.Now().Local(),
  375. })
  376. }
  377. if e = seriesItem.EditSeriesAndMapping(seriesItem, mappings, updateCols); e != nil {
  378. br.Msg = "操作失败"
  379. br.ErrMsg = "编辑因子指标系列失败, Err: " + e.Error()
  380. return
  381. }
  382. // 重新计算
  383. calculateResp, e = data.FactorEdbStepCalculate(seriesItem.FactorEdbSeriesId, edbArr, req.Calculates, this.Lang, req.Recalculate)
  384. if e != nil {
  385. br.Msg = "操作失败"
  386. br.ErrMsg = "计算因子指标失败, Err: " + e.Error()
  387. return
  388. }
  389. // 更新系列计算状态
  390. cols := []string{seriesItem.Cols().CalculateState, seriesItem.Cols().ModifyTime}
  391. seriesItem.CalculateState = data_manage.FactorEdbSeriesCalculated
  392. seriesItem.ModifyTime = time.Now().Local()
  393. if e = seriesItem.Update(cols); e != nil {
  394. br.Msg = "操作失败"
  395. br.ErrMsg = "更新因子指标系列计算状态失败, Err: " + e.Error()
  396. return
  397. }
  398. br.Data = calculateResp
  399. br.Ret = 200
  400. br.Success = true
  401. br.Msg = "操作成功"
  402. br.IsAddLog = true
  403. }
  404. // Detail
  405. // @Title 详情
  406. // @Description 详情
  407. // @Param SeriesId query int false "多因子指标系列ID"
  408. // @Success 200 {object} data_manage.FactorEdbSeriesDetail
  409. // @router /factor_edb_series/detail [get]
  410. func (this *FactorEdbSeriesController) Detail() {
  411. br := new(models.BaseResponse).Init()
  412. defer func() {
  413. if br.ErrMsg == "" {
  414. br.IsSendEmail = false
  415. }
  416. this.Data["json"] = br
  417. this.ServeJSON()
  418. }()
  419. sysUser := this.SysUser
  420. if sysUser == nil {
  421. br.Msg = "请登录"
  422. br.ErrMsg = "请登录,SysUser Is Empty"
  423. br.Ret = 408
  424. return
  425. }
  426. seriesId, _ := this.GetInt("SeriesId", 0)
  427. if seriesId <= 0 {
  428. br.Msg = "参数有误"
  429. br.ErrMsg = fmt.Sprintf("参数有误, SeriesId: %d", seriesId)
  430. return
  431. }
  432. seriesOb := new(data_manage.FactorEdbSeries)
  433. series, e := seriesOb.GetItemById(seriesId)
  434. if e != nil {
  435. if e.Error() == utils.ErrNoRow() {
  436. br.Msg = "该因子指标系列不存在"
  437. return
  438. }
  439. br.Msg = "获取失败"
  440. br.ErrMsg = "获取因子指标系列失败, Err: " + e.Error()
  441. return
  442. }
  443. mappingOb := new(data_manage.FactorEdbSeriesMapping)
  444. cond := fmt.Sprintf(" AND %s = ?", mappingOb.Cols().FactorEdbSeriesId)
  445. pars := make([]interface{}, 0)
  446. pars = append(pars, seriesId)
  447. mappings, e := mappingOb.GetItemsByCondition(cond, pars, []string{}, fmt.Sprintf("%s ASC", mappingOb.Cols().CreateTime))
  448. if e != nil {
  449. br.Msg = "获取失败"
  450. br.ErrMsg = "获取因子指标系列关联失败, Err: " + e.Error()
  451. return
  452. }
  453. resp := new(data_manage.FactorEdbSeriesDetail)
  454. resp.FactorEdbSeriesItem = series.Format2Item()
  455. for _, m := range mappings {
  456. resp.EdbMappings = append(resp.EdbMappings, m.Format2Item())
  457. }
  458. br.Data = resp
  459. br.Ret = 200
  460. br.Success = true
  461. br.Msg = "获取成功"
  462. }
  463. // CorrelationMatrix
  464. // @Title 因子指标系列-相关性矩阵
  465. // @Description 因子指标系列-相关性矩阵
  466. // @Param request body request.FactorEdbSeriesCorrelationMatrixReq true "type json string"
  467. // @Success 200 {object} data_manage.FactorEdbSeriesCorrelationMatrixItem
  468. // @router /factor_edb_series/correlation/matrix [post]
  469. func (this *FactorEdbSeriesController) CorrelationMatrix() {
  470. br := new(models.BaseResponse).Init()
  471. defer func() {
  472. if br.ErrMsg == "" {
  473. br.IsSendEmail = false
  474. }
  475. this.Data["json"] = br
  476. this.ServeJSON()
  477. }()
  478. sysUser := this.SysUser
  479. if sysUser == nil {
  480. br.Msg = "请登录"
  481. br.ErrMsg = "请登录,SysUser Is Empty"
  482. br.Ret = 408
  483. return
  484. }
  485. var req request.FactorEdbSeriesCorrelationMatrixReq
  486. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  487. br.Msg = "参数解析异常"
  488. br.ErrMsg = fmt.Sprintf("参数解析异常, Err: %v", e)
  489. return
  490. }
  491. if req.BaseEdbInfoId <= 0 {
  492. br.Msg = "请选择标的指标"
  493. return
  494. }
  495. if len(req.SeriesIds) == 0 {
  496. br.Msg = "请选择因子指标系列"
  497. return
  498. }
  499. if req.Correlation.LeadValue <= 0 {
  500. br.Msg = "分析周期不允许设置为负数或0"
  501. return
  502. }
  503. if req.Correlation.LeadUnit == "" {
  504. br.Msg = "请选择分析周期频度"
  505. return
  506. }
  507. leadUnitDays, ok := utils.FrequencyDaysMap[req.Correlation.LeadUnit]
  508. if !ok {
  509. br.Msg = "错误的分析周期频度"
  510. br.ErrMsg = fmt.Sprintf("分析周期频度有误: %s", req.Correlation.LeadUnit)
  511. return
  512. }
  513. if req.Correlation.CalculateUnit == "" {
  514. br.Msg = "请选择计算窗口频度"
  515. return
  516. }
  517. calculateUnitDays, ok := utils.FrequencyDaysMap[req.Correlation.CalculateUnit]
  518. if !ok {
  519. br.Msg = "错误的计算窗口频度"
  520. br.ErrMsg = fmt.Sprintf("计算窗口频度有误: %s", req.Correlation.CalculateUnit)
  521. return
  522. }
  523. leadDays := 2 * req.Correlation.LeadValue * leadUnitDays
  524. calculateDays := req.Correlation.CalculateValue * calculateUnitDays
  525. if calculateDays < leadDays {
  526. br.Msg = "计算窗口必须≥2*分析周期"
  527. return
  528. }
  529. // 获取标的指标信息及数据
  530. baseEdb, e := data_manage.GetEdbInfoById(req.BaseEdbInfoId)
  531. if e != nil {
  532. if e.Error() == utils.ErrNoRow() {
  533. br.Msg = "标的指标不存在"
  534. return
  535. }
  536. br.Msg = "获取失败"
  537. br.ErrMsg = "获取标的指标信息失败, Err: " + e.Error()
  538. return
  539. }
  540. dataListA := make([]*data_manage.EdbDataList, 0)
  541. {
  542. // 标的指标数据日期区间
  543. startDate := time.Now().AddDate(0, 0, -calculateDays).Format(utils.FormatDate)
  544. endDate := time.Now().Format(utils.FormatDate)
  545. startDateTime, _ := time.ParseInLocation(utils.FormatDate, startDate, time.Local)
  546. startDate = startDateTime.AddDate(0, 0, 1).Format(utils.FormatDate) // 不包含第一天
  547. switch baseEdb.EdbInfoType {
  548. case 0:
  549. dataListA, e = data_manage.GetEdbDataList(baseEdb.Source, baseEdb.SubSource, baseEdb.EdbInfoId, startDate, endDate)
  550. case 1:
  551. _, dataListA, _, _, e, _ = data.GetPredictDataListByPredictEdbInfoId(baseEdb.EdbInfoId, startDate, endDate, false)
  552. default:
  553. br.Msg = "获取失败"
  554. br.ErrMsg = fmt.Sprintf("标的指标类型异常: %d", baseEdb.EdbInfoType)
  555. return
  556. }
  557. if e != nil {
  558. br.Msg = "获取失败"
  559. br.ErrMsg = "获取标的指标数据失败, Err:" + e.Error()
  560. return
  561. }
  562. }
  563. // 获取因子系列
  564. seriesIdItem := make(map[int]*data_manage.FactorEdbSeries)
  565. {
  566. ob := new(data_manage.FactorEdbSeries)
  567. cond := fmt.Sprintf(" AND %s IN (%s)", ob.Cols().PrimaryId, utils.GetOrmInReplace(len(req.SeriesIds)))
  568. pars := make([]interface{}, 0)
  569. pars = append(pars, req.SeriesIds)
  570. items, e := ob.GetItemsByCondition(cond, pars, []string{}, fmt.Sprintf("%s ASC", ob.Cols().PrimaryId))
  571. if e != nil {
  572. br.Msg = "获取失败"
  573. br.ErrMsg = "获取因子指标系列失败, Err: " + e.Error()
  574. return
  575. }
  576. if len(items) != len(req.SeriesIds) {
  577. br.Msg = "获取失败"
  578. br.ErrMsg = "因子指标系列数量有误"
  579. return
  580. }
  581. for _, v := range items {
  582. seriesIdItem[v.FactorEdbSeriesId] = v
  583. }
  584. }
  585. // 获取因子指标
  586. edbMappings := make([]*data_manage.FactorEdbSeriesMapping, 0)
  587. edbInfoIds := make([]int, 0)
  588. {
  589. ob := new(data_manage.FactorEdbSeriesMapping)
  590. cond := fmt.Sprintf(" AND %s IN (%s)", ob.Cols().FactorEdbSeriesId, utils.GetOrmInReplace(len(req.SeriesIds)))
  591. pars := make([]interface{}, 0)
  592. pars = append(pars, req.SeriesIds)
  593. order := fmt.Sprintf("%s ASC, %s ASC", ob.Cols().FactorEdbSeriesId, ob.Cols().EdbInfoId)
  594. items, e := ob.GetItemsByCondition(cond, pars, []string{}, order)
  595. if e != nil {
  596. br.Msg = "获取失败"
  597. br.ErrMsg = "获取因子指标关联失败, Err: " + e.Error()
  598. return
  599. }
  600. for _, v := range items {
  601. edbInfoIds = append(edbInfoIds, v.EdbInfoId)
  602. }
  603. edbMappings = items
  604. }
  605. edbIdItem := make(map[int]*data_manage.EdbInfo)
  606. edbItems, e := data_manage.GetEdbInfoByIdList(edbInfoIds)
  607. if e != nil {
  608. br.Msg = "获取失败"
  609. br.ErrMsg = "获取因子指标失败, Err: " + e.Error()
  610. return
  611. }
  612. for _, v := range edbItems {
  613. edbIdItem[v.EdbInfoId] = v
  614. }
  615. // 获取因子指标数据, 计算相关性
  616. resp := new(data_manage.FactorEdbSeriesCorrelationMatrixResp)
  617. calculateDataOb := new(data_manage.FactorEdbSeriesCalculateData)
  618. calculateWorkers := make(chan struct{}, 10)
  619. wg := sync.WaitGroup{}
  620. edbExists := make(map[string]bool)
  621. for _, v := range edbMappings {
  622. existsKey := fmt.Sprintf("%d-%d", v.FactorEdbSeriesId, v.EdbInfoId)
  623. if edbExists[existsKey] {
  624. continue
  625. }
  626. edbExists[existsKey] = true
  627. edbItem := edbIdItem[v.EdbInfoId]
  628. if edbItem == nil {
  629. continue
  630. }
  631. seriesItem := seriesIdItem[v.FactorEdbSeriesId]
  632. if seriesItem == nil {
  633. continue
  634. }
  635. wg.Add(1)
  636. go func(mapping *data_manage.FactorEdbSeriesMapping, edb *data_manage.EdbInfo, series *data_manage.FactorEdbSeries) {
  637. defer func() {
  638. wg.Done()
  639. <-calculateWorkers
  640. }()
  641. calculateWorkers <- struct{}{}
  642. var item data_manage.FactorEdbSeriesCorrelationMatrixItem
  643. item.SeriesId = series.FactorEdbSeriesId
  644. item.EdbInfoId = edb.EdbInfoId
  645. item.EdbCode = edb.EdbCode
  646. item.EdbName = edb.EdbName
  647. // 获取指标数据
  648. dataListB := make([]*data_manage.EdbDataList, 0)
  649. if series.CalculateState == data_manage.FactorEdbSeriesCalculated {
  650. cond := fmt.Sprintf(" AND %s = ? AND %s = ?", calculateDataOb.Cols().FactorEdbSeriesId, calculateDataOb.Cols().EdbInfoId)
  651. pars := make([]interface{}, 0)
  652. pars = append(pars, mapping.FactorEdbSeriesId, mapping.EdbInfoId)
  653. dataItems, e := calculateDataOb.GetItemsByCondition(cond, pars, []string{calculateDataOb.Cols().DataTime, calculateDataOb.Cols().Value}, fmt.Sprintf("%s ASC", calculateDataOb.Cols().DataTime))
  654. if e != nil {
  655. item.Msg = fmt.Sprintf("计算失败")
  656. item.ErrMsg = fmt.Sprintf("获取计算数据失败, err: %v", e)
  657. resp.Fail = append(resp.Fail, item)
  658. return
  659. }
  660. dataListB = data_manage.TransEdbSeriesCalculateData2EdbDataList(dataItems)
  661. } else {
  662. switch edb.EdbInfoType {
  663. case 0:
  664. dataListB, e = data_manage.GetEdbDataList(edb.Source, edb.SubSource, edb.EdbInfoId, "", "")
  665. case 1:
  666. _, dataListB, _, _, e, _ = data.GetPredictDataListByPredictEdbInfoId(edb.EdbInfoId, "", "", false)
  667. default:
  668. item.Msg = fmt.Sprintf("计算失败")
  669. item.ErrMsg = fmt.Sprintf("指标类型异常, edbType: %d", edb.EdbInfoType)
  670. resp.Fail = append(resp.Fail, item)
  671. return
  672. }
  673. }
  674. // 计算相关性
  675. xEdbIdValue, yDataList, e := correlationServ.CalculateCorrelation(req.Correlation.LeadValue, req.Correlation.LeadUnit, baseEdb.Frequency, edb.Frequency, dataListA, dataListB)
  676. if e != nil {
  677. item.Msg = fmt.Sprintf("计算失败")
  678. item.ErrMsg = fmt.Sprintf("相关性计算失败, err: %v", e)
  679. resp.Fail = append(resp.Fail, item)
  680. return
  681. }
  682. // 按照固定规则排期数[0 1 2 3 -1 -2 -3]
  683. yData := yDataList[0].Value
  684. yLen := len(yData)
  685. values := make([]data_manage.FactorEdbSeriesCorrelationMatrixValues, len(xEdbIdValue))
  686. for k, x := range xEdbIdValue {
  687. // y值常常会出现无数据的情况
  688. var y float64
  689. if k >= 0 && k < yLen {
  690. y = yData[k]
  691. }
  692. y = utils.SubFloatToFloat(y, 2)
  693. values[k] = data_manage.FactorEdbSeriesCorrelationMatrixValues{
  694. XData: x, YData: y,
  695. }
  696. }
  697. sort.Sort(data_manage.FactorEdbSeriesCorrelationMatrixOrder(values))
  698. item.Msg = "计算成功"
  699. item.Values = values
  700. resp.Success = append(resp.Success, item)
  701. // TODO:存储计算结果
  702. }(v, edbItem, seriesItem)
  703. }
  704. wg.Wait()
  705. br.Data = resp
  706. br.Ret = 200
  707. br.Success = true
  708. br.Msg = "获取成功"
  709. }