def mdl(self, result_type: ResultTypes) -> ResultsModel: """ Plot the results. Arguments: **result_type**: ResultTypes **indices**: Indices f the array to plot (indices of the elements) **names**: Names of the elements Returns: DataFrame """ if result_type == ResultTypes.PTDFBranchesSensitivity: labels = self.br_names y = self.flows_sensitivity_matrix y_label = '(p.u.)' title = 'Branches sensitivity' elif result_type == ResultTypes.PTDFBusVoltageSensitivity: labels = self.bus_names y = self.voltage_sensitivity_matrix y_label = '(p.u.)' title = 'Buses voltage sensitivity' else: labels = [] y = np.zeros(0) y_label = '' title = '' # assemble model mdl = ResultsModel(data=y, index=self.get_var_names(), columns=labels, title=title, ylabel=y_label, units=y_label) return mdl
def mdl(self, result_type: ResultTypes, indices=None, names=None) -> ResultsModel: """ Plot the results. Arguments: **result_type**: ResultTypes **indices**: Indices f the array to plot (indices of the elements) **names**: Names of the elements Returns: DataFrame """ if indices is None and names is not None: indices = np.array(range(len(names))) if len(indices) > 0: labels = names[indices] if result_type == ResultTypes.PTDFBranchesSensitivity: y = self.sensitivity_matrix[:, indices] y_label = '(p.u.)' title = 'Branches sensitivity' else: n = len(labels) y = np.zeros(n) y_label = '' title = '' # assemble model mdl = ResultsModel(data=y, index=self.get_var_names(), columns=labels, title=title, ylabel=y_label) return mdl else: return None
def mdl(self, result_type: ResultTypes) -> ResultsModel: """ Plot the results. Arguments: **result_type**: ResultTypes Returns: ResultsModel """ if result_type == ResultTypes.PTDFBranchesSensitivity: labels = self.bus_names y = self.PTDF y_label = '(p.u.)' title = 'Branches sensitivity' elif result_type == ResultTypes.OTDF: labels = self.br_names y = self.LODF y_label = '(p.u.)' title = 'Branch failure sensitivity' else: labels = [] y = np.zeros(0) y_label = '' title = '' # assemble model mdl = ResultsModel(data=y, index=self.br_names, columns=labels, title=title, ylabel=y_label, units=y_label) return mdl
def mdl(self, result_type: ResultTypes) -> "ResultsModel": """ :param result_type: :param indices: :param names: :return: """ if result_type == ResultTypes.BusVoltageModule: labels = self.bus_names data = np.abs(self.voltage) y_label = '(p.u.)' title = 'Bus voltage ' elif result_type == ResultTypes.BusVoltageAngle: labels = self.bus_names data = np.angle(self.voltage, deg=True) y_label = '(Deg)' title = 'Bus voltage ' elif result_type == ResultTypes.BusActivePower: labels = self.bus_names data = self.S.real y_label = '(MW)' title = 'Bus active power ' elif result_type == ResultTypes.BusReactivePower: labels = self.bus_names data = self.S.imag y_label = '(MVAr)' title = 'Bus reactive power ' elif result_type == ResultTypes.BranchPower: labels = self.branch_names data = self.Sf y_label = '(MVA)' title = 'Branch power ' elif result_type == ResultTypes.BranchActivePowerFrom: labels = self.branch_names data = self.Sf.real y_label = '(MW)' title = 'Branch power ' elif result_type == ResultTypes.BranchReactivePowerFrom: labels = self.branch_names data = self.Sf.imag y_label = '(MVAr)' title = 'Branch power ' elif result_type == ResultTypes.BranchCurrent: labels = self.branch_names data = self.Ibranch y_label = '(kA)' title = 'Branch current ' elif result_type == ResultTypes.BranchActiveCurrentFrom: labels = self.branch_names data = self.Ibranch.real y_label = '(p.u.)' title = 'Branch current ' elif result_type == ResultTypes.BranchReactiveCurrentFrom: labels = self.branch_names data = self.Ibranch.imag y_label = '(p.u.)' title = 'Branch current ' elif result_type == ResultTypes.BranchLoading: labels = self.branch_names data = np.abs(self.loading) * 100 y_label = '(%)' title = 'Branch loading ' elif result_type == ResultTypes.BranchLosses: labels = self.branch_names data = self.losses y_label = '(MVA)' title = 'Branch losses' elif result_type == ResultTypes.BranchActiveLosses: labels = self.branch_names data = self.losses.real y_label = '(MW)' title = 'Branch losses' elif result_type == ResultTypes.BranchReactiveLosses: labels = self.branch_names data = self.losses.imag y_label = '(MVAr)' title = 'Branch losses' elif result_type == ResultTypes.BranchVoltage: labels = self.branch_names data = np.abs(self.Vbranch) y_label = '(p.u.)' title = result_type.value[0] elif result_type == ResultTypes.BranchAngles: labels = self.branch_names data = np.angle(self.Vbranch, deg=True) y_label = '(deg)' title = result_type.value[0] elif result_type == ResultTypes.BatteryPower: labels = self.branch_names data = np.zeros_like(self.losses) y_label = '$\Delta$ (MVA)' title = 'Battery power' elif result_type == ResultTypes.SimulationError: data = self.error_values.reshape(-1, 1) y_label = 'p.u.' labels = ['Error'] title = 'Error' elif result_type == ResultTypes.HvdcLosses: labels = self.hvdc_names data = self.hvdc_losses y_label = '(MW)' title = result_type.value elif result_type == ResultTypes.HvdcPowerFrom: labels = self.hvdc_names data = self.hvdc_Pf y_label = '(MW)' title = result_type.value elif result_type == ResultTypes.HvdcPowerTo: labels = self.hvdc_names data = self.hvdc_Pt y_label = '(MW)' title = result_type.value else: raise Exception('Result type not understood:' + str(result_type)) if self.time is not None: index = self.time else: index = list(range(data.shape[0])) # assemble model mdl = ResultsModel(data=data, index=index, columns=labels, title=title, ylabel=y_label, units=y_label) return mdl
def mdl(self, result_type: ResultTypes, indices=None, names=None) -> "ResultsModel": """ :param result_type: :param ax: :param indices: :param names: :return: """ if indices is None and names is not None: indices = np.array(range(len(names))) if len(indices) > 0: labels = names[indices] if result_type == ResultTypes.BusVoltageModule: y = np.abs(self.voltage[indices]) y_label = '(p.u.)' title = 'Bus voltage ' elif result_type == ResultTypes.BusVoltageAngle: y = np.angle(self.voltage[indices], deg=True) y_label = '(deg)' title = 'Bus voltage ' elif result_type == ResultTypes.BusVoltagePolar: y = self.voltage[indices] y_label = '(p.u.)' title = 'Bus voltage ' elif result_type == ResultTypes.BranchPower: y = self.Sbranch[indices] y_label = '(MVA)' title = 'Branch power ' elif result_type == ResultTypes.BranchTapModule: y = self.tap_module[indices] y_label = '(p.u.)' title = 'Branch tap module ' elif result_type == ResultTypes.BranchCurrent: y = self.Ibranch[indices] y_label = '(p.u.)' title = 'Branch current ' elif result_type == ResultTypes.BranchLoading: y = self.loading[indices] * 100 y_label = '(%)' title = 'Branch loading ' elif result_type == ResultTypes.BranchLosses: y = self.losses[indices] y_label = '(MVA)' title = 'Branch losses ' elif result_type == ResultTypes.BranchVoltage: y = np.abs(self.Vbranch[indices]) y_label = '(p.u.)' title = 'Branch voltage drop ' elif result_type == ResultTypes.BranchAngles: y = np.angle(self.Vbranch[indices], deg=True) y_label = '(deg)' title = 'Branch voltage angle ' elif result_type == ResultTypes.BatteryPower: if self.battery_power_inc is not None: y = self.battery_power_inc[indices] else: y = np.zeros(len(indices)) y_label = '(MVA)' title = 'Battery power' else: n = len(labels) y = np.zeros(n) y_label = '' title = '' # assemble model mdl = ResultsModel(data=y, index=labels, columns=[result_type.value[0]], title=title, ylabel=y_label) return mdl else: return None
def mdl(self, result_type) -> "ResultsModel": """ Plot the results :param result_type: :return: """ if result_type == ResultTypes.BusVoltageModule: labels = self.bus_names y = np.abs(self.voltage) y_label = '(p.u.)' title = 'Bus voltage module' elif result_type == ResultTypes.BusVoltageAngle: labels = self.bus_names y = np.angle(self.voltage) y_label = '(Radians)' title = 'Bus voltage angle' elif result_type == ResultTypes.ShadowPrices: labels = self.bus_names y = self.shadow_prices y_label = '(currency)' title = 'Bus shadow prices' elif result_type == ResultTypes.BranchPower: labels = self.branch_names y = self.Sbranch.real y_label = '(MW)' title = 'Branch power ' elif result_type == ResultTypes.BusPower: labels = self.bus_names y = self.Sbus.real y_label = '(MW)' title = 'Bus power ' elif result_type == ResultTypes.BranchLoading: labels = self.branch_names y = np.abs(self.loading * 100.0) y_label = '(%)' title = 'Branch loading ' elif result_type == ResultTypes.BranchOverloads: labels = self.branch_names y = np.abs(self.overloads) y_label = '(MW)' title = 'Branch overloads ' elif result_type == ResultTypes.BranchLosses: labels = self.branch_names y = self.losses.real y_label = '(MW)' title = 'Branch losses ' elif result_type == ResultTypes.LoadShedding: labels = self.load_names y = self.load_shedding y_label = '(MW)' title = 'Load shedding' elif result_type == ResultTypes.ControlledGeneratorPower: labels = self.generator_names y = self.generator_power y_label = '(MW)' title = 'Controlled generator power' elif result_type == ResultTypes.ControlledGeneratorShedding: labels = self.generator_names y = self.generator_shedding y_label = '(MW)' title = 'Controlled generator power' elif result_type == ResultTypes.BatteryPower: labels = self.battery_names y = self.battery_power y_label = '(MW)' title = 'Battery power' elif result_type == ResultTypes.BatteryEnergy: labels = self.battery_names y = self.battery_energy y_label = '(MWh)' title = 'Battery energy' else: labels = '' y_label = '' title = '' y = np.zeros(0) if self.time is not None: index = self.time else: index = np.arange(0, y.shape[0], 1) mdl = ResultsModel(data=y, index=index, columns=labels, title=title, ylabel=y_label, xlabel='', units=y_label) return mdl
def mdl(self, result_type, indices=None, names=None) -> "ResultsModel": """ Plot the results :param result_type: :param ax: :param indices: :param names: :return: """ if indices is None: indices = array(range(len(names))) if len(indices) > 0: labels = names[indices] y_label = '' title = '' if result_type == ResultTypes.BusVoltageModule: y = np.abs(self.voltage[:, indices]) y_label = '(p.u.)' title = 'Bus voltage module' elif result_type == ResultTypes.BusVoltageAngle: y = np.angle(self.voltage[:, indices]) y_label = '(Radians)' title = 'Bus voltage angle' elif result_type == ResultTypes.ShadowPrices: y = self.shadow_prices[:, indices] y_label = '(currency)' title = 'Bus shadow prices' elif result_type == ResultTypes.BranchPower: y = self.Sbranch[:, indices].real y_label = '(MW)' title = 'Branch power ' elif result_type == ResultTypes.BusPower: y = self.Sbus[:, indices].real y_label = '(MW)' title = 'Bus power ' elif result_type == ResultTypes.BranchLoading: y = np.abs(self.loading[:, indices] * 100.0) y_label = '(%)' title = 'Branch loading ' elif result_type == ResultTypes.BranchOverloads: y = np.abs(self.overloads[:, indices]) y_label = '(MW)' title = 'Branch overloads ' elif result_type == ResultTypes.BranchLosses: y = self.losses[:, indices].real y_label = '(MW)' title = 'Branch losses ' elif result_type == ResultTypes.LoadShedding: y = self.load_shedding[:, indices] y_label = '(MW)' title = 'Load shedding' elif result_type == ResultTypes.ControlledGeneratorPower: y = self.controlled_generator_power[:, indices] y_label = '(MW)' title = 'Controlled generator power' elif result_type == ResultTypes.ControlledGeneratorShedding: y = self.controlled_generator_shedding[:, indices] y_label = '(MW)' title = 'Controlled generator power' elif result_type == ResultTypes.BatteryPower: y = self.battery_power[:, indices] y_label = '(MW)' title = 'Battery power' elif result_type == ResultTypes.BatteryEnergy: y = self.battery_energy[:, indices] y_label = '(MWh)' title = 'Battery energy' else: print(str(result_type) + ' not understood.') # if self.time is not None: # df = pd.DataFrame(data=y, columns=labels, index=self.time) # else: # df = pd.DataFrame(data=y, columns=labels) # # df.fillna(0, inplace=True) # # if len(df.columns) > 10: # df.plot(ax=ax, linewidth=LINEWIDTH, legend=False) # else: # df.plot(ax=ax, linewidth=LINEWIDTH, legend=True) # # ax.set_title(title) # ax.set_ylabel(y_label) # ax.set_xlabel('Time') # # return df if self.time is not None: index = self.time else: index = np.arange(0, y.shape[0], 1) mdl = ResultsModel(data=y, index=index, columns=labels, title=title, ylabel=y_label, xlabel='') return mdl else: return None
def mdl(self, result_type: ResultTypes) -> "ResultsModel": """ Get ResultsModel instance :param result_type: :return: ResultsModel instance """ if result_type == ResultTypes.BusActivePower: labels = self.bus_names data = self.S.real y_label = '(MW)' title = 'Bus active power ' elif result_type == ResultTypes.BusReactivePower: labels = self.bus_names data = self.S.imag y_label = '(MVAr)' title = 'Bus reactive power ' elif result_type == ResultTypes.BranchPower: labels = self.branch_names data = self.Sbranch y_label = '(MVA)' title = 'Branch power ' elif result_type == ResultTypes.BranchActivePower: labels = self.branch_names data = self.Sbranch.real y_label = '(MW)' title = 'Branch power ' elif result_type == ResultTypes.BranchLoading: labels = self.branch_names data = self.loading * 100 y_label = '(%)' title = 'Branch loading ' elif result_type == ResultTypes.BranchLosses: labels = self.branch_names data = self.losses y_label = '(MVA)' title = 'Branch losses' elif result_type == ResultTypes.BusVoltageModule: labels = self.bus_names data = self.voltage y_label = '(p.u.)' title = 'Bus voltage' else: raise Exception('Result type not understood:' + str(result_type)) if self.time is not None: index = self.time else: index = list(range(data.shape[0])) # assemble model return ResultsModel(data=data, index=index, columns=labels, title=title, ylabel=y_label, units=y_label)
def mdl(self, result_type: ResultTypes) -> "ResultsModel": """ Plot the results :param result_type: :param ax: :param indices: :param names: :return: """ cdf_result_types = [ResultTypes.BusVoltageCDF, ResultTypes.BusPowerCDF, ResultTypes.BranchPowerCDF, ResultTypes.BranchLoadingCDF, ResultTypes.BranchLossesCDF] if result_type == ResultTypes.BusVoltageAverage: labels = self.bus_names y = self.v_avg_conv[1:-1, :] y_label = '(p.u.)' x_label = 'Sampling points' title = 'Bus voltage \naverage convergence' elif result_type == ResultTypes.BranchPowerAverage: labels = self.branch_names y = self.s_avg_conv[1:-1, :] y_label = '(MW)' x_label = 'Sampling points' title = 'Branch power \naverage convergence' elif result_type == ResultTypes.BranchLoadingAverage: labels = self.branch_names y = self.l_avg_conv[1:-1, :] y_label = '(%)' x_label = 'Sampling points' title = 'Branch loading \naverage convergence' elif result_type == ResultTypes.BranchLossesAverage: labels = self.branch_names y = self.loss_avg_conv[1:-1, :] y_label = '(MVA)' x_label = 'Sampling points' title = 'Branch losses \naverage convergence' elif result_type == ResultTypes.BusVoltageStd: labels = self.bus_names y = self.v_std_conv[1:-1, :] y_label = '(p.u.)' x_label = 'Sampling points' title = 'Bus voltage standard \ndeviation convergence' elif result_type == ResultTypes.BranchPowerStd: labels = self.branch_names y = self.s_std_conv[1:-1, :] y_label = '(MW)' x_label = 'Sampling points' title = 'Branch power standard \ndeviation convergence' elif result_type == ResultTypes.BranchLoadingStd: labels = self.branch_names y = self.l_std_conv[1:-1, :] y_label = '(%)' x_label = 'Sampling points' title = 'Branch loading standard \ndeviation convergence' elif result_type == ResultTypes.BranchLossesStd: labels = self.branch_names y = self.loss_std_conv[1:-1, :] y_label = '(MVA)' x_label = 'Sampling points' title = 'Branch losses standard \ndeviation convergence' elif result_type == ResultTypes.BusVoltageCDF: labels = self.bus_names cdf = CDF(np.abs(self.V_points)) y_label = '(p.u.)' x_label = 'Probability $P(X \leq x)$' title = result_type.value[0] elif result_type == ResultTypes.BranchLoadingCDF: labels = self.branch_names cdf = CDF(np.abs(self.loading_points.real)) y_label = '(p.u.)' x_label = 'Probability $P(X \leq x)$' title = result_type.value[0] elif result_type == ResultTypes.BranchLossesCDF: labels = self.branch_names cdf = CDF(np.abs(self.losses_points)) y_label = '(MVA)' x_label = 'Probability $P(X \leq x)$' title = result_type.value[0] elif result_type == ResultTypes.BranchPowerCDF: labels = self.branch_names cdf = CDF(self.Sbr_points.real) y_label = '(MW)' x_label = 'Probability $P(X \leq x)$' title = result_type.value[0] elif result_type == ResultTypes.BusPowerCDF: labels = self.bus_names cdf = CDF(self.S_points.real) y_label = '(p.u.)' x_label = 'Probability $P(X \leq x)$' title = result_type.value[0] else: x_label = '' y_label = '' title = '' if result_type not in cdf_result_types: # assemble model index = np.arange(0, y.shape[0], 1) mdl = ResultsModel(data=np.abs(y), index=index, columns=labels, title=title, ylabel=y_label, xlabel=x_label, units=y_label) else: mdl = ResultsModel(data=cdf.arr, index=cdf.prob, columns=labels, title=title, ylabel=y_label, xlabel=x_label, units=y_label) return mdl
def mdl(self, result_type) -> "ResultsModel": """ Plot the results :param result_type: type of results (string) :return: DataFrame of the results (or None if the result was not understood) """ if result_type == ResultTypes.BusVoltageModule: labels = self.bus_names y = np.abs(self.voltage) y_label = '(p.u.)' title = 'Bus voltage module' elif result_type == ResultTypes.BusVoltageAngle: labels = self.bus_names y = np.angle(self.voltage) y_label = '(Radians)' title = 'Bus voltage angle' elif result_type == ResultTypes.BranchPower: labels = self.branch_names y = self.Sf.real y_label = '(MW)' title = 'Branch power' elif result_type == ResultTypes.BusPower: labels = self.bus_names y = self.Sbus.real y_label = '(MW)' title = 'Bus power' elif result_type == ResultTypes.BranchLoading: labels = self.branch_names y = np.abs(self.loading * 100.0) y_label = '(%)' title = 'Branch loading' elif result_type == ResultTypes.BranchOverloads: labels = self.branch_names y = np.abs(self.overloads) y_label = '(MW)' title = 'Branch overloads' elif result_type == ResultTypes.BranchLosses: labels = self.branch_names y = self.losses.real y_label = '(MW)' title = 'Branch losses' elif result_type == ResultTypes.LoadShedding: labels = self.load_names y = self.load_shedding y_label = '(MW)' title = 'Load shedding' elif result_type == ResultTypes.ControlledGeneratorShedding: labels = self.generator_names y = self.generation_shedding y_label = '(MW)' title = 'Controlled generator shedding' elif result_type == ResultTypes.ControlledGeneratorPower: labels = self.generator_names y = self.generators_power y_label = '(MW)' title = 'Controlled generators power' elif result_type == ResultTypes.BatteryPower: labels = self.battery_names y = self.battery_power y_label = '(MW)' title = 'Battery power' else: labels = [] y = np.zeros(0) y_label = '(MW)' title = 'Battery power' mdl = ResultsModel(data=y, index=labels, columns=[result_type.value[0]], title=title, ylabel=y_label, xlabel='', units=y_label) return mdl
def mdl(self, result_type: ResultTypes) -> "ResultsModel": """ :param result_type: :param ax: :param indices: :param names: :return: """ if result_type == ResultTypes.BusVoltageModule: labels = self.bus_names y = np.abs(self.voltage) y_label = '(p.u.)' title = 'Bus voltage ' elif result_type == ResultTypes.BusVoltageAngle: labels = self.bus_names y = np.angle(self.voltage, deg=True) y_label = '(deg)' title = 'Bus voltage ' elif result_type == ResultTypes.BusVoltagePolar: labels = self.bus_names y = self.voltage y_label = '(p.u.)' title = 'Bus voltage ' elif result_type == ResultTypes.BranchPower: labels = self.branch_names y = self.Sbranch y_label = '(MVA)' title = 'Branch power ' elif result_type == ResultTypes.BranchActivePower: labels = self.branch_names y = self.Sbranch.real y_label = '(MW)' title = 'Branch active power ' elif result_type == ResultTypes.BranchReactivePower: labels = self.branch_names y = self.Sbranch.imag y_label = '(MVAr)' title = 'Branch reactive power ' elif result_type == ResultTypes.Transformer2WTapModule: labels = self.transformer_names y = self.tap_module y_label = '(p.u.)' title = 'Transformer tap module ' elif result_type == ResultTypes.BranchCurrent: labels = self.branch_names y = self.Ibranch y_label = '(p.u.)' title = 'Branch current ' elif result_type == ResultTypes.BranchActiveCurrent: labels = self.branch_names y = self.Ibranch.real y_label = '(p.u.)' title = 'Branch active current ' elif result_type == ResultTypes.BranchReactiveCurrent: labels = self.branch_names y = self.Ibranch.imag y_label = '(p.u.)' title = 'Branch reactive current ' elif result_type == ResultTypes.BranchLoading: labels = self.branch_names y = np.abs(self.loading) * 100 y_label = '(%)' title = 'Branch loading ' elif result_type == ResultTypes.BranchLosses: labels = self.branch_names y = self.losses y_label = '(MVA)' title = 'Branch losses ' elif result_type == ResultTypes.BranchActiveLosses: labels = self.branch_names y = self.losses.real y_label = '(MW)' title = 'Branch active losses ' elif result_type == ResultTypes.BranchReactiveLosses: labels = self.branch_names y = self.losses.imag y_label = '(MVAr)' title = 'Branch reactive losses ' elif result_type == ResultTypes.BranchVoltage: labels = self.branch_names y = np.abs(self.Vbranch) y_label = '(p.u.)' title = 'Branch voltage drop ' elif result_type == ResultTypes.BranchAngles: labels = self.branch_names y = np.angle(self.Vbranch, deg=True) y_label = '(deg)' title = 'Branch voltage angle ' elif result_type == ResultTypes.HvdcLosses: labels = self.hvdc_names y = self.hvdc_losses y_label = '(MW)' title = result_type.value elif result_type == ResultTypes.HvdcSentPower: labels = self.hvdc_names y = self.hvdc_sent_power y_label = '(MW)' title = result_type.value else: labels = [] n = 0 y = np.zeros(n) y_label = '' title = '' # assemble model mdl = ResultsModel(data=y, index=labels, columns=[result_type.value[0]], title=title, ylabel=y_label, units=y_label) return mdl
def mdl(self, result_type, indices=None, names=None) -> "ResultsModel": """ Plot the results Args: result_type: ax: indices: names: Returns: """ if indices is None: indices = np.array(range(len(names))) if len(indices) > 0: labels = names[indices] ylabel = '' title = '' if result_type == ResultTypes.BusVoltage: y = self.voltage[indices] ylabel = '(p.u.)' title = 'Bus voltage ' elif result_type == ResultTypes.BranchPower: y = self.Sbranch[indices] ylabel = '(MVA)' title = 'Branch power ' elif result_type == ResultTypes.BranchCurrent: y = self.Ibranch[indices] ylabel = '(p.u.)' title = 'Branch current ' elif result_type == ResultTypes.BranchLoading: y = self.loading[indices] * 100 ylabel = '(%)' title = 'Branch loading ' elif result_type == ResultTypes.BranchLosses: y = self.losses[indices] ylabel = '(MVA)' title = 'Branch losses ' elif result_type == ResultTypes.BusShortCircuitPower: y = self.short_circuit_power[indices] ylabel = '(MVA)' title = 'Bus short circuit power' else: pass mdl = ResultsModel(data=y, index=labels, columns=[result_type], title=title, ylabel=ylabel, xlabel='') return mdl else: return None
def mdl(self, result_type: ResultTypes, indices=None, names=None) -> "ResultsModel": """ Plot the results :param result_type: :param ax: :param indices: :param names: :return: """ p, n = self.V_points.shape cdf_result_types = [ ResultTypes.BusVoltageCDF, ResultTypes.BusPowerCDF, ResultTypes.BranchCurrentCDF, ResultTypes.BranchLoadingCDF, ResultTypes.BranchLossesCDF ] if indices is None: if names is None: indices = np.arange(0, n, 1) labels = None else: indices = np.array(range(len(names))) labels = names[indices] else: labels = names[indices] if len(indices) > 0: y_label = '' title = '' if result_type == ResultTypes.BusVoltageAverage: y = self.v_avg_conv[1:-1, indices] y_label = '(p.u.)' x_label = 'Sampling points' title = 'Bus voltage \naverage convergence' elif result_type == ResultTypes.BranchCurrentAverage: y = self.c_avg_conv[1:-1, indices] y_label = '(p.u.)' x_label = 'Sampling points' title = 'Bus current \naverage convergence' elif result_type == ResultTypes.BranchLoadingAverage: y = self.l_avg_conv[1:-1, indices] y_label = '(%)' x_label = 'Sampling points' title = 'Branch loading \naverage convergence' elif result_type == ResultTypes.BranchLossesAverage: y = self.loss_avg_conv[1:-1, indices] y_label = '(MVA)' x_label = 'Sampling points' title = 'Branch losses \naverage convergence' elif result_type == ResultTypes.BusVoltageStd: y = self.v_std_conv[1:-1, indices] y_label = '(p.u.)' x_label = 'Sampling points' title = 'Bus voltage standard \ndeviation convergence' elif result_type == ResultTypes.BranchCurrentStd: y = self.c_std_conv[1:-1, indices] y_label = '(p.u.)' x_label = 'Sampling points' title = 'Bus current standard \ndeviation convergence' elif result_type == ResultTypes.BranchLoadingStd: y = self.l_std_conv[1:-1, indices] y_label = '(%)' x_label = 'Sampling points' title = 'Branch loading standard \ndeviation convergence' elif result_type == ResultTypes.BranchLossesStd: y = self.loss_std_conv[1:-1, indices] y_label = '(MVA)' x_label = 'Sampling points' title = 'Branch losses standard \ndeviation convergence' elif result_type == ResultTypes.BusVoltageCDF: cdf = CDF(np.abs(self.V_points[:, indices])) # cdf.plot(ax=ax) y_label = '(p.u.)' x_label = 'Probability $P(X \leq x)$' title = result_type.value[0] elif result_type == ResultTypes.BranchLoadingCDF: cdf = CDF(np.abs(self.loading_points.real[:, indices])) # cdf.plot(ax=ax) y_label = '(p.u.)' x_label = 'Probability $P(X \leq x)$' title = result_type.value[0] elif result_type == ResultTypes.BranchLossesCDF: cdf = CDF(np.abs(self.losses_points[:, indices])) # cdf.plot(ax=ax) y_label = '(MVA)' x_label = 'Probability $P(X \leq x)$' title = result_type.value[0] elif result_type == ResultTypes.BranchCurrentCDF: cdf = CDF(np.abs(self.I_points[:, indices])) # cdf.plot(ax=ax) y_label = '(kA)' x_label = 'Probability $P(X \leq x)$' title = result_type.value[0] elif result_type == ResultTypes.BusPowerCDF: cdf = CDF(np.abs(self.S_points[:, indices])) # cdf.plot(ax=ax) y_label = '(p.u.)' x_label = 'Probability $P(X \leq x)$' title = result_type.value[0] else: x_label = '' y_label = '' title = '' if result_type not in cdf_result_types: # assemble model index = np.arange(0, y.shape[0], 1) mdl = ResultsModel(data=np.abs(y), index=index, columns=labels, title=title, ylabel=y_label, xlabel=x_label) else: mdl = ResultsModel(data=cdf.arr, index=cdf.prob, columns=labels, title=title, ylabel=y_label, xlabel=x_label) return mdl else: return None
def mdl(self, result_type, indices=None, names=None) -> "ResultsModel": """ Plot the results :param result_type: type of results (string) :param ax: matplotlib axis object :param indices: element indices :param names: element names :return: DataFrame of the results (or None if the result was not understood) """ if indices is None: indices = np.array(range(len(names))) if len(indices) > 0: labels = names[indices] y_label = '' title = '' if result_type == ResultTypes.BusVoltageModule: y = np.abs(self.voltage[indices]) y_label = '(p.u.)' title = 'Bus voltage module' if result_type == ResultTypes.BusVoltageAngle: y = np.angle(self.voltage[indices]) y_label = '(Radians)' title = 'Bus voltage angle' elif result_type == ResultTypes.BranchPower: y = self.Sbranch[indices].real y_label = '(MW)' title = 'Branch power ' elif result_type == ResultTypes.BusPower: y = self.Sbus[indices].real y_label = '(MW)' title = 'Bus power ' elif result_type == ResultTypes.BranchLoading: y = np.abs(self.loading[indices] * 100.0) y_label = '(%)' title = 'Branch loading ' elif result_type == ResultTypes.BranchOverloads: y = np.abs(self.overloads[indices]) y_label = '(MW)' title = 'Branch overloads ' elif result_type == ResultTypes.BranchLosses: y = self.losses[indices].real y_label = '(MW)' title = 'Branch losses ' elif result_type == ResultTypes.LoadShedding: y = self.load_shedding[indices] y_label = '(MW)' title = 'Load shedding' elif result_type == ResultTypes.ControlledGeneratorShedding: y = self.generation_shedding[indices] y_label = '(MW)' title = 'Controlled generator shedding' elif result_type == ResultTypes.ControlledGeneratorPower: y = self.controlled_generation_power[indices] y_label = '(MW)' title = 'Controlled generators power' elif result_type == ResultTypes.BatteryPower: y = self.battery_power[indices] y_label = '(MW)' title = 'Battery power' else: pass mdl = ResultsModel(data=y, index=labels, columns=[result_type], title=title, ylabel=y_label, xlabel='', units=y_label) return mdl else: return None
def mdl(self, result_type: ResultTypes) -> "ResultsModel": """ :param result_type: :return: """ if result_type == ResultTypes.BusVoltageModule: labels = self.bus_names y = np.abs(self.voltage) y_label = '(p.u.)' title = 'Bus voltage ' elif result_type == ResultTypes.BusVoltageAngle: labels = self.bus_names y = np.angle(self.voltage, deg=True) y_label = '(deg)' title = 'Bus voltage ' elif result_type == ResultTypes.BusActivePower: labels = self.bus_names y = self.Sbus.real y_label = '(MW)' title = 'Bus Active power ' elif result_type == ResultTypes.BusReactivePower: labels = self.bus_names y = self.Sbus.imag y_label = '(MVAr)' title = 'Bus Reactive power ' elif result_type == ResultTypes.BusVoltagePolar: labels = self.bus_names y = self.voltage y_label = '(p.u.)' title = 'Bus voltage ' elif result_type == ResultTypes.BranchPower: labels = self.branch_names y = self.Sf y_label = '(MVA)' title = 'Branch power ' elif result_type == ResultTypes.BranchActivePowerFrom: labels = self.branch_names y = self.Sf.real y_label = '(MW)' title = 'Branch active power ' elif result_type == ResultTypes.BranchReactivePowerFrom: labels = self.branch_names y = self.Sf.imag y_label = '(MVAr)' title = 'Branch reactive power ' elif result_type == ResultTypes.BranchActivePowerTo: labels = self.branch_names y = self.St.real y_label = '(MW)' title = 'Branch active power ' elif result_type == ResultTypes.BranchReactivePowerTo: labels = self.branch_names y = self.St.imag y_label = '(MVAr)' title = 'Branch reactive power ' elif result_type == ResultTypes.Transformer2WTapModule: labels = self.transformer_names y = self.transformer_tap_module y_label = '(p.u.)' title = 'Transformer tap module ' elif result_type == ResultTypes.BranchCurrent: labels = self.branch_names y = self.If y_label = '(p.u.)' title = 'Branch current ' elif result_type == ResultTypes.BranchActiveCurrentFrom: labels = self.branch_names y = self.If.real y_label = '(p.u.)' title = 'Branch active current ' elif result_type == ResultTypes.BranchReactiveCurrentFrom: labels = self.branch_names y = self.If.imag y_label = '(p.u.)' title = 'Branch reactive current ' elif result_type == ResultTypes.BranchActiveCurrentTo: labels = self.branch_names y = self.It.real y_label = '(p.u.)' title = 'Branch active current ' elif result_type == ResultTypes.BranchReactiveCurrentTo: labels = self.branch_names y = self.It.imag y_label = '(p.u.)' title = 'Branch reactive current ' elif result_type == ResultTypes.BranchLoading: labels = self.branch_names y = np.abs(self.loading) * 100 y_label = '(%)' title = 'Branch loading ' elif result_type == ResultTypes.BranchLosses: labels = self.branch_names y = self.losses y_label = '(MVA)' title = 'Branch losses ' elif result_type == ResultTypes.BranchActiveLosses: labels = self.branch_names y = self.losses.real y_label = '(MW)' title = 'Branch active losses ' elif result_type == ResultTypes.BranchReactiveLosses: labels = self.branch_names y = self.losses.imag y_label = '(MVAr)' title = 'Branch reactive losses ' elif result_type == ResultTypes.BranchVoltage: labels = self.branch_names y = np.abs(self.Vbranch) y_label = '(p.u.)' title = 'Branch voltage drop ' elif result_type == ResultTypes.BranchAngles: labels = self.branch_names y = np.angle(self.Vbranch, deg=True) y_label = '(deg)' title = 'Branch voltage angle ' elif result_type == ResultTypes.BranchTapModule: labels = self.branch_names y = self.ma y_label = '(p.u.)' title = 'Branch tap module ' elif result_type == ResultTypes.BranchTapAngle: labels = self.branch_names y = self.theta y_label = '(rad)' title = 'Branch tap angle ' elif result_type == ResultTypes.BranchBeq: labels = self.branch_names y = self.Beq y_label = '(p.u.)' title = 'Branch Beq ' elif result_type == ResultTypes.HvdcLosses: labels = self.hvdc_names y = self.hvdc_losses y_label = '(MW)' title = result_type.value elif result_type == ResultTypes.HvdcPowerFrom: labels = self.hvdc_names y = self.hvdc_Pf y_label = '(MW)' title = result_type.value elif result_type == ResultTypes.HvdcPowerTo: labels = self.hvdc_names y = self.hvdc_Pt y_label = '(MW)' title = result_type.value else: raise Exception('Unsupported result type: ' + str(result_type)) # assemble model mdl = ResultsModel(data=y, index=labels, columns=[result_type.value[0]], title=title, ylabel=y_label, units=y_label) return mdl
def mdl(self, result_type: ResultTypes, indices=None, names=None) -> "ResultsModel": """ :param result_type: :param indices: :param names: :return: """ if indices is None: indices = np.array(range(len(names))) if len(indices) > 0: labels = names[indices] if result_type == ResultTypes.BusVoltageModule: data = np.abs(self.voltage[:, indices]) y_label = '(p.u.)' title = 'Bus voltage ' elif result_type == ResultTypes.BusVoltageAngle: data = np.angle(self.voltage[:, indices], deg=True) y_label = '(Deg)' title = 'Bus voltage ' elif result_type == ResultTypes.BusActivePower: data = self.S[:, indices].real y_label = '(MW)' title = 'Bus active power ' elif result_type == ResultTypes.BusReactivePower: data = self.S[:, indices].imag y_label = '(MVAr)' title = 'Bus reactive power ' elif result_type == ResultTypes.BranchPower: data = self.Sbranch[:, indices] y_label = '(MVA)' title = 'Branch power ' elif result_type == ResultTypes.BranchCurrent: data = self.Ibranch[:, indices] y_label = '(kA)' title = 'Branch current ' elif result_type == ResultTypes.BranchLoading: data = self.loading[:, indices] * 100 y_label = '(%)' title = 'Branch loading ' elif result_type == ResultTypes.BranchLosses: data = self.losses[:, indices] y_label = '(MVA)' title = 'Branch losses' elif result_type == ResultTypes.BranchVoltage: data = np.abs(self.Vbranch[:, indices]) y_label = '(p.u.)' title = result_type.value[0] elif result_type == ResultTypes.BranchAngles: data = np.angle(self.Vbranch[:, indices], deg=True) y_label = '(deg)' title = result_type.value[0] elif result_type == ResultTypes.BatteryPower: data = np.zeros_like(self.losses[:, indices]) y_label = '$\Delta$ (MVA)' title = 'Battery power' elif result_type == ResultTypes.SimulationError: data = self.error.reshape(-1, 1) y_label = 'Per unit power' labels = [y_label] title = 'Error' else: raise Exception('Result type not understood:' + str(result_type)) if self.time is not None: index = self.time else: index = list(range(data.shape[0])) # assemble model mdl = ResultsModel(data=data, index=index, columns=labels, title=title, ylabel=y_label) return mdl else: return None
def mdl(self, result_type: ResultTypes, indices=None, names=None) -> "ResultsModel": """ :param result_type: :param ax: :param indices: :param names: :return: """ if indices is None and names is not None: indices = np.array(range(len(names))) if len(indices) > 0: labels = names[indices] if result_type == ResultTypes.SigmaDistances: y = np.abs(self.distances[indices]) y_label = '(p.u.)' title = 'Sigma distances ' elif result_type == ResultTypes.SigmaReal: y = self.sigma_re[indices] y_label = '(deg)' title = 'Real sigma ' elif result_type == ResultTypes.SigmaImag: y = self.sigma_im[indices] y_label = '(p.u.)' title = 'Imaginary Sigma ' elif result_type == ResultTypes.SigmaPlusDistances: y = np.c_[self.sigma_re[indices], self.sigma_im[indices], self.distances[indices]] y_label = '(p.u.)' title = 'Sigma and distances' mdl = ResultsModel( data=y, index=labels, columns=['σ real', 'σ imaginary', 'Distances'], title=title, ylabel=y_label, units=y_label) return mdl else: n = len(labels) y = np.zeros(n) y_label = '' title = '' # assemble model mdl = ResultsModel(data=y, index=labels, columns=[result_type.value[0]], title=title, ylabel=y_label, units=y_label) return mdl else: return None
def mdl(self, result_type: ResultTypes, indices=None, names=None) -> "ResultsModel": """ Get ResultsModel instance :param result_type: :param indices: :param names: :return: ResultsModel instance """ if indices is None: indices = np.array(range(len(names))) if len(indices) > 0: labels = names[indices] if result_type == ResultTypes.BusActivePower: data = self.S[:, indices].real y_label = '(MW)' title = 'Bus active power ' elif result_type == ResultTypes.BusReactivePower: data = self.S[:, indices].imag y_label = '(MVAr)' title = 'Bus reactive power ' elif result_type == ResultTypes.BranchPower: data = self.Sbranch[:, indices] y_label = '(MVA)' title = 'Branch power ' elif result_type == ResultTypes.BranchActivePower: data = self.Sbranch[:, indices].real y_label = '(MW)' title = 'Branch power ' elif result_type == ResultTypes.BranchLoading: data = self.loading[:, indices] * 100 y_label = '(%)' title = 'Branch loading ' elif result_type == ResultTypes.BranchLosses: data = self.losses[:, indices] y_label = '(MVA)' title = 'Branch losses' elif result_type == ResultTypes.BusVoltageModule: data = self.voltage[:, indices] y_label = '(p.u.)' title = 'Bus voltage' elif result_type == ResultTypes.SimulationError: data = self.error.reshape(-1, 1) y_label = 'Per unit power' labels = [y_label] title = 'Error' else: raise Exception('Result type not understood:' + str(result_type)) if self.time is not None: index = self.time else: index = list(range(data.shape[0])) # assemble model mdl = ResultsModel(data=data, index=index, columns=labels, title=title, ylabel=y_label, units=y_label) return mdl
def mdl(self, result_type: ResultTypes = ResultTypes.BusVoltage) -> ResultsModel: """ Plot the results :param result_type: :return: """ y_label = '' x_label = '' title = '' if result_type == ResultTypes.BusVoltage: labels = self.bus_names y = abs(np.array(self.voltages)) x = self.lambdas title = 'Bus voltage' y_label = '(p.u.)' x_label = 'Loading from the base situation ($\lambda$)' elif result_type == ResultTypes.BusActivePower: labels = self.bus_names y = self.Sbus.real x = self.lambdas title = 'Bus active power' y_label = '(p.u.)' x_label = 'Loading from the base situation ($\lambda$)' elif result_type == ResultTypes.BusReactivePower: labels = self.bus_names y = self.Sbus.imag x = self.lambdas title = 'Bus reactive power' y_label = '(p.u.)' x_label = 'Loading from the base situation ($\lambda$)' elif result_type == ResultTypes.BranchActivePowerFrom: labels = self.branch_names y = self.Sf.real x = self.lambdas title = 'Branch active power (from)' y_label = 'MW' x_label = 'Loading from the base situation ($\lambda$)' elif result_type == ResultTypes.BranchReactivePowerFrom: labels = self.branch_names y = self.Sf.imag x = self.lambdas title = 'Branch reactive power (from)' y_label = 'MVAr' x_label = 'Loading from the base situation ($\lambda$)' elif result_type == ResultTypes.BranchActivePowerTo: labels = self.branch_names y = self.St.real x = self.lambdas title = 'Branch active power (to)' y_label = 'MW' x_label = 'Loading from the base situation ($\lambda$)' elif result_type == ResultTypes.BranchReactivePowerTo: labels = self.branch_names y = self.St.imag x = self.lambdas title = 'Branch reactive power (to)' y_label = 'MVAr' x_label = 'Loading from the base situation ($\lambda$)' elif result_type == ResultTypes.BranchActiveLosses: labels = self.branch_names y = self.losses.real x = self.lambdas title = 'Branch active power losses' y_label = 'MW' x_label = 'Loading from the base situation ($\lambda$)' elif result_type == ResultTypes.BranchReactiveLosses: labels = self.branch_names y = self.losses.imag x = self.lambdas title = 'Branch reactive power losses' y_label = 'MVAr' x_label = 'Loading from the base situation ($\lambda$)' elif result_type == ResultTypes.BranchLoading: labels = self.branch_names y = np.abs(self.loading) * 100.0 x = self.lambdas title = 'Branch loading' y_label = '%' x_label = 'Loading from the base situation ($\lambda$)' else: labels = self.bus_names x = self.lambdas y = self.voltages # assemble model mdl = ResultsModel(data=y, index=x, columns=labels, title=title, ylabel=y_label, xlabel=x_label, units=y_label) return mdl