tijl.dev-core/internal/apps/inflation/util.go

142 lines
2.9 KiB
Go
Raw Normal View History

2024-09-08 01:01:29 +02:00
package inflation
import (
"encoding/csv"
"fmt"
"os"
"sort"
"strconv"
"time"
)
func getYearRange(processedData map[string]map[time.Time]float32) (int, int) {
var startYear, endYear int
for _, timeData := range processedData {
for date := range timeData {
year := date.Year()
if year < startYear || startYear == 0 {
startYear = year
}
if year > endYear || endYear == 0 {
endYear = year
}
}
}
return startYear, endYear
}
func createYearList(startYear, endYear int) []int32 {
years := make([]int32, 0, endYear-startYear+1)
for year := startYear; year <= endYear; year++ {
years = append(years, int32(year))
}
return years
}
func aggregateDataByYear(data map[time.Time]float32) map[int32]float32 {
yearlyData := make(map[int]float32)
for k, v := range data {
if _, exists := yearlyData[k.Year()]; !exists {
yearlyData[k.Year()] = 0
}
yearlyData[k.Year()] += v
}
aggregatedData := make(map[int32]float32)
for k, v := range yearlyData {
aggregatedData[int32(k)] = v
}
return aggregatedData
}
2024-09-08 12:16:04 +02:00
func toPercentNeg(m map[time.Time]float32) map[time.Time]float32 {
var times []time.Time
for t := range m {
times = append(times, t)
}
sort.Slice(times, func(i, j int) bool {
return times[i].Before(times[j])
})
percentageChanges := make(map[time.Time]float32)
var previousValue float32
for i, t := range times {
currentValue := m[t]
if i == 0 {
percentageChanges[t] = 0
} else {
percentageChange := ((currentValue - previousValue) / previousValue) * 100
percentageChanges[t] = -percentageChange
}
previousValue = currentValue
}
return percentageChanges
}
2024-09-08 01:01:29 +02:00
func toPercent(m map[time.Time]float32) map[time.Time]float32 {
var times []time.Time
for t := range m {
times = append(times, t)
}
sort.Slice(times, func(i, j int) bool {
return times[i].Before(times[j])
})
percentageChanges := make(map[time.Time]float32)
var previousValue float32
for i, t := range times {
currentValue := m[t]
if i == 0 {
percentageChanges[t] = 0
} else {
percentageChange := ((currentValue - previousValue) / previousValue) * 100
percentageChanges[t] = percentageChange
}
previousValue = currentValue
}
return percentageChanges
}
func readCSV(filePath string) (map[time.Time]float32, error) {
file, err := os.Open(filePath)
if err != nil {
return nil, err
}
defer file.Close()
csvReader := csv.NewReader(file)
records, err := csvReader.ReadAll()
if err != nil {
return nil, err
}
dataMap := make(map[time.Time]float32)
for i, record := range records {
if i == 0 {
continue
}
2024-09-08 01:31:07 +02:00
if len(record) < 2 || record[1] == "." {
continue
}
2024-09-08 01:01:29 +02:00
date, err := time.Parse("2006-01-02", record[0])
if err != nil {
return nil, fmt.Errorf("error parsing date on line %d: %v", i+1, err)
}
value, err := strconv.ParseFloat(record[1], 32)
if err != nil {
return nil, fmt.Errorf("error parsing float on line %d: %v", i+1, err)
}
dataMap[date] = float32(value)
}
return dataMap, nil
}