|
@@ -10,6 +10,8 @@ import (
|
|
|
"time"
|
|
|
)
|
|
|
|
|
|
+// BaseCalculate
|
|
|
+// @Description: 基础的计算公式
|
|
|
type BaseCalculate struct {
|
|
|
DataList []*EdbInfoSearchData
|
|
|
Frequency string `description:"需要转换的频度"`
|
|
@@ -18,6 +20,12 @@ type BaseCalculate struct {
|
|
|
MoveType int `description:"移动方式:1:领先(默认),2:滞后"`
|
|
|
MoveFrequency string `description:"移动频度"`
|
|
|
FromFrequency string `description:"来源的频度"`
|
|
|
+ Source int `description:"1:累计值转月;2:累计值转季;3:同比值;4:同差值;5:N数值移动平均数计算;6:环比值;7:环差值;8:升频;9:降频;10:时间移位;11:超季节性;12:年化;13:累计值;14:累计值年初至今;15:指数修匀;16:日均值"`
|
|
|
+}
|
|
|
+
|
|
|
+type BaseCalculateResp struct {
|
|
|
+ DataMap map[string]float64
|
|
|
+ DateList []string
|
|
|
}
|
|
|
|
|
|
// Ljzzy
|
|
@@ -27,8 +35,8 @@ type BaseCalculate struct {
|
|
|
// @datetime2023-11-02 18:05:19
|
|
|
// @return dateDataMap map[string]float64
|
|
|
// @return err error
|
|
|
-func (obj BaseCalculate) Ljzzy() (dateDataMap map[string]float64, err error) {
|
|
|
- dataList := obj.DataList
|
|
|
+func (obj BaseCalculate) Ljzzy() (dateDataMap map[string]float64, err error, errMsg string) {
|
|
|
+ dataList := obj.DataList // 升序
|
|
|
// 数据处理
|
|
|
yearMap := make(map[int]map[int]*EdbInfoSearchData)
|
|
|
dataLen := len(dataList)
|
|
@@ -138,8 +146,8 @@ func (obj BaseCalculate) Ljzzy() (dateDataMap map[string]float64, err error) {
|
|
|
// @datetime2023-11-02 18:05:05
|
|
|
// @return dateDataMap map[string]float64
|
|
|
// @return err error
|
|
|
-func (obj BaseCalculate) Ljzzj() (dateDataMap map[string]float64, err error) {
|
|
|
- dataList := obj.DataList
|
|
|
+func (obj BaseCalculate) Ljzzj() (dateDataMap map[string]float64, err error, errMsg string) {
|
|
|
+ dataList := obj.DataList // 升序
|
|
|
// 数据处理
|
|
|
yearMap := make(map[int]map[int]*EdbInfoSearchData)
|
|
|
dataLen := len(dataList)
|
|
@@ -249,8 +257,8 @@ func (obj BaseCalculate) Ljzzj() (dateDataMap map[string]float64, err error) {
|
|
|
// @datetime2023-11-02 18:04:59
|
|
|
// @return dateDataMap map[string]float64
|
|
|
// @return err error
|
|
|
-func (obj BaseCalculate) Tbz() (dateDataMap map[string]float64, err error) {
|
|
|
- dataList := obj.DataList
|
|
|
+func (obj BaseCalculate) Tbz() (dateDataMap map[string]float64, err error, errMsg string) {
|
|
|
+ dataList := obj.DataList // 降序
|
|
|
//数据处理
|
|
|
var dateArr []string
|
|
|
dataMap := make(map[string]*EdbInfoSearchData)
|
|
@@ -361,8 +369,8 @@ func tbzDiv(a, b float64) float64 {
|
|
|
// @datetime2023-11-02 18:04:51
|
|
|
// @return dateDataMap map[string]float64
|
|
|
// @return err error
|
|
|
-func (obj BaseCalculate) Tcz() (dateDataMap map[string]float64, err error) {
|
|
|
- dataList := obj.DataList
|
|
|
+func (obj BaseCalculate) Tcz() (dateDataMap map[string]float64, err error, errMsg string) {
|
|
|
+ dataList := obj.DataList // 降序
|
|
|
// 数据处理
|
|
|
var dateArr []string
|
|
|
dataMap := make(map[string]*EdbInfoSearchData)
|
|
@@ -460,7 +468,7 @@ func tczSub(a, b float64) float64 {
|
|
|
// @datetime2023-11-02 18:17:38
|
|
|
// @return dateDataMap map[string]float64
|
|
|
// @return err error
|
|
|
-func (obj BaseCalculate) Nszydpjjs() (dateDataMap map[string]float64, err error) {
|
|
|
+func (obj BaseCalculate) Nszydpjjs() (dateDataMap map[string]float64, err error, errMsg string) {
|
|
|
fromDataList := obj.DataList
|
|
|
formulaInt := obj.Formula.(int)
|
|
|
|
|
@@ -520,7 +528,7 @@ func (obj BaseCalculate) Nszydpjjs() (dateDataMap map[string]float64, err error)
|
|
|
// @datetime2023-11-02 18:28:24
|
|
|
// @return dateDataMap map[string]float64
|
|
|
// @return err error
|
|
|
-func (obj BaseCalculate) Hbz() (dateDataMap map[string]float64, err error) {
|
|
|
+func (obj BaseCalculate) Hbz() (dateDataMap map[string]float64, err error, errMsg string) {
|
|
|
dataList := obj.DataList
|
|
|
formulaInt := obj.Formula.(int)
|
|
|
|
|
@@ -589,7 +597,7 @@ func hbzDiv(current, pre float64) (val float64, ok bool) {
|
|
|
// @datetime2023-11-02 18:33:20
|
|
|
// @return dateDataMap map[string]float64
|
|
|
// @return err error
|
|
|
-func (obj BaseCalculate) Hcz() (dateDataMap map[string]float64, err error) {
|
|
|
+func (obj BaseCalculate) Hcz() (dateDataMap map[string]float64, err error, errMsg string) {
|
|
|
dataList := obj.DataList
|
|
|
formulaInt := obj.Formula.(int)
|
|
|
|
|
@@ -648,7 +656,7 @@ func hczDiv(current, pre float64) float64 {
|
|
|
// @datetime2023-11-02 18:43:03
|
|
|
// @return dateDataMap map[string]float64
|
|
|
// @return err error
|
|
|
-func (obj BaseCalculate) UpFrequency() (dateDataMap map[string]float64, err error) {
|
|
|
+func (obj BaseCalculate) UpFrequency() (dateDataMap map[string]float64, err error, errMsg string) {
|
|
|
dataList := obj.DataList
|
|
|
|
|
|
// 数据处理
|
|
@@ -700,7 +708,7 @@ func (obj BaseCalculate) UpFrequency() (dateDataMap map[string]float64, err erro
|
|
|
// @datetime2023-11-02 18:51:26
|
|
|
// @return dateDataMap map[string]float64
|
|
|
// @return err error
|
|
|
-func (obj BaseCalculate) DownFrequency() (dateDataMap map[string]float64, err error) {
|
|
|
+func (obj BaseCalculate) DownFrequency() (dateDataMap map[string]float64, err error, errMsg string) {
|
|
|
dataList := obj.DataList
|
|
|
edbFrequency := obj.Frequency
|
|
|
formula := obj.Formula.(string)
|
|
@@ -860,7 +868,7 @@ func (obj BaseCalculate) DownFrequency() (dateDataMap map[string]float64, err er
|
|
|
// @datetime2023-11-03 13:19:07
|
|
|
// @return dateDataMap map[string]float64
|
|
|
// @return err error
|
|
|
-func (obj BaseCalculate) TimeShift() (dateDataMap map[string]float64, err error) {
|
|
|
+func (obj BaseCalculate) TimeShift() (dateDataMap map[string]float64, err error, errMsg string) {
|
|
|
dataList := obj.DataList
|
|
|
formulaInt := obj.Formula.(int)
|
|
|
moveType := obj.MoveType
|
|
@@ -917,7 +925,7 @@ func (obj BaseCalculate) TimeShift() (dateDataMap map[string]float64, err error)
|
|
|
// @datetime2023-11-03 13:28:23
|
|
|
// @return dateDataMap map[string]float64
|
|
|
// @return err error
|
|
|
-func (obj BaseCalculate) Cjjx() (dateDataMap map[string]float64, err error) {
|
|
|
+func (obj BaseCalculate) Cjjx() (dateDataMap map[string]float64, err error, errMsg string) {
|
|
|
dataList := obj.DataList
|
|
|
formulaInt := obj.Formula.(int)
|
|
|
calendar := obj.Calendar
|
|
@@ -1045,7 +1053,7 @@ func cjjxSub(currValue float64, pastValue []float64) (value float64, ok bool) {
|
|
|
// @param edbCode string
|
|
|
// @return dateDataMap map[string]float64
|
|
|
// @return err error
|
|
|
-func (obj BaseCalculate) Annualized() (dateDataMap map[string]float64, err error) {
|
|
|
+func (obj BaseCalculate) Annualized() (dateDataMap map[string]float64, err error, errMsg string) {
|
|
|
fromDataList := obj.DataList
|
|
|
lenFromDataList := len(fromDataList)
|
|
|
// 如果来源指标没有数据,那么就直接返回得了
|
|
@@ -1141,7 +1149,7 @@ func (obj BaseCalculate) Annualized() (dateDataMap map[string]float64, err error
|
|
|
// @datetime2023-11-03 13:49:17
|
|
|
// @return dateDataMap map[string]float64
|
|
|
// @return err error
|
|
|
-func (obj BaseCalculate) Ljz() (dateDataMap map[string]float64, err error) {
|
|
|
+func (obj BaseCalculate) Ljz() (dateDataMap map[string]float64, err error, errMsg string) {
|
|
|
dataList := obj.DataList
|
|
|
frequency := obj.Frequency //需要变更的频度
|
|
|
fromFrequency := obj.FromFrequency //来源的频度
|
|
@@ -1408,7 +1416,7 @@ func (obj BaseCalculate) Ljz() (dateDataMap map[string]float64, err error) {
|
|
|
// @datetime2023-11-03 13:55:44
|
|
|
// @return dateDataMap map[string]float64
|
|
|
// @return err error
|
|
|
-func (obj BaseCalculate) LjzNczj() (dateDataMap map[string]float64, err error) {
|
|
|
+func (obj BaseCalculate) LjzNczj() (dateDataMap map[string]float64, err error, errMsg string) {
|
|
|
dataList := obj.DataList
|
|
|
frequency := obj.Frequency //需要变更的频度
|
|
|
fromFrequency := obj.FromFrequency //来源的频度
|
|
@@ -1521,7 +1529,7 @@ func (obj BaseCalculate) LjzNczj() (dateDataMap map[string]float64, err error) {
|
|
|
// @datetime2023-11-03 14:07:47
|
|
|
// @return dateDataMap map[string]float64
|
|
|
// @return err error
|
|
|
-func (obj BaseCalculate) ExponentialSmoothing() (dateDataMap map[string]float64, err error) {
|
|
|
+func (obj BaseCalculate) ExponentialSmoothing() (dateDataMap map[string]float64, err error, errMsg string) {
|
|
|
dataList := obj.DataList
|
|
|
formula := obj.Formula.(string) // alpha值
|
|
|
|
|
@@ -1606,7 +1614,7 @@ func calculateExponentialSmoothingData(dataList []*EdbInfoSearchData, alpha floa
|
|
|
// @datetime2023-11-03 14:47:47
|
|
|
// @return dateDataMap map[string]float64
|
|
|
// @return err error
|
|
|
-func (obj BaseCalculate) Rjz() (dateDataMap map[string]float64, err error) {
|
|
|
+func (obj BaseCalculate) Rjz() (dateDataMap map[string]float64, err error, errMsg string) {
|
|
|
dataList := obj.DataList
|
|
|
|
|
|
fromFrequency := obj.FromFrequency
|
|
@@ -1668,3 +1676,51 @@ func rjzDivV2(a float64, b int) (val float64, ok bool) {
|
|
|
|
|
|
return
|
|
|
}
|
|
|
+
|
|
|
+// reverseSlice
|
|
|
+// @Description: 倒装切片
|
|
|
+// @author: Roc
|
|
|
+// @datetime2023-11-06 14:08:25
|
|
|
+// @param slice []*EdbInfoSearchData
|
|
|
+// @return []*EdbInfoSearchData
|
|
|
+func reverseSlice(slice []*EdbInfoSearchData) []*EdbInfoSearchData {
|
|
|
+ reversed := make([]*EdbInfoSearchData, len(slice))
|
|
|
+ for i, j := 0, len(slice)-1; i < len(slice); i, j = i+1, j-1 {
|
|
|
+ reversed[i] = slice[j]
|
|
|
+ }
|
|
|
+ return reversed
|
|
|
+}
|
|
|
+
|
|
|
+// reverseSlice
|
|
|
+// @Description: 倒装切片
|
|
|
+// @author: Roc
|
|
|
+// @datetime2023-11-06 14:08:25
|
|
|
+// @param slice []*EdbInfoSearchData
|
|
|
+// @return []*EdbInfoSearchData
|
|
|
+func reverseSliceByDesc(slice []*EdbInfoSearchData) (newSlice []*EdbInfoSearchData, err error) {
|
|
|
+ // 只有一个数据的话,那么就直接返回
|
|
|
+ if len(slice) <= 1 {
|
|
|
+ newSlice = slice
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ startDate, err := time.ParseInLocation(utils.FormatDate, slice[0].DataTime, time.Local)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ secondDate, err := time.ParseInLocation(utils.FormatDate, slice[1].DataTime, time.Local)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if !secondDate.After(startDate) {
|
|
|
+ newSlice = slice
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ newSlice = make([]*EdbInfoSearchData, len(slice))
|
|
|
+ for i, j := 0, len(slice)-1; i < len(slice); i, j = i+1, j-1 {
|
|
|
+ newSlice[i] = slice[j]
|
|
|
+ }
|
|
|
+
|
|
|
+ return
|
|
|
+}
|