|
3 | 3 | from datetime import datetime, timezone
|
4 | 4 | from typing import List, Optional, Union
|
5 | 5 |
|
6 |
| -from sqlalchemy import desc |
| 6 | +from sqlalchemy import desc, func |
7 | 7 | from sqlalchemy.orm import Session, contains_eager, joinedload
|
8 | 8 |
|
9 |
| -from nowcasting_datamodel.models import GSPYieldSQL, LocationSQL |
| 9 | +from nowcasting_datamodel.models import GSPYield, GSPYieldSQL, LocationSQL |
10 | 10 |
|
11 | 11 | logger = logging.getLogger(__name__)
|
12 | 12 |
|
@@ -217,3 +217,67 @@ def get_gsp_yield_by_location(
|
217 | 217 | gsp_yield.datetime_utc = gsp_yield.datetime_utc.replace(tzinfo=timezone.utc)
|
218 | 218 |
|
219 | 219 | 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 |
0 commit comments