Skip to content

Commit 06c2aa6

Browse files
add function to sum up gsp values (#203)
* add function to sum up gsp values * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * self PR comment * add end dateitme into test * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
1 parent c4a16d2 commit 06c2aa6

File tree

2 files changed

+89
-2
lines changed

2 files changed

+89
-2
lines changed

nowcasting_datamodel/read/read_gsp.py

Lines changed: 66 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
from datetime import datetime, timezone
44
from typing import List, Optional, Union
55

6-
from sqlalchemy import desc
6+
from sqlalchemy import desc, func
77
from sqlalchemy.orm import Session, contains_eager, joinedload
88

9-
from nowcasting_datamodel.models import GSPYieldSQL, LocationSQL
9+
from nowcasting_datamodel.models import GSPYield, GSPYieldSQL, LocationSQL
1010

1111
logger = logging.getLogger(__name__)
1212

@@ -217,3 +217,67 @@ def get_gsp_yield_by_location(
217217
gsp_yield.datetime_utc = gsp_yield.datetime_utc.replace(tzinfo=timezone.utc)
218218

219219
return locations
220+
221+
222+
def get_gsp_yield_sum(
223+
session: Session,
224+
gsp_ids: List[int],
225+
start_datetime_utc: datetime,
226+
regime: Optional[str] = None,
227+
end_datetime_utc: Optional[datetime] = None,
228+
) -> List[GSPYield]:
229+
"""
230+
Get the sum of gsp yield values.
231+
232+
:param session: sqlalchemy sessions
233+
:param gsp_ids: list of gsp ids that we filter on
234+
:param start_datetime_utc: filter values on this start datetime
235+
:param regime: filter query on this regim. Can be "in-day" or "day-after"
236+
:param end_datetime_utc: optional end datetime filter
237+
238+
:return: list of GSPYield objects
239+
"""
240+
241+
logger.info(f"Getting gsp yield sum for {len(gsp_ids)} gsp systems")
242+
243+
if regime is None:
244+
logger.debug("No regime given, defaulting to 'in-day'")
245+
regime = "in-day"
246+
247+
# start main query
248+
query = session.query(
249+
GSPYieldSQL.datetime_utc,
250+
func.sum(GSPYieldSQL.solar_generation_kw).label("solar_generation_kw"),
251+
)
252+
253+
# join with location table
254+
query = query.join(LocationSQL)
255+
256+
# select only the gsp systems we want
257+
query = query.where(LocationSQL.gsp_id.in_(gsp_ids))
258+
259+
# filter on regime
260+
query = query.where(GSPYieldSQL.regime == regime)
261+
262+
# filter on datetime
263+
query = query.where(GSPYieldSQL.datetime_utc >= start_datetime_utc)
264+
if end_datetime_utc is not None:
265+
query = query.where(GSPYieldSQL.datetime_utc <= end_datetime_utc)
266+
267+
# group and order by datetime
268+
query = query.group_by(GSPYieldSQL.datetime_utc)
269+
query = query.order_by(GSPYieldSQL.datetime_utc)
270+
271+
results = query.all()
272+
273+
# format results
274+
results = [
275+
GSPYield(
276+
datetime_utc=result.datetime_utc,
277+
solar_generation_kw=result.solar_generation_kw,
278+
regime=regime,
279+
)
280+
for result in results
281+
]
282+
283+
return results

tests/read/test_read_gsp.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
get_gsp_yield,
99
get_gsp_yield_by_location,
1010
get_latest_gsp_yield,
11+
get_gsp_yield_sum,
1112
)
1213

1314
logger = logging.getLogger(__name__)
@@ -218,3 +219,25 @@ def test_get_gsp_yield_by_location_extra(db_session):
218219
)
219220

220221
assert len(locations_with_gsp_yields) == 0
222+
223+
224+
def test_get_gsp_yield_sum(db_session):
225+
_ = setup_gsp_yields(db_session)
226+
227+
gsp_yields = get_gsp_yield_sum(
228+
session=db_session,
229+
gsp_ids=[1, 2],
230+
start_datetime_utc=datetime(2022, 1, 1),
231+
end_datetime_utc=datetime(2022, 1, 2),
232+
)
233+
234+
# read database
235+
assert len(gsp_yields) == 2
236+
237+
assert gsp_yields[0].datetime_utc == datetime(2022, 1, 1, tzinfo=timezone.utc)
238+
assert gsp_yields[1].datetime_utc == datetime(2022, 1, 2, tzinfo=timezone.utc)
239+
240+
assert (
241+
gsp_yields[0].solar_generation_kw == 4
242+
) # 2+2, see hard coded values in 'setup_gsp_yields'
243+
assert gsp_yields[1].solar_generation_kw == 1 # 1, see hard coded values in 'setup_gsp_yields'

0 commit comments

Comments
 (0)