Source code for kernel.basicObservers

# -*- coding: utf-8 -*-
"""
Definition of the class Observer
"""

import datetime as dt

import pandas as pd


[docs]class Observer(object): """ The observer classs - This class observe the agents and collects data """ def __init__(self, name, model, simulation, entity_class, agent_vars, path_to_results): """ Initialize the observer class """ self.name = name self.model = model self.simulation = simulation self.schedule = model.schedule self.observable_entity = entity_class self.agent_observables = {} self.agent_observation = {} self.observables_keys = {} self.observation_keys = {} self.obs_no = 0 self.filename = None self.add_observables_keys() self.observation = None self.agent_vars = agent_vars self.define_observable_vars() self.observables = None self.create_observables() self.path_to_results = path_to_results
[docs] def define_observable_entity(self, entity_class): """ Defines the type of agent that will be observed by this observer """ if entity_class not in self.model.dir(): raise ValueError('{entity_class} not defined in the current scope') self.observable_entity = entity_class
[docs] def add_observables_keys(self): """ Add general observable variables from the agent (model, simulation, scenario, run, step, time, agent_name) """ self.observables_keys = {'model': [self.model.name], 'simulation': [self.simulation.name], 'scenario': [self.schedule.scenario_name], 'run': [0], 'step': [0], 'time': [dt.datetime.now().isoformat(timespec='minutes')], 'agent_name': [' ']}
[docs] def update_observation_keys(self): """ Updates the general observable variables at each observation (step) """ self.observation_keys['model'] = self.model.name self.observation_keys['simulation'] = self.simulation.name self.observation_keys['scenario'] = self.schedule.scenario_name self.observation_keys['run'] = self.schedule.run_nr self.observation_keys['step'] = self.step self.observation_keys['time'] = dt.datetime.now().isoformat(timespec='minutes')
[docs] def define_observable_vars(self): """ Define the variables that observe will update in the observation (defined in the yaml file) """ if self.observable_entity is not None: for var in self.agent_vars: self.agent_observables[var] = [0] self.agent_observation[var] = " " else: raise ValueError('{observable_entity} not defined')
[docs] def basic_observation(self): """ Observer the agent variables """ self.first = True self.observation = None agents_to_observe = self.model.agents_of_type(self.observable_entity) self.update_observation_keys() for agent_name, agent in agents_to_observe.items(): self.observation_keys['agent_name'] = agent_name for agent_var_name in self.agent_observables.keys(): self.agent_observation[agent_var_name] = getattr(agent, agent_var_name) self.observation = {**self.observation_keys, **self.agent_observation} if self.first: self.set_observation() self.first = False else: self.append_observation()
[docs] def create_observables(self): """ Create the dictionary of observable variables (for the observation file) """ self.observables = {**self.observables_keys, **self.agent_observables}
[docs] def append_observation(self): """ Append an observation in the observables dictionary """ for var, value in self.observables.items(): value.append(self.observation[var])
[docs] def set_observation(self): """ Set an observation in the observables dictionary """ for var, value in self.observables.items(): value[0] = self.observation[var]
[docs] def create_dataframe(self): self.observations = pd.DataFrame(self.observables)
[docs] def save_dataframe(self, df_name): """ Create a dataframe to update the observations """ self.filename = self.path_to_results + df_name self.observations.to_csv(self.filename, index_label='index_no')
[docs] def observe(self, step): """ Observe the variables """ self.step = step self.basic_observation()