init
This commit is contained in:
66
logic/evaluator.go
Normal file
66
logic/evaluator.go
Normal file
@@ -0,0 +1,66 @@
|
||||
package logic
|
||||
|
||||
import (
|
||||
"math"
|
||||
"sort"
|
||||
)
|
||||
|
||||
func CalculateCardValue(baseSales, exactSales []float64, factors map[string]float64) float64 {
|
||||
bpRaw := calculateBasePrice(baseSales)
|
||||
emp := 0.0
|
||||
if len(exactSales) > 0 {
|
||||
emp = calculateBasePrice(exactSales)
|
||||
}
|
||||
bpFinal := calculateFinalBasePrice(bpRaw, emp, len(exactSales))
|
||||
value := (bpFinal * factors["GF"] * factors["RF"] * factors["EF"] * factors["ST"] * factors["DF"] * factors["AF"] * factors["MF"]) + factors["TAF"]
|
||||
return math.Round(value*100) / 100
|
||||
}
|
||||
|
||||
func calculateBasePrice(sales []float64) float64 {
|
||||
cleanSales := removeOutliers(sales)
|
||||
median := calculateMedian(cleanSales)
|
||||
stdDev := calculateStdDev(cleanSales, median)
|
||||
vaf := 1 + (stdDev/median)*0.1
|
||||
return median * vaf
|
||||
}
|
||||
|
||||
func calculateFinalBasePrice(bp, emp float64, exactCount int) float64 {
|
||||
weight := 0.0
|
||||
switch {
|
||||
case exactCount >= 10:
|
||||
weight = 0.8
|
||||
case exactCount >= 5:
|
||||
weight = 0.6
|
||||
case exactCount >= 2:
|
||||
weight = 0.4
|
||||
}
|
||||
return (bp * (1 - weight)) + (emp * weight)
|
||||
}
|
||||
|
||||
func removeOutliers(sales []float64) []float64 {
|
||||
median := calculateMedian(sales)
|
||||
var filtered []float64
|
||||
for _, s := range sales {
|
||||
if s >= median*0.7 && s <= median*1.3 {
|
||||
filtered = append(filtered, s)
|
||||
}
|
||||
}
|
||||
return filtered
|
||||
}
|
||||
|
||||
func calculateMedian(sales []float64) float64 {
|
||||
sort.Float64s(sales)
|
||||
n := len(sales)
|
||||
if n%2 == 0 {
|
||||
return (sales[n/2-1] + sales[n/2]) / 2
|
||||
}
|
||||
return sales[n/2]
|
||||
}
|
||||
|
||||
func calculateStdDev(sales []float64, mean float64) float64 {
|
||||
var sum float64
|
||||
for _, s := range sales {
|
||||
sum += math.Pow(s-mean, 2)
|
||||
}
|
||||
return math.Sqrt(sum / float64(len(sales)))
|
||||
}
|
Reference in New Issue
Block a user