예제 #1
0
    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 = ResultTypes.BusVoltage) -> ResultsModel:
        """
        Plot the results
        :param result_type:
        :return:
        """

        labels = self.bus_names
        y_label = ''
        x_label = ''
        title = ''
        if result_type == ResultTypes.BusVoltage:
            y = abs(np.array(self.voltages))
            x = self.lambdas
            title = 'Bus voltage'
            y_label = '(p.u.)'
            x_label = 'Loading from the base situation ($\lambda$)'
        else:
            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
예제 #3
0
    def mdl(self, result_type: ResultTypes):
        """
        Plot the results
        :param result_type:
        :return:
        """

        index = self.branch_names

        if result_type == ResultTypes.BusVoltageModule:
            data = np.abs(self.voltage)
            y_label = '(p.u.)'
            title = 'Bus voltage '
            labels = self.bus_names
            # index = self.branch_names

        elif result_type == ResultTypes.BusVoltageAngle:
            data = np.angle(self.voltage, deg=True)
            y_label = '(Deg)'
            title = 'Bus voltage '
            labels = self.bus_names
            # index = self.branch_names

        elif result_type == ResultTypes.BusActivePower:
            data = self.S.real
            y_label = '(MW)'
            title = 'Bus active power '
            labels = self.bus_names
            # index = self.branch_names

        elif result_type == ResultTypes.BranchActivePower:
            data = self.Sbranch.real
            y_label = 'MW'
            title = 'Branch active power '
            labels = ['# ' + x for x in self.branch_names]
            # index = self.branch_names

        elif result_type == ResultTypes.BranchLoading:
            data = self.loading.real * 100
            y_label = '(%)'
            title = 'Branch loading '
            labels = ['# ' + x for x in self.branch_names]
            # index = self.branch_names

        elif result_type == ResultTypes.OTDF:
            data = self.otdf
            y_label = 'Per unit'
            labels = ['# ' + x for x in self.branch_names]

            title = 'OTDF'
        else:
            raise Exception('Result type not understood:' + str(result_type))

        # assemble model
        mdl = ResultsModel(data=data,
                           index=index,
                           columns=labels,
                           title=title,
                           ylabel=y_label)
        return mdl
예제 #4
0
    def mdl(self, result_type=ResultTypes.BusVoltage, indices=None, names=None):
        """
        Plot the results
        :param result_type:
        :param ax:
        :param indices:
        :param names:
        :return:
        """

        if names is None:
            names = np.array(['bus ' + str(i + 1) for i in range(self.voltages.shape[1])])

        if indices is None:
            indices = np.array(range(len(names)))

        if len(indices) > 0:
            labels = names[indices]
            y_label = ''
            x_label = ''
            title = ''
            if result_type == ResultTypes.BusVoltage:
                y = abs(np.array(self.voltages)[:, indices])
                x = self.lambdas
                title = 'Bus voltage'
                y_label = '(p.u.)'
                x_label = 'Loading from the base situation ($\lambda$)'
            else:
                x = self.lambdas
                y = self.voltages[:, indices]

            # assemble model
            mdl = ResultsModel(data=y, index=x, columns=indices, title=title, ylabel=y_label, xlabel=x_label)
            return mdl
예제 #5
0
    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.flows_sensitivity_matrix[:, indices]
                y_label = '(p.u.)'
                title = 'Branches sensitivity'

            elif result_type == ResultTypes.PTDFBusVoltageSensitivity:
                y = self.voltage_sensitivity_matrix[:, indices]
                y_label = '(p.u.)'
                title = 'Buses voltage 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,
                               units=y_label)
            return mdl

        else:
            return None
예제 #6
0
    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
            y_label = '(MW)'
            title = 'Bus active 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)
예제 #7
0
    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
예제 #8
0
    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
예제 #9
0
    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
예제 #10
0
    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
예제 #11
0
    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
예제 #12
0
    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
예제 #13
0
    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
예제 #14
0
    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
예제 #15
0
    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
예제 #16
0
    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
예제 #17
0
    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
예제 #18
0
    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
예제 #19
0
    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
예제 #20
0
    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
예제 #21
0
    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