From 4381948f13e15ce9f720a0e3c7f22d823df8ffa4 Mon Sep 17 00:00:00 2001 From: Bobby Noelte Date: Fri, 17 Jul 2026 18:05:29 +0200 Subject: [PATCH] fix: price interpolation (#1154) Use forward fill to interpolate time series data that represents prices: - elecprice_marketprice_wh - feed_in_tariff_wh Signed-off-by: Bobby Noelte --- .env | 2 +- config.yaml | 2 +- docs/_generated/openapi.md | 2 +- openapi.json | 2 +- .../optimization/genetic/geneticsolution.py | 2 +- src/akkudoktoreos/server/eos.py | 1 + tests/single_test_optimization.py | 1 + tests/test_elecpriceakkudoktor.py | 4 +++- tests/test_elecpriceenergycharts.py | 2 ++ tests/test_elecpricefixed.py | 9 ++++++--- tests/test_elecpriceimport.py | 1 + 11 files changed, 19 insertions(+), 9 deletions(-) diff --git a/.env b/.env index 7dbd7476..215ce529 100644 --- a/.env +++ b/.env @@ -11,7 +11,7 @@ DOCKER_COMPOSE_DATA_DIR=${HOME}/.local/share/net.akkudoktor.eos # ----------------------------------------------------------------------------- # Image / build # ----------------------------------------------------------------------------- -VERSION=0.3.0.dev2607161979035365 +VERSION=0.3.0.dev2607171078037437 PYTHON_VERSION=3.13.9 # ----------------------------------------------------------------------------- diff --git a/config.yaml b/config.yaml index 1776ccc5..62363b5e 100644 --- a/config.yaml +++ b/config.yaml @@ -6,7 +6,7 @@ # the root directory (no add-on folder as usual). name: "Akkudoktor-EOS" -version: "0.3.0.dev2607161979035365" +version: "0.3.0.dev2607171078037437" slug: "eos" description: "Akkudoktor-EOS add-on" url: "https://github.com/Akkudoktor-EOS/EOS" diff --git a/docs/_generated/openapi.md b/docs/_generated/openapi.md index d497540f..c6d5512b 100644 --- a/docs/_generated/openapi.md +++ b/docs/_generated/openapi.md @@ -1,6 +1,6 @@ # Akkudoktor-EOS -**Version**: `v0.3.0.dev2607161979035365` +**Version**: `v0.3.0.dev2607171078037437` **Description**: This project provides a comprehensive solution for simulating and optimizing an energy system based on renewable energy sources. With a focus on photovoltaic (PV) systems, battery storage (batteries), load management (consumer requirements), heat pumps, electric vehicles, and consideration of electricity price data, this system enables forecasting and optimization of energy flow and costs over a specified period. diff --git a/openapi.json b/openapi.json index c6918060..e50c03cf 100644 --- a/openapi.json +++ b/openapi.json @@ -8,7 +8,7 @@ "name": "Apache 2.0", "url": "https://www.apache.org/licenses/LICENSE-2.0.html" }, - "version": "v0.3.0.dev2607161979035365" + "version": "v0.3.0.dev2607171078037437" }, "paths": { "/v1/admin/cache/clear": { diff --git a/src/akkudoktoreos/optimization/genetic/geneticsolution.py b/src/akkudoktoreos/optimization/genetic/geneticsolution.py index 7a317086..50a03ddb 100644 --- a/src/akkudoktoreos/optimization/genetic/geneticsolution.py +++ b/src/akkudoktoreos/optimization/genetic/geneticsolution.py @@ -582,7 +582,7 @@ class GeneticSolution(ConfigMixin, GeneticParametersBaseModel): ), ( "feed_in_tariff_wh", - "linear", + "ffill", "feed_in_tariff_amt_kwh", 1000.0, ), diff --git a/src/akkudoktoreos/server/eos.py b/src/akkudoktoreos/server/eos.py index f377cf7a..aefdbc55 100755 --- a/src/akkudoktoreos/server/eos.py +++ b/src/akkudoktoreos/server/eos.py @@ -1203,6 +1203,7 @@ async def fastapi_strompreis() -> list[float]: key="elecprice_marketprice_wh", start_datetime=start_datetime, end_datetime=end_datetime, + fill_method="ffill", ) elecprice_list = elecprice_array.tolist() except Exception as e: diff --git a/tests/single_test_optimization.py b/tests/single_test_optimization.py index 772ba09d..b384002c 100755 --- a/tests/single_test_optimization.py +++ b/tests/single_test_optimization.py @@ -153,6 +153,7 @@ async def prepare_optimization_real_parameters() -> GeneticOptimizationParameter key="elecprice_marketprice_wh", start_datetime=prediction_eos.ems_start_datetime, end_datetime=prediction_eos.end_datetime, + fill_method="ffill", ) print(f"strompreis_euro_pro_wh: {strompreis_euro_pro_wh}") diff --git a/tests/test_elecpriceakkudoktor.py b/tests/test_elecpriceakkudoktor.py index fd4dd90e..2b5bab03 100644 --- a/tests/test_elecpriceakkudoktor.py +++ b/tests/test_elecpriceakkudoktor.py @@ -127,11 +127,12 @@ class TestElecPriceAkkudokor: len(provider) == 73 ) # we have 48 datasets in the api response, we want to know 48h into the future. The data we get has already 23h into the future so we need only 25h more. 48+25=73 - # Assert we get hours prioce values by resampling + # Assert we get hours price values by resampling np_price_array = await provider.key_to_array( key="elecprice_marketprice_wh", start_datetime=provider.ems_start_datetime, end_datetime=provider.end_datetime, + fill_method="ffill", ) assert len(np_price_array) == provider.total_hours @@ -204,6 +205,7 @@ class TestElecPriceAkkudokor: key="elecprice_marketprice_wh", start_datetime=provider.ems_start_datetime, end_datetime=provider.end_datetime, + fill_method="ffill", ) assert isinstance(array, np.ndarray) assert len(array) == provider.total_hours diff --git a/tests/test_elecpriceenergycharts.py b/tests/test_elecpriceenergycharts.py index 71b8d922..ec01cbb4 100644 --- a/tests/test_elecpriceenergycharts.py +++ b/tests/test_elecpriceenergycharts.py @@ -129,6 +129,7 @@ class TestElecPriceEnergyCharts: key="elecprice_marketprice_wh", start_datetime=provider.ems_start_datetime, end_datetime=provider.end_datetime, + fill_method="ffill", ) assert len(np_price_array) == provider.total_hours @@ -195,6 +196,7 @@ class TestElecPriceEnergyCharts: key="elecprice_marketprice_wh", start_datetime=provider.ems_start_datetime, end_datetime=provider.end_datetime, + fill_method="ffill", ) assert isinstance(array, np.ndarray) assert len(array) == provider.total_hours diff --git a/tests/test_elecpricefixed.py b/tests/test_elecpricefixed.py index 86a1f8c7..340cc5d4 100644 --- a/tests/test_elecpricefixed.py +++ b/tests/test_elecpricefixed.py @@ -241,7 +241,8 @@ class TestElecPriceFixed: hourly_array = await provider.key_to_array( key="elecprice_marketprice_wh", start_datetime=start_dt, - end_datetime=start_dt.add(hours=24) + end_datetime=start_dt.add(hours=24), + fill_method="ffill", ) assert len(hourly_array) == 24 @@ -253,7 +254,8 @@ class TestElecPriceFixed: key="elecprice_marketprice_wh", start_datetime=start_dt, end_datetime=start_dt.add(hours=24), - interval="15 minutes" + interval="15 minutes", + fill_method="ffill", ) assert len(quarter_hour_array) == 96 # 24 * 4 @@ -266,7 +268,8 @@ class TestElecPriceFixed: key="elecprice_marketprice_wh", start_datetime=start_dt, end_datetime=start_dt.add(hours=24), - interval="30 minutes" + interval="30 minutes", + fill_method="ffill", ) assert len(half_hour_array) == 48 # 24 * 2 diff --git a/tests/test_elecpriceimport.py b/tests/test_elecpriceimport.py index f91c564b..a6833603 100644 --- a/tests/test_elecpriceimport.py +++ b/tests/test_elecpriceimport.py @@ -112,6 +112,7 @@ class TestElecPriceImport: start_datetime=provider.ems_start_datetime, end_datetime=provider.ems_start_datetime + to_duration(f"{len(expected_values)} hours"), interval=to_duration("1 hour"), + fill_method="ffill", ) # Allow for some difference due to value calculation on DST change npt.assert_allclose(result_values, expected_values, rtol=0.001)