Get all elementary flows generated by an activity in Brightway

296 Views Asked by At

I would like to access to all elementary flows generated by an activity in Brightway in a table that would gather the flows and the amounts.

Let's assume a random activity :

lca=bw.LCA({random_act:2761,method)
lca.lci()
lca.lcia()
lca.inventory 

I have tried several ways but none works :

  • I have tried to export my lci with brightway2-io but some errors appear that i cannot solve : bw2io.export.excel.lci_matrices_to_excel(db_name) returns an error when computing the biosphere matrix data for a specific row :

    --> 120     bm_sheet.write_number(bio_lookup[row] + 1, act_lookup[col] + 1, value)
        122 COLUMNS = (
        123     u"Index",
        124     u"Name",
       (...)
        128     u"Location",
        129 )
        131 tech_sheet = workbook.add_worksheet("technosphere-labels")
    
    KeyError: 1757 
    
    
  • I try to get manually the amount of a specific elementary flow. For example, let's say I want to compute the total amount of Aluminium needed for the activity. To do so, i try this:

    flow_Al=Database("biosphere3").search("Aluminium, in ground")

(I only want the resource Aluminium that is extracted as a ore, from the ground)

amount_Al=0
row = lca.biosphere_dict[flow_Al]
col_indices = lca.biosphere_matrix[row, :].tocoo()
amount_consumers_lca = [lca.inventory[row, index] for index in col_indices.col]
for j in amount_consumers_lca:
    amount_Al=amount_Al+j
amount_Al`

This works but the final amount is too low and probably isn't what i'm looking for...

How can I solve this ?

Thank you

1

There are 1 best solutions below

1
On BEST ANSWER

This will work on Brightway 2 and 2.5:

import pandas as pd
import bw2data as bd
import warnings


def create_inventory_dataframe(lca, cutoff=None):
    array = lca.inventory.sum(axis=1)

    if cutoff is not None and not (0 < cutoff < 1):
        warnings.warn(f"Ignoring invalid cutoff value {cutoff}")
        cutoff = None

    total = array.sum()
    include = lambda x: abs(x / total) >= cutoff if cutoff is not None else True

    if hasattr(lca, 'dicts'):
        mapping = lca.dicts.biosphere
    else:
        mapping = lca.biosphere_dict

    data = []

    for key, row in mapping.items():
        amount = array[row, 0]
        if include(amount):
            data.append((bd.get_activity(key), row, amount))

    data.sort(key=lambda x: abs(x[2]))

    return pd.DataFrame([{
            'row_index': row,
            'amount': amount,
            'name': flow.get('name'),
            'unit': flow.get('unit'),
            'categories': str(flow.get('categories'))
        } for flow, row, amount in data
    ])

The cutoff doesn't make sense for the inventory database, but it can be adapted for the LCIA result (characterized_inventory) as well.

Once you have a pandas DataFrame you can filter or export easily.