Skip to content

Commit

Permalink
Merge pull request #47 from daithihearn/bug-day-rating
Browse files Browse the repository at this point in the history
feat: if the expensive period is cheap return an empty list
  • Loading branch information
daithihearn authored Oct 27, 2023
2 parents eb92c77 + 3a6aae0 commit b2b5772
Show file tree
Hide file tree
Showing 5 changed files with 91 additions and 76 deletions.
2 changes: 1 addition & 1 deletion .version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.16.1
1.16.2
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.1",
version = "1.16.2",
description = "Returns PVPC electricity prices for a given range"
),
servers = [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ private fun calculateMaxVariance(prices: List<Price>): Double {
/**
* Calculate the variance for the cheap periods.
* This is calculated as:
* MIN((dailyAverage - cheapestPrice) / VARIANCE_DIVISOR, MAX_VARIANCE)
* MAX(MIN((dailyAverage - cheapestPrice) / VARIANCE_DIVISOR, MAX_VARIANCE), MIN_VARIANCE)
*/
fun calculateCheapVariance(prices: List<Price>, thirtyDayAverage: Double): Double {
val dailyAverage = calculateAverage(prices)
Expand All @@ -66,7 +66,7 @@ fun calculateCheapVariance(prices: List<Price>, thirtyDayAverage: Double): Doubl
/**
* Calculate the variance for the expensive periods.
* This is calculated as:
* MIN((expensivePrice - dailyAverage) / VARIANCE_DIVISOR, MAX_VARIANCE)
* MAX(MIN((expensivePrice - dailyAverage) / VARIANCE_DIVISOR, MAX_VARIANCE), MIN_VARIANCE)
*/
fun calculateExpensiveVariance(prices: List<Price>, thirtyDayAverage: Double): Double {
val dailyAverage = calculateAverage(prices)
Expand Down Expand Up @@ -128,6 +128,9 @@ fun getExpensivePeriods(
val variance = calculateExpensiveVariance(prices, thirtyDayAverage)
val expensivePrice = prices.maxByOrNull { it.price }?.price ?: return emptyList()

// If the most expensive price would be considered cheap, return empty list
if (expensivePrice < thirtyDayAverage - RATING_VARIANCE) return emptyList()

val expensivePrices = prices.filter { price ->
isWithinExpensivePriceVariance(
price.price,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -345,6 +345,12 @@ class PriceUtilsTest {
assert(periods[2][2].id == "20:00")
assert(periods[2][3].id == "21:00")
}

@Test
fun `getExpensivePeriods - very cheap`() {
val periods = getExpensivePeriods(pricesVeryCheap, 0.17)
assert(periods.isEmpty())
}
}

@Nested
Expand All @@ -354,5 +360,11 @@ class PriceUtilsTest {
val rating = calculateRating(calculateAverage(pricesVeryCheap), 0.17)
assert(rating == DayRating.GOOD)
}

@Test
fun `calculateRating - 2023-08-18`() {
val rating = calculateRating(calculateAverage(prices18), 0.14)
assert(rating == DayRating.BAD)
}
}
}
144 changes: 72 additions & 72 deletions src/test/resources/prices-very-cheap.json
Original file line number Diff line number Diff line change
@@ -1,122 +1,122 @@
[
{
"id": "9574a67ad335d6ec68cd5135cc574c7e",
"dateTime": "2023-10-27T00:00:00",
"price": 0.055380000000000006
"id": "af8a1d382e447d8f1a576ee610d26e3c",
"dateTime": "2023-10-28T00:00:00",
"price": 0.04933
},
{
"id": "bb98989182708a9867470801bded213a",
"dateTime": "2023-10-27T01:00:00",
"price": 0.04433
"id": "96661d851ad222f26e24a3f78a5afea4",
"dateTime": "2023-10-28T01:00:00",
"price": 0.03914
},
{
"id": "79228a61ca2cad28d9515bc026a15743",
"dateTime": "2023-10-27T02:00:00",
"price": 0.03725
"id": "5b2d7a55c67ff7eb4835bf8b4abaf843",
"dateTime": "2023-10-28T02:00:00",
"price": 0.04104
},
{
"id": "09887ea6dcb86402210a742d09e21fe6",
"dateTime": "2023-10-27T03:00:00",
"price": 0.039490000000000004
"id": "6ce3252e19548e3cb11084f57de10e01",
"dateTime": "2023-10-28T03:00:00",
"price": 0.04177
},
{
"id": "2df613622901a2868cd6e952fd79eeaa",
"dateTime": "2023-10-27T04:00:00",
"price": 0.03961
"id": "5b878956525877d7d3f4026af6f0a330",
"dateTime": "2023-10-28T04:00:00",
"price": 0.04243
},
{
"id": "59a425db67008a10ed74f820ca023ba0",
"dateTime": "2023-10-27T05:00:00",
"price": 0.038979999999999994
"id": "049b519777f205586444aa1bc9b964fe",
"dateTime": "2023-10-28T05:00:00",
"price": 0.04256
},
{
"id": "64157c445f6eba708555649a94f50033",
"dateTime": "2023-10-27T06:00:00",
"price": 0.05975
"id": "918eaa37f513c33bcd80543caa7487a3",
"dateTime": "2023-10-28T06:00:00",
"price": 0.04185
},
{
"id": "02d4153168e59cd8fe1c5a18149e6672",
"dateTime": "2023-10-27T07:00:00",
"price": 0.07698
"id": "4633a672858682bdde3d374f5017be66",
"dateTime": "2023-10-28T07:00:00",
"price": 0.039670000000000004
},
{
"id": "f0a40edadaad8363ea2baa8d121ed241",
"dateTime": "2023-10-27T08:00:00",
"price": 0.11128
"id": "067662ea5a5e82dd8ef508d1f2a69747",
"dateTime": "2023-10-28T08:00:00",
"price": 0.040420000000000005
},
{
"id": "5a985170fd387ac431407fd105c3bd13",
"dateTime": "2023-10-27T09:00:00",
"price": 0.10206
"id": "089316610f3953ba7fa1a8d73119cdcb",
"dateTime": "2023-10-28T09:00:00",
"price": 0.03007
},
{
"id": "9b781ee2f3c6a09ed7b5972348107a9e",
"dateTime": "2023-10-27T10:00:00",
"price": 0.12894999999999998
"id": "167e6ef354abb90c1e8a955b711d3d1b",
"dateTime": "2023-10-28T10:00:00",
"price": 0.02876
},
{
"id": "0d37c519690bf457182925e6de9f2aaf",
"dateTime": "2023-10-27T11:00:00",
"price": 0.10184
"id": "7b0bc6e84406da7cc0f0fe694006642d",
"dateTime": "2023-10-28T11:00:00",
"price": 0.027100000000000003
},
{
"id": "9899fa7ffeafa2e06b05908e211b56d0",
"dateTime": "2023-10-27T12:00:00",
"price": 0.10143
"id": "0d19466d6ecd4fe754dda7f4f6f7c6f9",
"dateTime": "2023-10-28T12:00:00",
"price": 0.02561
},
{
"id": "bd6a0148bdef8ae7111372c62f701e24",
"dateTime": "2023-10-27T13:00:00",
"price": 0.10112
"id": "ff390887d75e47f006c2d1146ba4b3a2",
"dateTime": "2023-10-28T13:00:00",
"price": 0.02442
},
{
"id": "4921c6a75bb2fbc4ca5a37e4ad98861e",
"dateTime": "2023-10-27T14:00:00",
"price": 0.05572
"id": "2056f60a4cfe8115077796451fd23f68",
"dateTime": "2023-10-28T14:00:00",
"price": 0.023829999999999997
},
{
"id": "8a9e50a221dc7a73df09d8b8bfe980b8",
"dateTime": "2023-10-27T15:00:00",
"price": 0.05634
"id": "9708e1a7f7a552518e23c8c52b94a00f",
"dateTime": "2023-10-28T15:00:00",
"price": 0.02687
},
{
"id": "564c6f8641024831ea25c7bba3078858",
"dateTime": "2023-10-27T16:00:00",
"price": 0.055170000000000004
"id": "1ef842b4d9af4df24004fdab9b8147f9",
"dateTime": "2023-10-28T16:00:00",
"price": 0.02723
},
{
"id": "5fb665ed08cdcf9195d414c70237db56",
"dateTime": "2023-10-27T17:00:00",
"price": 0.06769
"id": "d5c244983a37149539ec26240e8b7474",
"dateTime": "2023-10-28T17:00:00",
"price": 0.032049999999999995
},
{
"id": "9830bf44ef357e47880332b4efde2d87",
"dateTime": "2023-10-27T18:00:00",
"price": 0.14522
"id": "246b493a058469c119fbfc508cfe3c87",
"dateTime": "2023-10-28T18:00:00",
"price": 0.02936
},
{
"id": "3aa9bcb873c94edde13c1e5485860347",
"dateTime": "2023-10-27T19:00:00",
"price": 0.17209
"id": "9ccd7f3d0404dde9696656ff0b24c293",
"dateTime": "2023-10-28T19:00:00",
"price": 0.04413
},
{
"id": "d72ccda4294f28cbb433c3bd8e20c5a7",
"dateTime": "2023-10-27T20:00:00",
"price": 0.20752
"id": "e33e9929d53d8c2099170f4e9840a14f",
"dateTime": "2023-10-28T20:00:00",
"price": 0.05168
},
{
"id": "f3834391afd2e77e43ee1df426add21d",
"dateTime": "2023-10-27T21:00:00",
"price": 0.18164
"id": "63c568bb644a2995d2e52f11e353cb5b",
"dateTime": "2023-10-28T21:00:00",
"price": 0.04671
},
{
"id": "1606b4b7516df66ddd7bc076ebd15c69",
"dateTime": "2023-10-27T22:00:00",
"price": 0.1222
"id": "3c507cdd14f13d43260d35ac14abb383",
"dateTime": "2023-10-28T22:00:00",
"price": 0.04054
},
{
"id": "a34c79a1e44fc8d2033e19b1ffb0b041",
"dateTime": "2023-10-27T23:00:00",
"price": 0.10726000000000001
"id": "26cb2c9d6b42774c72cc7f673d5c9929",
"dateTime": "2023-10-28T23:00:00",
"price": 0.02597
}
]

0 comments on commit b2b5772

Please sign in to comment.