def _create_local_copy(old_act, region): """ Create a local copy of an activity. Update also the production exchange. """ act = copy.deepcopy(old_act) act.update({"location": region, "code": str(uuid.uuid4().hex)}) # update production exchange prods = list(ws.production(act, ws.equals("name", act["name"]))) if len(prods) == 1: prods[0]["location"] = region else: raise ValueError( "Multiple or no Production Exchanges found for {}.".format( old_act["name"])) return act
def get_shares_from_production_volume(ds): """ Return shares of supply based on production volumes :param ds: list of datasets :return: dictionary with (dataset name, dataset location) as keys, shares as values. Shares total 1. :rtype: dict """ dict_act = {} total_production_volume = 0 for act in ds: for exc in ws.production(act): dict_act[(act["name"], act["location"], act["reference product"], act["unit"])] = float( exc["production volume"] ) total_production_volume += float(exc["production volume"]) for d in dict_act: dict_act[d] /= total_production_volume return dict_act
def fetch_proxies(self, name, ref_prod): """ Fetch dataset proxies, given a dataset `name` and `reference product`. Store a copy for each REMIND region. If a REMIND region does not find a fitting ecoinvent location, fetch a dataset with a "RoW" location. Delete original datasets from the database. :return: """ d_map = { self.geo.ecoinvent_to_remind_location(d['location']): d['location'] for d in ws.get_many( self.db, ws.equals("name", name), ws.equals("reference product", ref_prod) ) } list_remind_regions = [ c[1] for c in self.geo.geo.keys() if type(c) == tuple and c[0] == "REMIND" ] d_remind_to_eco = {r: d_map.get(r, "RoW") for r in list_remind_regions} d_act = {} for d in d_remind_to_eco: try: ds = ws.get_one( self.db, ws.equals("name", name), ws.equals("reference product", ref_prod), ws.equals("location", d_remind_to_eco[d]), ) d_act[d] = copy.deepcopy(ds) d_act[d]["location"] = d d_act[d]["code"] = str(uuid.uuid4().hex) except ws.NoResults: print('No dataset {} found for the REMIND region {}'.format(name, d)) continue for prod in ws.production(d_act[d]): prod['location'] = d deleted_markets = [ (act['name'], act['reference product'], act['location']) for act in self.db if (act["name"], act['reference product']) == (name, ref_prod) ] with open(DATA_DIR / "logs/log deleted cement datasets.csv", "a") as csv_file: writer = csv.writer(csv_file, delimiter=';', lineterminator='\n') for line in deleted_markets: writer.writerow(line) # Remove old datasets self.db = [act for act in self.db if (act["name"], act['reference product']) != (name, ref_prod)] return d_act