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
|
|
|
|
}
|
|
|
|
|
|
|
|
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
|
|
|
|
}
|