123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241 |
- package pcsg
- import (
- "eta/eta_bridge/global"
- "fmt"
- "strings"
- "time"
- )
- // PythonBloombergGeneralData 通用数据格式(有空改成Map吧...然后做成配置方便加新字段...)
- type PythonBloombergGeneralData struct {
- NAME string `json:"NAME" description:"指标名称, 可能为null"`
- IDENTIFIER string `json:"IDENTIFIER" description:"指标编码"`
- PX_LAST_EOD *float64 `json:"PX_LAST_EOD" description:"数据值, 可能为null"`
- PX_VOLUME_EOD *float64 `json:"PX_VOLUME_EOD" description:"数据值, 可能为null"`
- PX_LAST *float64 `json:"PX_LAST" description:"数据值, 可能为null"`
- PX_VOLUME *float64 `json:"PX_VOLUME" description:"数据值, 可能为null"`
- LAST_UPDATE_DATE_EOD string `json:"LAST_UPDATE_DATE_EOD" description:"数据日期"`
- DATE string `json:"DATE" description:"数据日期"`
- PX_SETTLE *float64 `json:"PX_SETTLE" description:"数据值, 可能为null"`
- PX_SETTLE_LAST_DT string `json:"PX_SETTLE_LAST_DT" description:"数据日期"`
- OPEN_INT *float64 `json:"OPEN_INT"`
- OPEN_INT_DATE string `json:"OPEN_INT_DATE"`
- DL_SNAPSHOT_START_TIME string `json:"DL_SNAPSHOT_START_TIME" description:"数据日期"`
- LAST_UPDATE string `json:"LAST_UPDATE" description:"IDpcsgDailySnap0000和IDpcsgDailySnap0330判断用的"`
- PX_CLOSE_DT string `json:"PX_CLOSE_DT" description:"数据日期"`
- LAST_UPDATE_DT string `json:"LAST_UPDATE_DT" description:"数据日期"`
- HEATING_DAYS *float64 `json:"HEATING_DAYS" description:"数据值, 可能为null"`
- COOLING_DAYS *float64 `json:"COOLING_DAYS" description:"数据值, 可能为null"`
- }
- // PythonBloombergGeneralResult API响应体
- type PythonBloombergGeneralResult struct {
- Code int `json:"code"`
- Msg string `json:"msg"`
- Data []map[string]interface{} `json:"data"`
- }
- // BaseFromBloombergApiIndexAndData Bloomberg原始指标及数据
- type BaseFromBloombergApiIndexAndData struct {
- BaseFromBloombergIndexId int `description:"指标ID"`
- IndexCode string `description:"指标编码"`
- IndexName string `description:"指标名称"`
- Unit string `description:"单位"`
- Source string `description:"来源"`
- Frequency string `description:"频度"`
- CreateTime time.Time `description:"创建时间"`
- ModifyTime time.Time `description:"修改时间"`
- Data []BaseFromBloombergApiIndexData `description:"数据列表"`
- }
- // BaseFromBloombergApiIndexData Bloomberg原始指标数据
- type BaseFromBloombergApiIndexData struct {
- DataTime time.Time `description:"数据日期"`
- Value float64 `description:"数据值"`
- }
- // TaskConfPCSGBloomberg 配置
- type TaskConfPCSGBloomberg struct {
- TaskKey string `json:"TaskKey" description:"任务名称"`
- IndexCodeField string `json:"IndexCodeField" description:"指标编码字段名"`
- IndexNameField string `json:"IndexNameField" description:"指标名称字段名"`
- FrequencyVal string `json:"FrequencyVal" description:"频度"`
- UnitVal string `json:"UnitVal" description:"单位"`
- DataTimeField string `json:"DataTimeField" description:"数据日期字段名"`
- DataTimeFormat string `json:"DataTimeFormat" description:"数据日期格式"`
- DataTimeMoveDays int `json:"DataTimeMoveDays" description:"数据日期位移天数"`
- DataValField string `json:"DataValField" description:"数据值字段名"`
- CheckDataTimeField string `json:"CheckDataTimeField" description:"需要校验的数据日期字段名"`
- CheckDataTimeFormat string `json:"CheckDataTimeFormat" description:"需要校验的数据日期格式"`
- }
- func FormatPythonBloombergGeneralData2Base(origin map[string]interface{}, conf *TaskConfPCSGBloomberg) (item BaseFromBloombergApiIndexAndData) {
- // 指标编码
- if v, ok := origin[conf.IndexCodeField]; ok {
- indexCode, yes := v.(string)
- if !yes {
- return
- }
- item.IndexCode = strings.TrimSpace(indexCode)
- }
- // 指标名称/频率/单位
- if v, ok := origin[conf.IndexNameField]; ok {
- indexName, yes := v.(string)
- if yes {
- item.IndexName = strings.TrimSpace(indexName)
- }
- }
- item.Frequency = conf.FrequencyVal
- item.Unit = conf.UnitVal
- // 校验一下指定字段的日期格式, 如果格式不对那么不处理
- checkTimeFunc := func(dataMap map[string]interface{}) (pass bool) {
- pass = true // 默认处理
- f, ok := dataMap[conf.CheckDataTimeField]
- if !ok {
- return
- }
- checkField, yes := f.(string)
- if !yes {
- return
- }
- f, ok = dataMap[conf.CheckDataTimeFormat]
- if !ok {
- return
- }
- checkFormat, yes := f.(string)
- if !yes {
- return
- }
- f, ok = dataMap[checkField]
- if !ok {
- return
- }
- fieldVal, yes := f.(string)
- if !yes {
- return
- }
- // 格式不一致, 那么不处理
- _, e := time.ParseInLocation(checkFormat, fieldVal, time.Local)
- if e != nil {
- pass = false
- return
- }
- return
- }
- if !checkTimeFunc(origin) {
- return
- }
- // 数据日期
- item.Data = make([]BaseFromBloombergApiIndexData, 0)
- var dataTime time.Time
- if v, ok := origin[conf.DataTimeField]; ok {
- strTime, yes := v.(string)
- if !yes {
- return
- }
- if strTime == "" {
- return
- }
- d, e := time.ParseInLocation(conf.DataTimeFormat, strTime, time.Local)
- if e != nil {
- global.LOG.Info(fmt.Sprintf("数据日期解析失败, %s, err: %v", strTime, e))
- return
- }
- if d.IsZero() {
- global.LOG.Info(fmt.Sprintf("数据日期解析为空, %s", strTime))
- return
- }
- if conf.DataTimeMoveDays != 0 {
- d = d.AddDate(0, 0, conf.DataTimeMoveDays)
- }
- dataTime = d
- }
- // 数据值
- var dataVal *float64
- if v, ok := origin[conf.DataValField]; ok {
- val, yes := v.(*float64)
- if !yes {
- global.LOG.Info(fmt.Sprintf("数据float断言失败, %v", v))
- return
- }
- if val == nil {
- return
- }
- dataVal = val
- }
- item.Data = append(item.Data, BaseFromBloombergApiIndexData{
- DataTime: dataTime,
- Value: *dataVal,
- })
- return
- }
- func FormatPythonBloombergDailyRun11Data2Base(origin PythonBloombergGeneralData, frequency, taskKey string) (items []BaseFromBloombergApiIndexAndData) {
- if origin.IDENTIFIER == "" {
- return
- }
- if origin.LAST_UPDATE_DT == "" {
- return
- }
- dataTime, err := time.ParseInLocation(utils.FormatDate, origin.LAST_UPDATE_DT, time.Local)
- if err != nil {
- return
- }
- items = make([]BaseFromBloombergApiIndexAndData, 0)
- // WER1UK00 Index, WER1UK00 Index HDD, WER1UK00 Index CDD
- item := BaseFromBloombergApiIndexAndData{}
- item.IndexCode = strings.TrimSpace(origin.IDENTIFIER)
- item.IndexName = strings.TrimSpace(origin.NAME)
- item.Frequency = frequency
- item.Unit = "无"
- item.Data = make([]BaseFromBloombergApiIndexData, 0)
- itemHDD := BaseFromBloombergApiIndexAndData{}
- itemHDD.IndexCode = strings.TrimSpace(origin.IDENTIFIER)
- itemHDD.IndexCode = fmt.Sprintf("%s HDD", itemHDD.IndexCode)
- itemHDD.IndexName = strings.TrimSpace(origin.NAME)
- itemHDD.IndexName = fmt.Sprintf("%s HDD", itemHDD.IndexName)
- itemHDD.Frequency = frequency
- itemHDD.Unit = "无"
- itemHDD.Data = make([]BaseFromBloombergApiIndexData, 0)
- itemCDD := BaseFromBloombergApiIndexAndData{}
- itemCDD.IndexCode = strings.TrimSpace(origin.IDENTIFIER)
- itemCDD.IndexCode = fmt.Sprintf("%s CDD", itemCDD.IndexCode)
- itemCDD.IndexName = strings.TrimSpace(origin.NAME)
- itemCDD.IndexName = fmt.Sprintf("%s CDD", itemCDD.IndexName)
- itemCDD.Frequency = frequency
- itemCDD.Unit = "无"
- itemCDD.Data = make([]BaseFromBloombergApiIndexData, 0)
- // 数据来源的值和日期对应字段不同
- if origin.PX_LAST != nil {
- val := origin.PX_LAST
- item.Data = append(item.Data, BaseFromBloombergApiIndexData{
- DataTime: dataTime,
- Value: *val,
- })
- }
- if origin.HEATING_DAYS != nil {
- val := origin.HEATING_DAYS
- itemHDD.Data = append(itemHDD.Data, BaseFromBloombergApiIndexData{
- DataTime: dataTime,
- Value: *val,
- })
- }
- if origin.COOLING_DAYS != nil {
- val := origin.COOLING_DAYS
- itemCDD.Data = append(itemCDD.Data, BaseFromBloombergApiIndexData{
- DataTime: dataTime,
- Value: *val,
- })
- }
- items = append(items, item, itemHDD, itemCDD)
- return
- }
|