def export_power( stats: List[StatExport] = None, priority: Optional[PriorityType] = None, latest: Optional[bool] = False, ) -> None: """ Export power stats from the export map """ # Not passed a stat map so go and get one if not stats: export_map = None if priority and priority == PriorityType.history: export_map = get_weekly_export_map() else: export_map = get_export_map().get_by_stat_type(StatType.power) if priority: export_map = export_map.get_by_priority(priority) stats = export_map.resources output_count: int = 0 logger.info("Running {}export {} with {} stats".format( "latest " if latest else "", priority, len(stats))) for power_stat in stats: if power_stat.stat_type != StatType.power: continue if output_count >= 1 and latest: return None date_range_networks = power_stat.networks or [] if NetworkNEM in date_range_networks: date_range_networks = [NetworkNEM] date_range: ScadaDateRange = get_scada_range( network=power_stat.network, networks=date_range_networks) logger.debug("Date range for {}: {} => {}".format( power_stat.network.code, date_range.start, date_range.end)) # Migrate to this time_series time_series = TimeSeries( start=date_range.start, end=date_range.end, network=power_stat.network, year=power_stat.year, interval=power_stat.interval, period=power_stat.period, ) stat_set = power_week( time_series=time_series, network_region_code=power_stat.network_region_query or power_stat.network_region, networks_query=power_stat.networks, ) if not stat_set: logger.info("No power stat set for {} {} {}".format( power_stat.period, power_stat.networks, power_stat.network_region, )) continue demand_set = demand_week( time_series=time_series, networks_query=power_stat.networks, network_region_code=power_stat.network_region_query or power_stat.network_region, ) stat_set.append_set(demand_set) if power_stat.network_region: flow_set = power_flows_region_week( time_series=time_series, network_region_code=power_stat.network_region, ) if flow_set: stat_set.append_set(flow_set) time_series_weather = time_series.copy() time_series_weather.interval = human_to_interval("30m") if power_stat.bom_station: try: weather_set = weather_daily( time_series=time_series_weather, station_code=power_stat.bom_station, network_region=power_stat.network_region, include_min_max=False, unit_name="temperature", ) stat_set.append_set(weather_set) except Exception: pass write_output(power_stat.path, stat_set) output_count += 1
def power_week( time_series: TimeSeries, network_region_code: str = None, networks_query: Optional[List[NetworkSchema]] = None, include_capacities: bool = False, include_code: Optional[bool] = True, ) -> Optional[OpennemDataSet]: engine = get_database_engine() query = power_network_fueltech_query( time_series=time_series, networks_query=networks_query, network_region=network_region_code, ) with engine.connect() as c: logger.debug(query) row = list(c.execute(query)) stats = [ DataQueryResult(interval=i[0], result=i[2], group_by=i[1] if len(i) > 1 else None) for i in row ] if len(stats) < 1: logger.error("No results from power week query with {}".format(time_series)) return None result = stats_factory( stats, # code=network_region_code or network.code, network=time_series.network, interval=time_series.interval, period=time_series.period, units=get_unit("power"), region=network_region_code, fueltech_group=True, include_code=include_code, ) if not result: logger.error("No results from power week status factory with {}".format(time_series)) return None if include_capacities and network_region_code: region_fueltech_capacities = get_facility_capacities( time_series.network, network_region_code ) for ft in result.data: if ft.fuel_tech in region_fueltech_capacities: ft.x_capacity_at_present = region_fueltech_capacities[ft.fuel_tech] # price time_series_price = time_series.copy() time_series_price.interval = human_to_interval("30m") query = price_network_query( time_series=time_series_price, networks_query=networks_query, network_region=network_region_code, ) with engine.connect() as c: logger.debug(query) row = list(c.execute(query)) stats_price = [ DataQueryResult(interval=i[0], result=i[2], group_by=i[1] if len(i) > 1 else None) for i in row ] stats_market_value = stats_factory( stats=stats_price, code=network_region_code or time_series.network.code.lower(), units=get_unit("price_energy_mega"), network=time_series.network, interval=human_to_interval("30m"), region=network_region_code, period=time_series.period, include_code=include_code, ) result.append_set(stats_market_value) # rooftop solar time_series_rooftop = time_series.copy() time_series_rooftop.interval = human_to_interval("30m") query = power_network_rooftop_query( time_series=time_series_rooftop, networks_query=networks_query, network_region=network_region_code, ) with engine.connect() as c: logger.debug(query) row = list(c.execute(query)) rooftop_power = [ DataQueryResult(interval=i[0], result=i[2], group_by=i[1] if len(i) > 1 else None) for i in row ] rooftop = stats_factory( rooftop_power, # code=network_region_code or network.code, network=time_series.network, interval=human_to_interval("30m"), period=time_series.period, units=get_unit("power"), region=network_region_code, fueltech_group=True, include_code=include_code, cast_nulls=False, ) # rooftop forecast rooftop_forecast = None if rooftop and rooftop.data and len(rooftop.data) > 0: time_series_rooftop_forecast = time_series_rooftop.copy() time_series_rooftop_forecast.start = rooftop.data[0].history.last time_series_rooftop_forecast.forecast = True query = power_network_rooftop_query( time_series=time_series_rooftop_forecast, networks_query=networks_query, network_region=network_region_code, forecast=True, ) with engine.connect() as c: logger.debug(query) row = list(c.execute(query)) rooftop_forecast_power = [ DataQueryResult(interval=i[0], result=i[2], group_by=i[1] if len(i) > 1 else None) for i in row ] rooftop_forecast = stats_factory( rooftop_forecast_power, # code=network_region_code or network.code, network=time_series.network, interval=human_to_interval("30m"), period=time_series.period, units=get_unit("power"), region=network_region_code, fueltech_group=True, include_code=include_code, cast_nulls=False, ) if rooftop and rooftop_forecast: if ( hasattr(rooftop, "data") and len(rooftop.data) > 0 and rooftop_forecast.data and len(rooftop_forecast.data) > 0 ): rooftop.data[0].forecast = rooftop_forecast.data[0].history result.append_set(rooftop) return result
def power_week( time_series: TimeSeries, network_region_code: str = None, networks_query: Optional[List[NetworkSchema]] = None, ) -> Optional[OpennemDataSet]: engine = get_database_engine() query = power_network_fueltech_query( time_series=time_series, networks_query=networks_query, network_region=network_region_code, ) with engine.connect() as c: logger.debug(query) row = list(c.execute(query)) stats = [ DataQueryResult(interval=i[0], result=i[2], group_by=i[1] if len(i) > 1 else None) for i in row ] if len(stats) < 1: raise Exception("No results from query: {}".format(query)) result = stats_factory( stats, # code=network_region_code or network.code, network=time_series.network, interval=time_series.interval, period=time_series.period, units=get_unit("power"), region=network_region_code, fueltech_group=True, ) if not result: raise Exception("No results") # price time_series_price = time_series.copy() time_series_price.interval = human_to_interval("30m") query = price_network_query( time_series=time_series_price, networks_query=networks_query, network_region=network_region_code, ) with engine.connect() as c: logger.debug(query) row = list(c.execute(query)) stats_price = [ DataQueryResult(interval=i[0], result=i[2], group_by=i[1] if len(i) > 1 else None) for i in row ] stats_market_value = stats_factory( stats=stats_price, code=network_region_code or time_series.network.code.lower(), units=get_unit("price_energy_mega"), network=time_series.network, interval=human_to_interval("30m"), region=network_region_code, period=time_series.period, ) result.append_set(stats_market_value) # rooftop solar time_series_rooftop = time_series.copy() time_series_rooftop.interval = human_to_interval("30m") query = power_network_rooftop_query( time_series=time_series_rooftop, networks_query=networks_query, network_region=network_region_code, ) with engine.connect() as c: logger.debug(query) row = list(c.execute(query)) rooftop_power = [ DataQueryResult(interval=i[0], result=i[2], group_by=i[1] if len(i) > 1 else None) for i in row ] rooftop = stats_factory( rooftop_power, # code=network_region_code or network.code, network=time_series.network, interval=human_to_interval("30m"), period=time_series.period, units=get_unit("power"), region=network_region_code, fueltech_group=True, ) # rooftop forecast time_series_rooftop_forecast = time_series.copy() time_series_rooftop_forecast.interval = human_to_interval("30m") time_series_rooftop_forecast.forecast = True query = power_network_rooftop_query( time_series=time_series_rooftop, networks_query=networks_query, network_region=network_region_code, forecast=True, ) with engine.connect() as c: logger.debug(query) row = list(c.execute(query)) rooftop_forecast_power = [ DataQueryResult(interval=i[0], result=i[2], group_by=i[1] if len(i) > 1 else None) for i in row ] rooftop_forecast = stats_factory( rooftop_forecast_power, # code=network_region_code or network.code, network=time_series.network, interval=human_to_interval("30m"), period=time_series.period, units=get_unit("power"), region=network_region_code, fueltech_group=True, ) if rooftop and rooftop_forecast: if (hasattr(rooftop, "data") and len(rooftop.data) > 0 and rooftop_forecast.data and len(rooftop_forecast.data) > 0): rooftop.data[0].forecast = rooftop_forecast.data[0].history result.append_set(rooftop) return result