Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10,101 changes: 950 additions & 9,151 deletions getting_started/Getting_Started.ipynb

Large diffs are not rendered by default.

10 changes: 4 additions & 6 deletions grid2bench/AgentsAnalytics.py
Original file line number Diff line number Diff line change
Expand Up @@ -927,14 +927,12 @@ def plot_actions_freq_by_substation_by_id(
return fig

@staticmethod
def visualize_grid_state(env_name: str, agent: EpisodesDataTransformer,
timestamp_str: str, **kwargs):
def visualize_grid_state(observation_space, agent: EpisodesDataTransformer,
episode_name: str, timestamp_str: str, **kwargs):

# uploading grid2op environment to get the observation_space
env = grid2op.make("l2rpn_neurips_2020_track1_small")
plot_helper = PlotMatplot(env.observation_space)
plot_helper = PlotMatplot(observation_space)

# get the observation
obs = agent.get_observation_by_timestamp(timestamp_str)
obs = agent.get_observation_by_timestamp(episode_name, timestamp_str)

return plot_helper.plot_obs(obs)
52 changes: 29 additions & 23 deletions grid2bench/EpisodesDataTransformer.py
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,8 @@ def get_action_by_timestamp(self, timestamp_str: str) -> BaseAction:
if timestamp in episode.timestamps:
return episode.get_action_by_timestamp(timestamp)

def get_observation_by_timestamp(self, timestamp_str: str) -> BaseObservation:
def get_observation_by_timestamp(self, episode_name: str,
timestamp_str: str) -> BaseObservation:
"""Get the grid2op Observation object whose timestamp is date_time.

:param timestamp_str: the datetime sought '%Y-%m-%d %H:%M:%S'
Expand All @@ -151,10 +152,14 @@ def get_observation_by_timestamp(self, timestamp_str: str) -> BaseObservation:
print(obs)

"""
for episode in self.episodes_data:
timestamp = datetime.strptime(timestamp_str, '%Y-%m-%d %H:%M:%S')
if timestamp in episode.timestamps:
return episode.get_observation_by_timestamp(timestamp)
idx = self.episodes_names.index(episode_name)
episode = self.episodes_data[idx]
timestamp = datetime.strptime(timestamp_str, '%Y-%m-%d %H:%M:%S')

return episode.get_observation_by_timestamp(timestamp)




def actions_freq_by_type_several_episodes(self, episodes_names: Optional[
List] = None) -> pd.DataFrame:
Expand Down Expand Up @@ -626,7 +631,7 @@ def display_sequence_actions_filter(self,

def action_sequences_to_dict(self, episodes_names: Optional[List] = None,
min_length: int = 0, max_length: int = 400) -> \
List[Dict]:
List[Dict]:
"""Helper function to transform sequence of actions df to dict.

Transform the data structure and prepare it for plotting with plotly's
Expand Down Expand Up @@ -657,8 +662,8 @@ def action_sequences_to_dict(self, episodes_names: Optional[List] = None,

return dict_list

def overloaded_lines_freq_several_episodes(self,
episodes_names: Optional[List] = None) -> pd.DataFrame:
def overloaded_lines_freq_several_episodes(self, episodes_names: Optional[
List] = None) -> pd.DataFrame:
"""Overloaded lines for all episodes in episodes_names.

If episodes_names=None, then returns the results of all loaded episodes.
Expand Down Expand Up @@ -698,8 +703,9 @@ def overloaded_lines_freq_several_episodes(self,
overloaded_lines_for_episode_i = episode_data.overloaded_lines_by_timestamp()

overloaded_lines_flatten = [list(item) for dict in
overloaded_lines_for_episode_i for key, item in dict.items() if
key == 'Overloaded lines']
overloaded_lines_for_episode_i for key, item
in dict.items() if
key == 'Overloaded lines']

overloaded_lines = overloaded_lines + overloaded_lines_flatten

Expand All @@ -717,8 +723,8 @@ def overloaded_lines_freq_several_episodes(self,

return df

def disconnected_lines_freq_several_episodes(self,
episodes_names: Optional[List] = None) -> pd.DataFrame:
def disconnected_lines_freq_several_episodes(self, episodes_names: Optional[
List] = None) -> pd.DataFrame:
"""Disconnected lines for all episodes in episodes_names.

If episodes_names=None, then returns the results of all loaded episodes.
Expand Down Expand Up @@ -757,8 +763,9 @@ def disconnected_lines_freq_several_episodes(self,
if episode_data.episode_name in episodes_names:
disconnected_lines_for_episode_i = episode_data.disconnected_lines_by_timestamp()
disconnected_lines_flatten = [list(item) for dict in
disconnected_lines_for_episode_i for key, item in dict.items() if
key == 'Disconnected lines']
disconnected_lines_for_episode_i for
key, item in dict.items() if
key == 'Disconnected lines']

disconnected_lines = disconnected_lines + disconnected_lines_flatten

Expand Down Expand Up @@ -798,11 +805,11 @@ def on_change(change):
if (not len(
episodes_names)) or episode_data.episode_name in episodes_names:
functions = {'Tolopology': episode_data.create_topology_df,
'Force_line': episode_data.create_force_line_df,
'Redispatching': episode_data.create_dispatch_df,
'Injection': episode_data.create_injection_df,
'Curtailment': episode_data.create_curtailment_df,
'Storage': episode_data.create_storage_df}
'Force_line': episode_data.create_force_line_df,
'Redispatching': episode_data.create_dispatch_df,
'Injection': episode_data.create_injection_df,
'Curtailment': episode_data.create_curtailment_df,
'Storage': episode_data.create_storage_df}
r = functions[change['new']]()
r[1]['episode_name'] = episode_data.episode_name
result = pd.concat([result, r[1]])
Expand Down Expand Up @@ -852,11 +859,10 @@ def get_action_by_id(self, action_id):
return act_episodes[action_id]

@staticmethod
def plot_actions_by_station_by_id(df,
title: Optional[str] = 'Frequency of actions by substation',
**fig_kwargs):
def plot_actions_by_station_by_id(df, title: Optional[
str] = 'Frequency of actions by substation', **fig_kwargs):

fig = px.sunburst(df, path=['susbtation', 'action_id'], values='nb_action',
title=title, )
title=title, )
fig.update_layout(**fig_kwargs)
return fig
Loading