Пример #1
0
 def test_nodes_with_none_exclusion_old_name(self):
     param_results = processing.parameter_as_dict(self.es,
                                                  exclude_none=True)
     param_results = processing.convert_keys_to_strings(param_results,
                                                        keep_none_type=True)
     assert_series_equal(
         param_results[('storage', None)]['scalars'],
         pandas.Series({
             'balanced': True,
             'initial_storage_level': 0,
             'invest_relation_input_capacity': 1 / 6,
             'invest_relation_output_capacity': 1 / 6,
             'investment_ep_costs': 0.4,
             'investment_existing': 0,
             'investment_maximum': float('inf'),
             'investment_minimum': 0,
             'investment_nonconvex': False,
             'investment_offset': 0,
             'label': 'storage',
             'fixed_losses_absolute': 0,
             'fixed_losses_relative': 0,
             'inflow_conversion_factor': 1,
             'loss_rate': 0,
             'max_storage_level': 1,
             'min_storage_level': 0,
             'outflow_conversion_factor': 0.8,
         }))
     assert_frame_equal(param_results[('storage', None)]['sequences'],
                        pandas.DataFrame())
    marginal_cost=0.0001)

energysystem.add(bus_heat, heat_source, shortage, excess, heat_demand,
                 thermal_storage)

# Create and solve the optimization model
optimization_model = Model(energysystem)
optimization_model.solve(solver=solver,
                         solve_kwargs={
                             'tee': False,
                             'keepfiles': False
                         })

# Get results
results = processing.results(optimization_model)
string_results = processing.convert_keys_to_strings(results)
sequences = {k: v['sequences'] for k, v in string_results.items()}
df = pd.concat(sequences, axis=1)

# Print storage sizing
built_storage_capacity = results[thermal_storage, None]['scalars']['invest']
initial_storage_capacity = results[thermal_storage,
                                   None]['scalars']['init_content']
maximum_heat_flow_charging = results[bus_heat,
                                     thermal_storage]['scalars']['invest']

dash = '-' * 50
print(dash)
print('{:>32s}{:>15.3f}'.format('Invested capacity [MW]',
                                maximum_heat_flow_charging))
print('{:>32s}{:>15.3f}'.format('Invested storage capacity [MWh]',
Пример #3
0
def node(results, node, multiindex=False, keep_none_type=False):
    """
    Obtain results for a single node e.g. a Bus or Component.

    Either a node or its label string can be passed.
    Results are written into a dictionary which is keyed by 'scalars' and
    'sequences' holding respective data in a pandas Series and DataFrame.
    """
    def replace_none(col_list, reverse=False):
        replacement = (
            (None, NONE_REPLACEMENT_STR) if reverse else
            (NONE_REPLACEMENT_STR, None)
        )
        changed_col_list = [
            (
                (
                    replacement[0] if n1 is replacement[1] else n1,
                    replacement[0] if n2 is replacement[1] else n2
                ),
                f
            )
            for (n1, n2), f in col_list
        ]
        return changed_col_list

    # convert to keys if only a string is passed
    if type(node) is str:
        results = convert_keys_to_strings(results, keep_none_type)

    filtered = {}

    # create a series with tuples as index labels for scalars
    scalars = {k: v['scalars'] for k, v in results.items()
               if node in k and not v['scalars'].empty}
    if scalars:
        # aggregate data
        filtered['scalars'] = pd.concat(scalars.values(), axis=0)
        # assign index values
        idx = {k: [c for c in v['scalars'].index]
               for k, v in results.items()
               if node in k and not v['scalars'].empty}
        idx = [tuple((k, m) for m in v) for k, v in idx.items()]
        idx = [i for sublist in idx for i in sublist]
        filtered['scalars'].index = idx

        # Sort index
        # (if Nones are present, they have to be replaced while sorting)
        if keep_none_type:
            filtered['scalars'].index = replace_none(
                filtered['scalars'].index.tolist())
        filtered['scalars'].sort_index(axis=0, inplace=True)
        if keep_none_type:
            filtered['scalars'].index = replace_none(
                filtered['scalars'].index.tolist(), True)

        if multiindex:
            idx = pd.MultiIndex.from_tuples(
                [tuple([row[0][0], row[0][1], row[1]])
                 for row in filtered['scalars'].index])
            idx.set_names(['from', 'to', 'type'], inplace=True)
            filtered['scalars'].index = idx

    # create a dataframe with tuples as column labels for sequences
    sequences = {k: v['sequences'] for k, v in results.items()
                 if node in k and not v['sequences'].empty}
    if sequences:
        # aggregate data
        filtered['sequences'] = pd.concat(sequences.values(), axis=1)
        # assign column names
        cols = {k: [c for c in v['sequences'].columns]
                for k, v in results.items()
                if node in k and not v['sequences'].empty}
        cols = [tuple((k, m) for m in v) for k, v in cols.items()]
        cols = [c for sublist in cols for c in sublist]
        filtered['sequences'].columns = replace_none(cols)
        filtered['sequences'].sort_index(axis=1, inplace=True)
        filtered['sequences'].columns = replace_none(
            filtered['sequences'].columns, True)

        if multiindex:
            idx = pd.MultiIndex.from_tuples(
                [tuple([col[0][0], col[0][1], col[1]])
                 for col in filtered['sequences'].columns])
            idx.set_names(['from', 'to', 'type'], inplace=True)
            filtered['sequences'].columns = idx

    return filtered