bloomberg.go 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. package pcsg
  2. import (
  3. "eta/eta_bridge/global"
  4. "fmt"
  5. "strings"
  6. "time"
  7. )
  8. // PythonBloombergGeneralData 通用数据格式(有空改成Map吧...然后做成配置方便加新字段...)
  9. type PythonBloombergGeneralData struct {
  10. NAME string `json:"NAME" description:"指标名称, 可能为null"`
  11. IDENTIFIER string `json:"IDENTIFIER" description:"指标编码"`
  12. PX_LAST_EOD *float64 `json:"PX_LAST_EOD" description:"数据值, 可能为null"`
  13. PX_VOLUME_EOD *float64 `json:"PX_VOLUME_EOD" description:"数据值, 可能为null"`
  14. PX_LAST *float64 `json:"PX_LAST" description:"数据值, 可能为null"`
  15. PX_VOLUME *float64 `json:"PX_VOLUME" description:"数据值, 可能为null"`
  16. LAST_UPDATE_DATE_EOD string `json:"LAST_UPDATE_DATE_EOD" description:"数据日期"`
  17. DATE string `json:"DATE" description:"数据日期"`
  18. PX_SETTLE *float64 `json:"PX_SETTLE" description:"数据值, 可能为null"`
  19. PX_SETTLE_LAST_DT string `json:"PX_SETTLE_LAST_DT" description:"数据日期"`
  20. OPEN_INT *float64 `json:"OPEN_INT"`
  21. OPEN_INT_DATE string `json:"OPEN_INT_DATE"`
  22. DL_SNAPSHOT_START_TIME string `json:"DL_SNAPSHOT_START_TIME" description:"数据日期"`
  23. LAST_UPDATE string `json:"LAST_UPDATE" description:"IDpcsgDailySnap0000和IDpcsgDailySnap0330判断用的"`
  24. PX_CLOSE_DT string `json:"PX_CLOSE_DT" description:"数据日期"`
  25. LAST_UPDATE_DT string `json:"LAST_UPDATE_DT" description:"数据日期"`
  26. HEATING_DAYS *float64 `json:"HEATING_DAYS" description:"数据值, 可能为null"`
  27. COOLING_DAYS *float64 `json:"COOLING_DAYS" description:"数据值, 可能为null"`
  28. }
  29. // PythonBloombergGeneralResult API响应体
  30. type PythonBloombergGeneralResult struct {
  31. Code int `json:"code"`
  32. Msg string `json:"msg"`
  33. Data []map[string]interface{} `json:"data"`
  34. }
  35. // BaseFromBloombergApiIndexAndData Bloomberg原始指标及数据
  36. type BaseFromBloombergApiIndexAndData struct {
  37. BaseFromBloombergIndexId int `description:"指标ID"`
  38. IndexCode string `description:"指标编码"`
  39. IndexName string `description:"指标名称"`
  40. Unit string `description:"单位"`
  41. Source string `description:"来源"`
  42. Frequency string `description:"频度"`
  43. CreateTime time.Time `description:"创建时间"`
  44. ModifyTime time.Time `description:"修改时间"`
  45. Data []BaseFromBloombergApiIndexData `description:"数据列表"`
  46. }
  47. // BaseFromBloombergApiIndexData Bloomberg原始指标数据
  48. type BaseFromBloombergApiIndexData struct {
  49. DataTime time.Time `description:"数据日期"`
  50. Value float64 `description:"数据值"`
  51. }
  52. // TaskConfPCSGBloomberg 配置
  53. type TaskConfPCSGBloomberg struct {
  54. TaskKey string `json:"TaskKey" description:"任务名称"`
  55. IndexCodeField string `json:"IndexCodeField" description:"指标编码字段名"`
  56. IndexNameField string `json:"IndexNameField" description:"指标名称字段名"`
  57. FrequencyVal string `json:"FrequencyVal" description:"频度"`
  58. UnitVal string `json:"UnitVal" description:"单位"`
  59. DataTimeField string `json:"DataTimeField" description:"数据日期字段名"`
  60. DataTimeFormat string `json:"DataTimeFormat" description:"数据日期格式"`
  61. DataTimeMoveDays int `json:"DataTimeMoveDays" description:"数据日期位移天数"`
  62. DataValField string `json:"DataValField" description:"数据值字段名"`
  63. CheckDataTimeField string `json:"CheckDataTimeField" description:"需要校验的数据日期字段名"`
  64. CheckDataTimeFormat string `json:"CheckDataTimeFormat" description:"需要校验的数据日期格式"`
  65. }
  66. func FormatPythonBloombergGeneralData2Base(origin map[string]interface{}, conf *TaskConfPCSGBloomberg) (item BaseFromBloombergApiIndexAndData) {
  67. // 指标编码
  68. if v, ok := origin[conf.IndexCodeField]; ok {
  69. indexCode, yes := v.(string)
  70. if !yes {
  71. return
  72. }
  73. item.IndexCode = strings.TrimSpace(indexCode)
  74. }
  75. // 指标名称/频率/单位
  76. if v, ok := origin[conf.IndexNameField]; ok {
  77. indexName, yes := v.(string)
  78. if yes {
  79. item.IndexName = strings.TrimSpace(indexName)
  80. }
  81. }
  82. item.Frequency = conf.FrequencyVal
  83. item.Unit = conf.UnitVal
  84. // 校验一下指定字段的日期格式, 如果格式不对那么不处理
  85. checkTimeFunc := func(dataMap map[string]interface{}) (pass bool) {
  86. pass = true // 默认处理
  87. f, ok := dataMap[conf.CheckDataTimeField]
  88. if !ok {
  89. return
  90. }
  91. checkField, yes := f.(string)
  92. if !yes {
  93. return
  94. }
  95. f, ok = dataMap[conf.CheckDataTimeFormat]
  96. if !ok {
  97. return
  98. }
  99. checkFormat, yes := f.(string)
  100. if !yes {
  101. return
  102. }
  103. f, ok = dataMap[checkField]
  104. if !ok {
  105. return
  106. }
  107. fieldVal, yes := f.(string)
  108. if !yes {
  109. return
  110. }
  111. // 格式不一致, 那么不处理
  112. _, e := time.ParseInLocation(checkFormat, fieldVal, time.Local)
  113. if e != nil {
  114. pass = false
  115. return
  116. }
  117. return
  118. }
  119. if !checkTimeFunc(origin) {
  120. return
  121. }
  122. // 数据日期
  123. item.Data = make([]BaseFromBloombergApiIndexData, 0)
  124. var dataTime time.Time
  125. if v, ok := origin[conf.DataTimeField]; ok {
  126. strTime, yes := v.(string)
  127. if !yes {
  128. return
  129. }
  130. if strTime == "" {
  131. return
  132. }
  133. d, e := time.ParseInLocation(conf.DataTimeFormat, strTime, time.Local)
  134. if e != nil {
  135. global.LOG.Info(fmt.Sprintf("数据日期解析失败, %s, err: %v", strTime, e))
  136. return
  137. }
  138. if d.IsZero() {
  139. global.LOG.Info(fmt.Sprintf("数据日期解析为空, %s", strTime))
  140. return
  141. }
  142. if conf.DataTimeMoveDays != 0 {
  143. d = d.AddDate(0, 0, conf.DataTimeMoveDays)
  144. }
  145. dataTime = d
  146. }
  147. // 数据值
  148. var dataVal *float64
  149. if v, ok := origin[conf.DataValField]; ok {
  150. val, yes := v.(*float64)
  151. if !yes {
  152. global.LOG.Info(fmt.Sprintf("数据float断言失败, %v", v))
  153. return
  154. }
  155. if val == nil {
  156. return
  157. }
  158. dataVal = val
  159. }
  160. item.Data = append(item.Data, BaseFromBloombergApiIndexData{
  161. DataTime: dataTime,
  162. Value: *dataVal,
  163. })
  164. return
  165. }
  166. func FormatPythonBloombergDailyRun11Data2Base(origin PythonBloombergGeneralData, frequency, taskKey string) (items []BaseFromBloombergApiIndexAndData) {
  167. if origin.IDENTIFIER == "" {
  168. return
  169. }
  170. if origin.LAST_UPDATE_DT == "" {
  171. return
  172. }
  173. dataTime, err := time.ParseInLocation(utils.FormatDate, origin.LAST_UPDATE_DT, time.Local)
  174. if err != nil {
  175. return
  176. }
  177. items = make([]BaseFromBloombergApiIndexAndData, 0)
  178. // WER1UK00 Index, WER1UK00 Index HDD, WER1UK00 Index CDD
  179. item := BaseFromBloombergApiIndexAndData{}
  180. item.IndexCode = strings.TrimSpace(origin.IDENTIFIER)
  181. item.IndexName = strings.TrimSpace(origin.NAME)
  182. item.Frequency = frequency
  183. item.Unit = "无"
  184. item.Data = make([]BaseFromBloombergApiIndexData, 0)
  185. itemHDD := BaseFromBloombergApiIndexAndData{}
  186. itemHDD.IndexCode = strings.TrimSpace(origin.IDENTIFIER)
  187. itemHDD.IndexCode = fmt.Sprintf("%s HDD", itemHDD.IndexCode)
  188. itemHDD.IndexName = strings.TrimSpace(origin.NAME)
  189. itemHDD.IndexName = fmt.Sprintf("%s HDD", itemHDD.IndexName)
  190. itemHDD.Frequency = frequency
  191. itemHDD.Unit = "无"
  192. itemHDD.Data = make([]BaseFromBloombergApiIndexData, 0)
  193. itemCDD := BaseFromBloombergApiIndexAndData{}
  194. itemCDD.IndexCode = strings.TrimSpace(origin.IDENTIFIER)
  195. itemCDD.IndexCode = fmt.Sprintf("%s CDD", itemCDD.IndexCode)
  196. itemCDD.IndexName = strings.TrimSpace(origin.NAME)
  197. itemCDD.IndexName = fmt.Sprintf("%s CDD", itemCDD.IndexName)
  198. itemCDD.Frequency = frequency
  199. itemCDD.Unit = "无"
  200. itemCDD.Data = make([]BaseFromBloombergApiIndexData, 0)
  201. // 数据来源的值和日期对应字段不同
  202. if origin.PX_LAST != nil {
  203. val := origin.PX_LAST
  204. item.Data = append(item.Data, BaseFromBloombergApiIndexData{
  205. DataTime: dataTime,
  206. Value: *val,
  207. })
  208. }
  209. if origin.HEATING_DAYS != nil {
  210. val := origin.HEATING_DAYS
  211. itemHDD.Data = append(itemHDD.Data, BaseFromBloombergApiIndexData{
  212. DataTime: dataTime,
  213. Value: *val,
  214. })
  215. }
  216. if origin.COOLING_DAYS != nil {
  217. val := origin.COOLING_DAYS
  218. itemCDD.Data = append(itemCDD.Data, BaseFromBloombergApiIndexData{
  219. DataTime: dataTime,
  220. Value: *val,
  221. })
  222. }
  223. items = append(items, item, itemHDD, itemCDD)
  224. return
  225. }