Source code for citylearn.internal.loading_inputs

"""Prepare building time-series inputs using the loader's cache and windows."""
from __future__ import annotations

import os
from dataclasses import dataclass
from typing import TYPE_CHECKING

import numpy as np

from citylearn.data import CarbonIntensity, EnergySimulation, Pricing, Weather

if TYPE_CHECKING:
    from citylearn.internal.loading import CityLearnLoadingService


[docs] @dataclass(frozen=True) class BuildingInputs: energy_simulation: EnergySimulation weather: Weather carbon_intensity: CarbonIntensity pricing: Pricing time_step_ratio: float
[docs] def load_building_inputs(loader: "CityLearnLoadingService", building_name, schema, expected_rows, member_window) -> BuildingInputs: building_schema = schema['buildings'][building_name] seconds_per_time_step = schema['seconds_per_time_step'] noise_std = building_schema.get('noise_std', 0.0) energy_simulation_filepath = os.path.join(schema['root_directory'], building_schema['energy_simulation']) energy_simulation = loader._read_simulation_dataframe(schema, energy_simulation_filepath) energy_simulation = loader._align_dynamic_timeseries_dataframe( energy_simulation, expected_rows=expected_rows, window=member_window, source_label=f'buildings.{building_name}.energy_simulation', ) energy_simulation = EnergySimulation( **loader._dataframe_to_constructor_kwargs(energy_simulation), seconds_per_time_step=seconds_per_time_step, noise_std=noise_std, dataset_seconds_per_time_step=loader.env._time_axis.seconds, noise_seed=loader._noise_seed(schema, 'energy:'+building_name), noise_start_index=schema['simulation_start_time_step'], ) loader._set_time_step_offset(energy_simulation, schema['simulation_start_time_step']) ratios = getattr(energy_simulation, 'time_step_ratios', None) or [] time_step_ratio = ratios[-1] if len(ratios) > 0 else 1.0 loader._print_time_step_conversion_notice( building_name=building_name, source=energy_simulation_filepath, dataset_seconds_per_time_step=getattr(energy_simulation, 'dataset_seconds_per_time_step', None), seconds_per_time_step=seconds_per_time_step, time_step_ratio=time_step_ratio, ) weather_filepath = os.path.join(schema['root_directory'], building_schema['weather']) weather = loader._load_shared_timeseries( Weather, schema=schema, filepath=weather_filepath, expected_rows=expected_rows, window=member_window, source_label=f'buildings.{building_name}.weather', noise_std=noise_std, ) if building_schema.get('carbon_intensity', None) is not None: carbon_intensity_filepath = os.path.join(schema['root_directory'], building_schema['carbon_intensity']) carbon_intensity = loader._load_shared_timeseries( CarbonIntensity, schema=schema, filepath=carbon_intensity_filepath, expected_rows=expected_rows, window=member_window, source_label=f'buildings.{building_name}.carbon_intensity', noise_std=noise_std, ) else: carbon_intensity = CarbonIntensity(np.zeros(energy_simulation.hour.shape[0], dtype='float32'), noise_std=noise_std, noise_seed=loader._noise_seed(schema,'carbon:'+building_name), noise_start_index=schema['simulation_start_time_step']) loader._set_time_step_offset(carbon_intensity, schema['simulation_start_time_step']) if building_schema.get('pricing', None) is not None: pricing_filepath = os.path.join(schema['root_directory'], building_schema['pricing']) pricing = loader._load_shared_timeseries( Pricing, schema=schema, filepath=pricing_filepath, expected_rows=expected_rows, window=member_window, source_label=f'buildings.{building_name}.pricing', noise_std=noise_std, ) else: pricing = Pricing( np.zeros(energy_simulation.hour.shape[0], dtype='float32'), np.zeros(energy_simulation.hour.shape[0], dtype='float32'), np.zeros(energy_simulation.hour.shape[0], dtype='float32'), np.zeros(energy_simulation.hour.shape[0], dtype='float32'), noise_std=noise_std, noise_seed=loader._noise_seed(schema,'pricing:'+building_name), noise_start_index=schema['simulation_start_time_step'], ) loader._set_time_step_offset(pricing, schema['simulation_start_time_step']) return BuildingInputs(energy_simulation, weather, carbon_intensity, pricing, time_step_ratio)