Source code for powersimdata.tests.mock_profile_input
import numpy as np
import pandas as pd
from powersimdata.input.grid import Grid
[docs]class MockProfileInput:
"""MockInputData is a mock of powersimdata.input.profile_input.ProfileInput
that generates random profiles.
Exactly 3 of {`start_time`, `end_time`, `periods`, `freq`} must be specified. See
<https://pandas.pydata.org/docs/reference/api/pandas.date_range.html>.
:param powersimdata.input.grid.Grid grid: instance of Grid object.
:param str start_time: when profiles begin.
:param str end_time: when profiles end.
:param int periods: number of times in profile.
:param str freq: frequency of times in profile.
:param int random_seed: used to initialize the random generator.
:raises ValueError: raised if `field_name` specified in `get_data()` is not
specified by this mock
:return: (*powersimdata.tests.mock_profile_input.MockProfileInput*)
"""
def __init__(
self,
grid: Grid,
start_time="2016-01-01 00:00:00",
end_time=None,
periods=24,
freq="H",
random_seed=6669,
):
self._grid = grid
self._resources = grid.model_immutables.plants["group_profile_resources"]
self._start_time = start_time
self._end_time = end_time
self._periods = periods
self._freq = freq
self._random = np.random.default_rng(seed=random_seed)
self._profiles = {
"demand": self._get_demand(),
**{
resource: self._get_resource_profile(resource)
for resource in sorted(self._resources.keys(), reverse=True)
},
}
self._profiles.update(self._get_demand_flexibility())
[docs] def get_data(self, scenario_info, field_name):
"""Returns fake profile data.
:param dict scenario_info: not used.
:param str field_name: Can be any of *'demand'*, *'hydro'*, *'solar'*, *'wind'*,
*'demand_flexibility_up'*, or *'demand_flexibility_dn'*.
:return: (*pandas.DataFrame*) -- fake profile data
"""
profile = self._profiles.get(field_name)
if profile is None:
raise ValueError(f"No profile specified for {field_name}!")
return profile
def _get_demand(self):
"""Returns fake demand data.
:return: (*pandas.DataFrame*) -- fake demand data
"""
zone_ids = self._grid.plant["zone_id"].unique()
fake_demand_profile = self._create_fake_profile(zone_ids)
return fake_demand_profile
def _get_demand_flexibility(self):
"""Returns fake flexible demand data.
:return: (*dict*) -- dictionary of fake flexibile demand data
"""
zone_ids = self._grid.plant["zone_id"].unique()
demand_flexibility_profile_types = [
"demand_flexibility_up",
"demand_flexibility_dn",
]
fake_demand_flexibility_profiles = {
p: self._create_fake_profile(zone_ids, demand_flexibility=True)
for p in demand_flexibility_profile_types
}
return fake_demand_flexibility_profiles
def _get_resource_profile(self, resource_type):
"""Returns fake data for given resource_type.
:param str resource_type: Can be any of *'hydro'*, *'solar'*, or *'wind'*.
:return: (*pandas.DataFrame*) -- fake data for resource
"""
plant_ids = self._get_plant_ids_for_type(resource_type)
fake_resource_profile = self._create_fake_profile(plant_ids)
return fake_resource_profile
def _get_plant_ids_for_type(self, resource_type):
"""Retrieves plant_ids for plants of `resource_type` from the grid.
:param str resource_type: Can be any of *'hydro'*, *'solar'*, or *'wind'*.
:return: (*list*) -- list of plant_ids
"""
resources = self._resources[resource_type]
plant_ids = list(self._grid.plant[lambda ds: ds.type.isin(resources)].index)
return plant_ids
def _create_fake_profile(self, columns, demand_flexibility=False):
"""Generates a fake profile.
:param list columns: columns for the DataFrame
:param bool demand_flexibility: indicates whether the fake profile being created
is a demand flexibility profile.
:return: (*pandas.DataFrame*) -- a fake profile
"""
times = pd.date_range(
start=self._start_time,
end=self._end_time,
periods=self._periods,
freq=self._freq,
)
index = pd.Index(times, name="UTC Time")
data = self._random.uniform(low=0, high=1, size=(len(times), len(columns)))
fake_profile = pd.DataFrame(data=data, index=index, columns=columns)
if demand_flexibility:
fake_profile.columns = [f"zone.{z}" for z in columns]
return fake_profile