Skip to content

Commit e48f8df

Browse files
author
Jan Pecinovsky
committed
Basic framework for simulation evaluation.
1 parent 7d5f5d3 commit e48f8df

5 files changed

Lines changed: 1033 additions & 0 deletions

File tree

openenergyid/const.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
ELECTRICITY_DELIVERED: Literal["electricity_delivered"] = "electricity_delivered"
88
ELECTRICITY_EXPORTED: Literal["electricity_exported"] = "electricity_exported"
99
ELECTRICITY_PRODUCED: Literal["electricity_produced"] = "electricity_produced"
10+
ELECTRICITY_CONSUMED: Literal["electricity_consumed"] = "electricity_consumed"
1011

1112
PRICE_DAY_AHEAD: Literal["price_day_ahead"] = "price_day_ahead"
1213
PRICE_IMBALANCE_UPWARD: Literal["price_imbalance_upward"] = "price_imbalance_upward"

openenergyid/simeval/__init__.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
"""Module containing basic evaluation functions for energy systems."""
2+
3+
from .main import evaluate
4+
from .models import EvaluationInput
5+
6+
__all__ = ["EvaluationInput", "evaluate"]

openenergyid/simeval/main.py

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
"""Module for evaluating energy simulation data."""
2+
3+
import pandas as pd
4+
5+
from .. import const
6+
7+
8+
def evaluate(
9+
data: pd.DataFrame, return_frequencies: list[str] | None = None
10+
) -> dict[str, pd.DataFrame]:
11+
"""Evaluate the data and return resampled results.
12+
13+
Args:
14+
data: A pandas DataFrame containing time series data with columns:
15+
- electricity_delivered
16+
- electricity_exported
17+
- electricity_produced
18+
return_frequencies: List of pandas offset aliases for resampling frequencies.
19+
Defaults to ['MS'] (Month Start) if None.
20+
21+
Returns:
22+
A dictionary with keys as frequencies and values as resampled DataFrames.
23+
"""
24+
evaluator = Evaluator(data=data, return_frequencies=return_frequencies)
25+
return evaluator.evaluate()
26+
27+
28+
class Evaluator:
29+
"""Evaluator for basic energy system evaluation."""
30+
31+
def __init__(self, data: pd.DataFrame, return_frequencies: list[str] | None = None):
32+
"""Initialize the evaluator with data and return frequencies."""
33+
self.data = data
34+
if return_frequencies is None:
35+
self.return_frequencies = ["MS"] # Month Start
36+
else:
37+
self.return_frequencies = return_frequencies
38+
39+
def evaluate(self) -> dict[str, pd.DataFrame]:
40+
"""Evaluate the data and return resampled results."""
41+
# Add electricy_consumed
42+
self.data[const.ELECTRICITY_CONSUMED] = (
43+
self.data[const.ELECTRICITY_DELIVERED]
44+
- self.data[const.ELECTRICITY_EXPORTED]
45+
+ self.data[const.ELECTRICITY_PRODUCED]
46+
)
47+
48+
results = {}
49+
for freq in self.return_frequencies:
50+
resampled = (
51+
self.data[
52+
[
53+
const.ELECTRICITY_DELIVERED,
54+
const.ELECTRICITY_EXPORTED,
55+
const.ELECTRICITY_PRODUCED,
56+
const.ELECTRICITY_CONSUMED,
57+
]
58+
]
59+
.resample(freq)
60+
.sum()
61+
)
62+
results[freq] = resampled
63+
return results

openenergyid/simeval/models.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
"""Models for basic energy system evaluation."""
2+
3+
from typing import Literal
4+
5+
from pydantic import Field, confloat, conlist
6+
7+
from ..models import TimeDataFrame
8+
9+
10+
class EvaluationInput(TimeDataFrame):
11+
"""Input frame for basic energy system evaluation."""
12+
13+
columns: list[
14+
Literal[
15+
"electricity_delivered",
16+
"electricity_exported",
17+
"electricity_produced",
18+
"price_electricity_delivered",
19+
"price_electricity_exported",
20+
]
21+
] = Field(min_length=1, max_length=5)
22+
data: list[conlist(item_type=confloat(allow_inf_nan=True), min_length=1, max_length=5)] # type: ignore

0 commit comments

Comments
 (0)