45 lines
1.1 KiB
Go
45 lines
1.1 KiB
Go
package ana
|
|
|
|
import (
|
|
"maps"
|
|
"time"
|
|
|
|
"gogs.inhome.blapointe.com/ana-ledger/ledger"
|
|
)
|
|
|
|
type Prediction []Predictor
|
|
|
|
func NewPrediction(predictor ...Predictor) Prediction {
|
|
return Prediction(predictor)
|
|
}
|
|
|
|
func (prediction Prediction) Predict(register ledger.Register, window time.Duration) ledger.Register {
|
|
return prediction.predict(register.Latest(), time.Now(), predictionTimes(window))
|
|
}
|
|
|
|
func (prediction Prediction) predict(latest ledger.Balances, from time.Time, these []time.Time) ledger.Register {
|
|
latestT := from
|
|
result := make(ledger.Register)
|
|
for i := range these {
|
|
k := these[i].Format("2006-01")
|
|
result[k] = make(ledger.Balances)
|
|
for k2, v2 := range latest {
|
|
result[k][k2] = maps.Clone(v2)
|
|
}
|
|
|
|
elapsed := these[i].Sub(latestT)
|
|
result[k] = prediction.predictOne(result[k], elapsed)
|
|
|
|
latest = result[k]
|
|
latestT = these[i]
|
|
}
|
|
return result
|
|
}
|
|
|
|
func (prediction Prediction) predictOne(balances ledger.Balances, elapsed time.Duration) ledger.Balances {
|
|
for i := range prediction {
|
|
balances = prediction[i](balances, elapsed)
|
|
}
|
|
return balances
|
|
}
|