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 } if len(record) < 2 || record[1] == "." { continue } 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 }