Skip to content

Commit 0cec1bc

Browse files
Merge pull request #104 from openclimatefix/issue/read-forecast-read-latest
add function to get latest value from forecast table
2 parents 776febf + f59e0c7 commit 0cec1bc

File tree

2 files changed

+71
-0
lines changed

2 files changed

+71
-0
lines changed

nowcasting_datamodel/read/read.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,46 @@ def get_forecast_values(
403403
return forecasts
404404

405405

406+
def get_forecast_values_latest(
407+
session: Session,
408+
gsp_id: int,
409+
start_datetime: Optional[datetime] = None,
410+
) -> List[ForecastValueLatestSQL]:
411+
"""
412+
Get forecast values
413+
414+
:param session: database session
415+
:param gsp_id: gsp id, to filter query on
416+
:param start_datetime: optional to filterer target_time by start_datetime
417+
If None is given then all are returned.
418+
419+
return: List of forecasts values latest objects from database
420+
421+
"""
422+
423+
# start main query
424+
query = session.query(ForecastValueLatestSQL)
425+
426+
if start_datetime is not None:
427+
query = query.filter(ForecastValueLatestSQL.target_time >= start_datetime)
428+
429+
# also filter on creation time, to speed up things
430+
created_utc_filter = start_datetime - timedelta(days=1)
431+
query = query.filter(ForecastValueLatestSQL.created_utc >= created_utc_filter)
432+
433+
# filter on gsp_id
434+
if gsp_id is not None:
435+
query = query.filter(ForecastValueLatestSQL.gsp_id == gsp_id)
436+
437+
# order by target time and created time desc
438+
query = query.order_by(ForecastValueLatestSQL.target_time)
439+
440+
# get all results
441+
forecast_values_latest = query.all()
442+
443+
return forecast_values_latest
444+
445+
406446
def get_latest_national_forecast(
407447
session: Session,
408448
) -> ForecastSQL:

tests/read/test_read.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
get_all_gsp_ids_latest_forecast,
2727
get_all_locations,
2828
get_forecast_values,
29+
get_forecast_values_latest,
2930
get_latest_forecast,
3031
get_latest_forecast_created_utc,
3132
get_latest_input_data_last_updated,
@@ -144,6 +145,36 @@ def test_get_forecast_values_gsp_id(db_session, forecasts):
144145
assert forecast_values_read[0] == forecasts[0].forecast_values[0]
145146

146147

148+
def test_get_forecast_values_latest_gsp_id(db_session):
149+
150+
f1 = make_fake_forecasts(gsp_ids=[1, 2], session=db_session)
151+
f1[0].historic = True
152+
f1[0].forecast_values_latest = [
153+
ForecastValueLatestSQL(
154+
gsp_id=1,
155+
expected_power_generation_megawatts=1,
156+
target_time=datetime(2022, 1, 1, tzinfo=timezone.utc),
157+
),
158+
ForecastValueLatestSQL(
159+
gsp_id=1,
160+
expected_power_generation_megawatts=1,
161+
target_time=datetime(2022, 1, 1, 0, 30, tzinfo=timezone.utc),
162+
),
163+
]
164+
db_session.add_all(f1)
165+
assert len(db_session.query(ForecastValueLatestSQL).all()) == 2
166+
167+
forecast_values_read = get_forecast_values_latest(
168+
session=db_session, gsp_id=f1[0].location.gsp_id
169+
)
170+
_ = ForecastValue.from_orm(forecast_values_read[0])
171+
172+
assert len(forecast_values_read) == 2
173+
assert forecast_values_read[0].gsp_id == f1[0].location.gsp_id
174+
assert forecast_values_read[0].target_time == f1[0].forecast_values_latest[0].target_time
175+
assert forecast_values_read[0] == f1[0].forecast_values_latest[0]
176+
177+
147178
def test_get_latest_status(db_session):
148179
s1 = Status(message="Good", status="ok")
149180
s1 = s1.to_orm()

0 commit comments

Comments
 (0)