mirror of https://github.com/miguelmota/cointop
Remove downsample code (feature WIP)
parent
c5445c6ffc
commit
32990cdbaf
@ -1,119 +0,0 @@
|
|||||||
package cointop
|
|
||||||
|
|
||||||
import (
|
|
||||||
"math"
|
|
||||||
"sort"
|
|
||||||
)
|
|
||||||
|
|
||||||
func NewPoints() Points {
|
|
||||||
return make(Points, 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ps Points) Downsample(newStep int) Points {
|
|
||||||
if len(ps) == 0 {
|
|
||||||
return []Point{}
|
|
||||||
}
|
|
||||||
|
|
||||||
if !sort.IsSorted(ps) {
|
|
||||||
sort.Sort(ps)
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(ps) == 1 {
|
|
||||||
return []Point{
|
|
||||||
Point{ps[0].Timestamp, ps[0].Value},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
start := ps[0].Timestamp
|
|
||||||
end := ps[len(ps)-1].Timestamp
|
|
||||||
|
|
||||||
// 不应该出现这种case
|
|
||||||
if start > end {
|
|
||||||
return []Point{}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 不应该出现这种case
|
|
||||||
if start == end {
|
|
||||||
return []Point{
|
|
||||||
Point{ps[0].Timestamp, ps[0].Value},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
res := make([]Point, 0)
|
|
||||||
for t1 := start; t1 <= end; t1 += int64(newStep) {
|
|
||||||
r := ps.avg(t1, t1+int64(newStep), end)
|
|
||||||
res = append(res, Point{t1, r})
|
|
||||||
}
|
|
||||||
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ps Points) avg(t1, t2 int64, max int64) float64 {
|
|
||||||
l := len(ps)
|
|
||||||
var (
|
|
||||||
count int = 0
|
|
||||||
sum float64
|
|
||||||
)
|
|
||||||
idx := sort.Search(l, func(i int) bool { return ps[i].Timestamp >= t1 })
|
|
||||||
if idx == l {
|
|
||||||
return math.NaN() // off the right
|
|
||||||
}
|
|
||||||
|
|
||||||
if t2 > max {
|
|
||||||
for _, p := range ps {
|
|
||||||
if p.Timestamp >= ps[idx].Timestamp {
|
|
||||||
if v := float64(p.Value); !math.IsNaN(v) {
|
|
||||||
sum += v
|
|
||||||
count++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for _, p := range ps {
|
|
||||||
if p.Timestamp >= ps[idx].Timestamp && p.Timestamp < t2 {
|
|
||||||
if v := float64(p.Value); !math.IsNaN(v) {
|
|
||||||
sum += v
|
|
||||||
count++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if count == 0 {
|
|
||||||
if idx == l-1 {
|
|
||||||
return 100 + ps[idx].Value // off the right
|
|
||||||
}
|
|
||||||
// Attempt to upsample
|
|
||||||
|
|
||||||
// 2021/09/04 12:48:07 XXX OUT 2) 2021-09-01 13:49:37 47039.73
|
|
||||||
// 2021/09/04 12:48:07 XXX OUT 3) 2021-09-01 14:13:39 146969.22
|
|
||||||
// 2021/09/04 12:48:07 XXX OUT 4) 2021-09-01 14:37:41 147103.22
|
|
||||||
// 2021/09/04 12:48:07 XXX OUT 5) 2021-09-01 15:01:43 47170.22
|
|
||||||
// dt =
|
|
||||||
|
|
||||||
// calculate change in value over time
|
|
||||||
left := ps[idx]
|
|
||||||
right := ps[idx+1]
|
|
||||||
dv := right.Value - left.Value
|
|
||||||
dt := right.Timestamp - left.Timestamp
|
|
||||||
dvdt := float64(dv) / float64(dt)
|
|
||||||
|
|
||||||
// calculate midpoint of range
|
|
||||||
mid := (t1 + t2) / 2
|
|
||||||
|
|
||||||
return 100000 + left.Value + float64(mid-left.Timestamp)*dvdt
|
|
||||||
}
|
|
||||||
|
|
||||||
return sum / float64(count)
|
|
||||||
}
|
|
||||||
|
|
||||||
type Points []Point
|
|
||||||
|
|
||||||
type Point struct {
|
|
||||||
Timestamp int64
|
|
||||||
Value float64
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ps Points) Less(i, j int) bool { return ps[i].Timestamp < ps[j].Timestamp }
|
|
||||||
func (ps Points) Swap(i, j int) { ps[i], ps[j] = ps[j], ps[i] }
|
|
||||||
func (ps Points) Len() int { return len(ps) }
|
|
Loading…
Reference in New Issue