Skip to content

Commit

Permalink
Merge pull request #50 from daithihearn/median-average
Browse files Browse the repository at this point in the history
Median average
  • Loading branch information
daithihearn authored Oct 30, 2023
2 parents 8c5df93 + d2de4b3 commit c069f0c
Show file tree
Hide file tree
Showing 7 changed files with 37 additions and 25 deletions.
2 changes: 1 addition & 1 deletion .version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.16.4
1.17.0
6 changes: 3 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
help:
@egrep -h '\s#@\s' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?#@ "}; {printf "\033[36m %-30s\033[0m %s\n", $$1, $$2}'

build-local: #@ Build local
build: #@ Build local
./gradlew clean build
build-image: #@ Build docker image
docker build -t electricity-prices . --load
image: #@ Build docker image
docker build -t electricity-prices . --load
12 changes: 12 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Electricity Prices API

An API for information about electricity prices in Spain. Data is scraped from [REData Api](https://www.ree.
es/en/apidatos) and [ESIOS](https://www.esios.ree.es/) and exposed via a [restful API](https://elec-api.daithiapp.com/).

This API supports a [dashboard application](https://elec.daithiapp.com/), an Alexa Skill and Flash briefing.

## Stack

- Kotlin
- Spring Boot
- MongoDB
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import org.springframework.boot.runApplication
info = Info(
title =
"Electricity Prices API",
version = "1.16.4",
version = "1.17.0",
description = "Returns PVPC electricity prices for a given range"
),
servers = [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package ie.daithi.electricityprices.model

import java.time.LocalDate

data class DailyMedian(
data class DailyAverage(
val date: LocalDate,
val median: Double
val average: Double
)
Original file line number Diff line number Diff line change
Expand Up @@ -64,24 +64,24 @@ class PriceService(
)
}

fun calculateDailyMedians(prices: List<Price>): List<DailyMedian> {
val medians = mutableListOf<DailyMedian>()
fun calculateDailyAverages(prices: List<Price>): List<DailyAverage> {
val averages = mutableListOf<DailyAverage>()
val dates = prices.map { it.dateTime.toLocalDate() }.distinct()
dates.forEach { date ->
val pricesForDay = prices.filter { it.dateTime.toLocalDate() == date }
val median = pricesForDay.map { it.price }.average()
medians.add(DailyMedian(date, median))
val average = pricesForDay.map { it.price }.average()
averages.add(DailyAverage(date, average))
}
return medians
return averages
}

fun getDailyMedians(date: LocalDate, numberOfDays: Long): List<DailyMedian> {
fun getDailyAverages(date: LocalDate, numberOfDays: Long): List<DailyAverage> {
val xDaysAgo = date.minusDays(numberOfDays).atStartOfDay().minusSeconds(1)
val today = date.plusDays(1).atStartOfDay().minusSeconds(1)

val prices = getPrices(xDaysAgo, today)
if (prices.isEmpty()) throw DataNotAvailableYetException("30 day median data not available for $date")
return calculateDailyMedians(prices)
if (prices.isEmpty()) throw DataNotAvailableYetException("30 day average data not available for $date")
return calculateDailyAverages(prices)
}

/*
Expand Down Expand Up @@ -201,4 +201,4 @@ class PriceService(

}

data class AveragePriceResult(val averagePrice: Double)
data class AveragePriceResult(val averagePrice: Double)
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package ie.daithi.electricityprices.web.controller

import ie.daithi.electricityprices.exceptions.DataNotAvailableYetException
import ie.daithi.electricityprices.exceptions.UnprocessableEntityException
import ie.daithi.electricityprices.model.DailyMedian
import ie.daithi.electricityprices.model.DailyAverage
import ie.daithi.electricityprices.model.DailyPriceInfo
import ie.daithi.electricityprices.model.Price
import ie.daithi.electricityprices.service.PriceService
Expand Down Expand Up @@ -134,11 +134,11 @@ class PriceController(
return priceSerice.getDailyPriceInfo(LocalDate.parse(date, dateFormatter))
}

@GetMapping("/price/medians")
@GetMapping("/price/averages")
@ResponseStatus(value = HttpStatus.OK)
@Operation(
summary = "Get 30 day medians",
description = "Return median values for the 30 days before the date provided. " +
summary = "Get 30 day averages",
description = "Return average values for the 30 days before the date provided. " +
"Dates should be given in a string form yyyy-MM-dd"
)
@Parameter(
Expand All @@ -163,7 +163,7 @@ class PriceController(
" \"status\": 404,\n" +
" \"error\": \"Not Found\",\n" +
" \"message\": \"No data available for 2024-01-01\",\n" +
" \"path\": \"/api/v1/price/medians?date=2024-01-01\"\n" +
" \"path\": \"/api/v1/price/averages?date=2024-01-01\"\n" +
"}"
)
]
Expand All @@ -180,7 +180,7 @@ class PriceController(
" \"status\": 422,\n" +
" \"error\": \"Unprocessable Entity\",\n" +
" \"message\": \"\"getDailyPriceInfo.date: The provided date is invalid. It must match yyyy-MM-dd\",\n" +
" \"path\": \"/api/v1/price/medians/incorrect\"\n" +
" \"path\": \"/api/v1/price/averages/incorrect\"\n" +
"}"
)
]
Expand All @@ -189,8 +189,8 @@ class PriceController(
]
)
@ResponseBody
fun getThirtyDayMedians(@ValidDateDay @RequestParam(required = false) date: String?): List<DailyMedian> {
fun getThirtyDayAverages(@ValidDateDay @RequestParam(required = false) date: String?): List<DailyAverage> {
val day = date?.let { LocalDate.parse(it, dateFormatter) } ?: LocalDate.now()
return priceSerice.getDailyMedians(day, 30)
return priceSerice.getDailyAverages(day, 30)
}
}
}

0 comments on commit c069f0c

Please sign in to comment.