From 1a1f9bdc46db1025e475077810cb1d1b7fde1a83 Mon Sep 17 00:00:00 2001 From: romainsacchi Date: Fri, 6 Sep 2024 17:42:34 +0200 Subject: [PATCH] Fix unlinked exchanges with ei consequential 3.8/3.9 --- dev/Untitled.ipynb | 2 +- dev/test_consequential.ipynb | 759 ++++-------------- premise/__init__.py | 2 +- .../lci-PV-perovskite.xlsx | Bin 48864 -> 48839 bytes premise/new_database.py | 6 +- tests/test_process_ei38_conseq.py | 82 ++ tests/test_process_ei38_cutoff.py | 81 ++ tests/test_process_ei39_conseq.py | 82 ++ 8 files changed, 396 insertions(+), 618 deletions(-) create mode 100644 tests/test_process_ei38_conseq.py create mode 100644 tests/test_process_ei38_cutoff.py create mode 100644 tests/test_process_ei39_conseq.py diff --git a/dev/Untitled.ipynb b/dev/Untitled.ipynb index a601c5ce..88eb49ba 100644 --- a/dev/Untitled.ipynb +++ b/dev/Untitled.ipynb @@ -5227,7 +5227,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.13" + "version": "3.11.8" } }, "nbformat": 4, diff --git a/dev/test_consequential.ipynb b/dev/test_consequential.ipynb index b10cb7c6..6ffa34c6 100644 --- a/dev/test_consequential.ipynb +++ b/dev/test_consequential.ipynb @@ -9,7 +9,7 @@ "source": [ "import brightway2 as bw\n", "from premise import *\n", - "bw.projects.set_current(\"ei310\")" + "bw.projects.set_current(\"ecoinvent-3.10-consequential\")" ] }, { @@ -44,7 +44,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "1e6ebbae-2743-4e76-ab3d-e7a5dd873539", "metadata": {}, "outputs": [ @@ -52,7 +52,28 @@ "name": "stdout", "output_type": "stream", "text": [ - "premise v.(2, 1, 1, 'dev0')\n", + "Cache folder cleared!\n", + "premise requires the name of your biosphere database.\n", + "Please enter the name of your biosphere database as it appears in your project.\n", + "Databases dictionary with 4 object(s):\n", + "\tecoinvent-3.10-biosphere\n", + "\tecoinvent-3.10-consequential\n", + "\ttest1\n", + "\ttest2\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Name of the biosphere database: ecoinvent-3.10-biosphere\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "premise v.(2, 1, 2)\n", "+------------------------------------------------------------------+\n", "| Warning |\n", "+------------------------------------------------------------------+\n", @@ -82,10 +103,7 @@ "| ndb.generate_scenario_report() | important scenarios' variables. |\n", "+--------------------------------+----------------------------------+\n", "Keep uncertainty data?\n", - "NewDatabase(..., keep_uncertainty_data=True)\n", - "\n", - "Disable multiprocessing?\n", - "NewDatabase(..., use_multiprocessing=False)\n", + "NewDatabase(..., keep_source_db_uncertainty=True), keep_imports_uncertainty=True)\n", "\n", "Hide these messages?\n", "NewDatabase(..., quiet=True)\n", @@ -98,7 +116,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "100%|███████████████████████████████████████████████████████████████████████████████████████████████| 20772/20772 [00:00<00:00, 380432.91it/s]\n" + "100%|█████████████████████████████████████████████████████████████████████████| 20772/20772 [00:00<00:00, 121485.03it/s]\n" ] }, { @@ -112,7 +130,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "100%|██████████████████████████████████████████████████████████████████████████████████████████████| 610085/610085 [00:20<00:00, 30228.62it/s]\n" + "100%|████████████████████████████████████████████████████████████████████████| 610085/610085 [00:21<00:00, 29044.81it/s]\n" ] }, { @@ -126,7 +144,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "100%|████████████████████████████████████████████████████████████████████████████████████████████████| 20772/20772 [00:01<00:00, 11200.08it/s]\n" + "100%|██████████████████████████████████████████████████████████████████████████| 20772/20772 [00:01<00:00, 10814.53it/s]\n" ] }, { @@ -170,12 +188,7 @@ "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", "Remove uncertainty data.\n", - "Extracted 1 worksheets in 0.01 seconds\n", - "Migrating to 3.8 first\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", + "Extracted 1 worksheets in 0.02 seconds\n", "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", "Remove uncertainty data.\n", @@ -188,125 +201,55 @@ "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", "Remove uncertainty data.\n", - "Extracted 1 worksheets in 0.01 seconds\n", - "Migrating to 3.8 first\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", + "Extracted 4 worksheets in 0.17 seconds\n", + "Remove uncertainty data.\n", + "Extracted 1 worksheets in 0.02 seconds\n", "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", "Remove uncertainty data.\n", - "List of unlinked exchanges:\n", - "+-------------------------------------------------------+-------------------+----------+------------+----------+--------------+-----------------------+\n", - "| Name | Reference product | Location | Categories | Unit | Type | File |\n", - "+-------------------------------------------------------+-------------------+----------+------------+----------+--------------+-----------------------+\n", - "| industrial gases production, cryogenic air separation | nitrogen, liquid | RoW | None | kilogram | technosphere | lci-carbon-fiber.xlsx |\n", - "+-------------------------------------------------------+-------------------+----------+------------+----------+--------------+-----------------------+\n", "Extracted 7 worksheets in 0.03 seconds\n", - "Migrating to 3.8 first\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", "Remove uncertainty data.\n", - "List of unlinked exchanges:\n", - "+------------------------------------------------------------+-------------------------------------------------+----------+------------+----------+--------------+------------------+\n", - "| Name | Reference product | Location | Categories | Unit | Type | File |\n", - "+------------------------------------------------------------+-------------------------------------------------+----------+------------+----------+--------------+------------------+\n", - "| market for neutralising agent, sodium hydroxide-equivalent | neutralising agent, sodium hydroxide-equivalent | GLO | None | kilogram | technosphere | lci-lithium.xlsx |\n", - "+------------------------------------------------------------+-------------------------------------------------+----------+------------+----------+--------------+------------------+\n", "Extracted 1 worksheets in 0.02 seconds\n", - "Migrating to 3.8 first\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", "Remove uncertainty data.\n", "Extracted 1 worksheets in 0.01 seconds\n", - "Migrating to 3.8 first\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", "Remove uncertainty data.\n", - "List of unlinked exchanges:\n", - "+-----------------+-------------------+----------+------------+-----------+--------------+-------------------+\n", - "| Name | Reference product | Location | Categories | Unit | Type | File |\n", - "+-----------------+-------------------+----------+------------+-----------+--------------+-------------------+\n", - "| coke production | coal gas | RoW | None | megajoule | technosphere | lci-graphite.xlsx |\n", - "+-----------------+-------------------+----------+------------+-----------+--------------+-------------------+\n", - "Extracted 1 worksheets in 0.02 seconds\n", - "Migrating to 3.8 first\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", + "Extracted 1 worksheets in 0.03 seconds\n", "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", "Remove uncertainty data.\n", "Extracted 1 worksheets in 0.03 seconds\n", - "Migrating to 3.8 first\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", "Remove uncertainty data.\n", "Extracted 1 worksheets in 0.02 seconds\n", - "Migrating to 3.8 first\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", "Remove uncertainty data.\n", "Extracted 1 worksheets in 0.03 seconds\n", - "Migrating to 3.8 first\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", - "Could not find a biosphere flow for ('Iron, 72% in magnetite, 14% in crude ore', 'natural resource', 'in ground', 'kilogram') in /Users/romain/GitHub/premise/premise/data/additional_inventories/lci-vanadium.xlsx. Exchange deleted.\n", - "Could not find a biosphere flow for ('TiO2, 54% in ilmenite, 18% in crude ore, in ground', 'natural resource', 'in ground', 'kilogram') in /Users/romain/GitHub/premise/premise/data/additional_inventories/lci-vanadium.xlsx. Exchange deleted.\n", "Remove uncertainty data.\n", - "List of unlinked exchanges:\n", - "+-----------------------------------------------------------+---------------------------+----------+------------+-----------+--------------+-------------------+\n", - "| Name | Reference product | Location | Categories | Unit | Type | File |\n", - "+-----------------------------------------------------------+---------------------------+----------+------------+-----------+--------------+-------------------+\n", - "| hydrochloric acid production, Mannheim process | sodium sulfate, anhydrite | RER | None | kilogram | technosphere | lci-vanadium.xlsx |\n", - "| vanadium-titanomagnetite mine operation and beneficiation | iron ore concentrate | CN | None | kilogram | technosphere | lci-vanadium.xlsx |\n", - "| industrial gases production, cryogenic air separation | nitrogen, liquid | RoW | None | kilogram | technosphere | lci-vanadium.xlsx |\n", - "| blast furnace gas, Recycled Content cut-off | blast furnace gas | GLO | None | megajoule | technosphere | lci-vanadium.xlsx |\n", - "| blast furnace slag, Recycled Content cut-off | blast furnace slag | GLO | None | kilogram | technosphere | lci-vanadium.xlsx |\n", - "+-----------------------------------------------------------+---------------------------+----------+------------+-----------+--------------+-------------------+\n", - "Extracted 1 worksheets in 0.01 seconds\n", - "Migrating to 3.8 first\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", + "Extracted 1 worksheets in 0.02 seconds\n", "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", + "Remove uncertainty data.\n", + "Extracted 1 worksheets in 0.02 seconds\n", "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", "Remove uncertainty data.\n", - "List of unlinked exchanges:\n", - "+-------------------------------------------------------+-------------------+----------+------------+----------+--------------+------------------------+\n", - "| Name | Reference product | Location | Categories | Unit | Type | File |\n", - "+-------------------------------------------------------+-------------------+----------+------------+----------+--------------+------------------------+\n", - "| industrial gases production, cryogenic air separation | nitrogen, liquid | RoW | None | kilogram | technosphere | lci-batteries-SIB.xlsx |\n", - "+-------------------------------------------------------+-------------------+----------+------------+----------+--------------+------------------------+\n", + "Extracted 2 worksheets in 0.02 seconds\n", + "Remove uncertainty data.\n", "Extracted 1 worksheets in 0.01 seconds\n", - "Migrating to 3.8 first\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", "Remove uncertainty data.\n", - "Extracted 1 worksheets in 0.36 seconds\n", + "Extracted 1 worksheets in 0.31 seconds\n", "Migrating to 3.8 first\n", "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", @@ -336,39 +279,19 @@ "| vinyl fluoride production | vinyl fluoride | US | lci-PV.xlsx |\n", "| wafer factory construction | wafer factory | DE | lci-PV.xlsx |\n", "+--------------------------------+--------------------------------+----------+-------------+\n", - "List of unlinked exchanges:\n", - "+----------------------------------------------------------------+-------------------------------------------------------------+----------+------------+---------------+--------------+-------------+\n", - "| Name | Reference product | Location | Categories | Unit | Type | File |\n", - "+----------------------------------------------------------------+-------------------------------------------------------------+----------+------------+---------------+--------------+-------------+\n", - "| treatment of municipal solid waste, municipal incineration FAE | heat, for reuse in municipal waste incineration only | CH | None | megajoule | technosphere | lci-PV.xlsx |\n", - "| phenol production, cumene oxidation | acetone, liquid | RER | None | kilogram | technosphere | lci-PV.xlsx |\n", - "| industrial gases production, cryogenic air separation | nitrogen, liquid | RoW | None | kilogram | technosphere | lci-PV.xlsx |\n", - "| treatment of municipal solid waste, municipal incineration FAE | electricity, for reuse in municipal waste incineration only | CH | None | kilowatt hour | technosphere | lci-PV.xlsx |\n", - "+----------------------------------------------------------------+-------------------------------------------------------------+----------+------------+---------------+--------------+-------------+\n", - "Extracted 1 worksheets in 0.04 seconds\n", - "Migrating to 3.8 first\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", + "Extracted 1 worksheets in 0.02 seconds\n", "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", + "Remove uncertainty data.\n", + "Extracted 1 worksheets in 0.04 seconds\n", "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", "Remove uncertainty data.\n", "Extracted 1 worksheets in 0.01 seconds\n", - "Migrating to 3.8 first\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", "Remove uncertainty data.\n", "Extracted 1 worksheets in 0.02 seconds\n", - "Migrating to 3.8 first\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", "Remove uncertainty data.\n", @@ -430,7 +353,7 @@ "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", "Remove uncertainty data.\n", - "Extracted 1 worksheets in 0.01 seconds\n", + "Extracted 1 worksheets in 0.02 seconds\n", "Migrating to 3.8 first\n", "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", @@ -481,21 +404,11 @@ "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", "Remove uncertainty data.\n", - "Extracted 1 worksheets in 0.01 seconds\n", - "Migrating to 3.8 first\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", + "Extracted 1 worksheets in 0.00 seconds\n", "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", "Remove uncertainty data.\n", "Extracted 1 worksheets in 0.01 seconds\n", - "Migrating to 3.8 first\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", "Remove uncertainty data.\n", @@ -514,6 +427,10 @@ "+--------------------------------+--------------------------------+----------+--------------------------------+\n", "| methanol production facility, | methanol production facility, | RER | lci-synfuels-from-methanol-fro |\n", "+--------------------------------+--------------------------------+----------+--------------------------------+\n", + "Extracted 1 worksheets in 0.02 seconds\n", + "Applying strategy: migrate_datasets\n", + "Applying strategy: migrate_exchanges\n", + "Remove uncertainty data.\n", "Extracted 1 worksheets in 0.01 seconds\n", "Migrating to 3.8 first\n", "Applying strategy: migrate_datasets\n", @@ -595,105 +512,45 @@ "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", "Remove uncertainty data.\n", - "Extracted 1 worksheets in 0.00 seconds\n", - "Migrating to 3.8 first\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", + "Extracted 1 worksheets in 0.01 seconds\n", "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", "Remove uncertainty data.\n", "Extracted 1 worksheets in 0.07 seconds\n", - "Migrating to 3.8 first\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", "Remove uncertainty data.\n", "Extracted 1 worksheets in 0.01 seconds\n", - "Migrating to 3.8 first\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", "Remove uncertainty data.\n", "Extracted 1 worksheets in 0.01 seconds\n", - "Migrating to 3.8 first\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", "Remove uncertainty data.\n", "Extracted 1 worksheets in 0.02 seconds\n", - "Migrating to 3.8 first\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", "Remove uncertainty data.\n", "Extracted 1 worksheets in 0.01 seconds\n", - "Migrating to 3.8 first\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", - "Remove uncertainty data.\n", - "Extracted 1 worksheets in 0.02 seconds\n", - "Migrating to 3.8 first\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", "Remove uncertainty data.\n", "Extracted 1 worksheets in 0.01 seconds\n", - "Migrating to 3.8 first\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", "Remove uncertainty data.\n", "Extracted 1 worksheets in 0.01 seconds\n", - "Migrating to 3.8 first\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", "Remove uncertainty data.\n", "Extracted 1 worksheets in 0.04 seconds\n", - "Migrating to 3.8 first\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", "Remove uncertainty data.\n", "Extracted 1 worksheets in 0.01 seconds\n", - "Migrating to 3.8 first\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", - "Remove uncertainty data.\n", - "Extracted 1 worksheets in 0.01 seconds\n", - "Migrating to 3.8 first\n", - "Applying strategy: migrate_datasets\n", - "Applying strategy: migrate_exchanges\n", "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", "Remove uncertainty data.\n", - "Extracted 39 worksheets in 0.35 seconds\n", + "Extracted 19 worksheets in 1.40 seconds\n", "Migrating to 3.8 first\n", "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", @@ -702,7 +559,7 @@ "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", "Remove uncertainty data.\n", - "Extracted 1 worksheets in 0.20 seconds\n", + "Extracted 1 worksheets in 0.21 seconds\n", "Migrating to 3.8 first\n", "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", @@ -720,7 +577,7 @@ "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", "Remove uncertainty data.\n", - "Extracted 1 worksheets in 0.79 seconds\n", + "Extracted 1 worksheets in 0.92 seconds\n", "Migrating to 3.8 first\n", "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", @@ -729,6 +586,14 @@ "Applying strategy: migrate_datasets\n", "Applying strategy: migrate_exchanges\n", "Remove uncertainty data.\n", + "Extracted 1 worksheets in 0.03 seconds\n", + "Applying strategy: migrate_datasets\n", + "Applying strategy: migrate_exchanges\n", + "Remove uncertainty data.\n", + "Extracted 1 worksheets in 0.02 seconds\n", + "Remove uncertainty data.\n", + "Extracted 1 worksheets in 0.02 seconds\n", + "Remove uncertainty data.\n", "Data cached. It is advised to restart your workflow at this point.\n", "This allows premise to use the cached data instead, which results in\n", "a faster workflow.\n", @@ -738,200 +603,169 @@ "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", "| Region | Measurement method | Foresight? | Duration | Avg. start year | Avg. end year | Avg. capital repl. rate | Volume change |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| CAZ | 0 | False | False | 2031 | 2035 | -0.01 | 0.11 |\n", + "| CAZ | 0 | False | False | 2031 | 2035 | -0.01 | 0.15 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| CHA | 0 | False | False | 2031 | 2035 | -0.02 | 1.79 |\n", + "| CHA | 0 | False | False | 2030 | 2034 | -0.02 | 2.0 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| EUR | 0 | False | False | 2031 | 2035 | -0.02 | 0.46 |\n", + "| EUR | 0 | False | False | 2031 | 2035 | -0.03 | 0.64 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| IND | 0 | False | False | 2031 | 2035 | -0.03 | 0.73 |\n", + "| IND | 0 | False | False | 2031 | 2035 | -0.03 | 0.85 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| JPN | 0 | False | False | 2031 | 2035 | -0.02 | 0.01 |\n", + "| JPN | 0 | False | False | 2031 | 2035 | -0.02 | 0.07 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| LAM | 0 | False | False | 2031 | 2035 | -0.01 | 0.62 |\n", + "| LAM | 0 | False | False | 2030 | 2034 | -0.02 | 0.73 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| MEA | 0 | False | False | 2030 | 2034 | -0.03 | 0.52 |\n", + "| MEA | 0 | False | False | 2030 | 2034 | -0.03 | 0.42 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| NEU | 0 | False | False | 2031 | 2035 | -0.01 | 0.09 |\n", + "| NEU | 0 | False | False | 2031 | 2035 | -0.01 | 0.14 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| OAS | 0 | False | False | 2030 | 2034 | -0.02 | 0.82 |\n", + "| OAS | 0 | False | False | 2030 | 2034 | -0.02 | 0.85 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| REF | 0 | False | False | 2031 | 2035 | -0.02 | 0.2 |\n", + "| REF | 0 | False | False | 2031 | 2035 | -0.02 | 0.32 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| SSA | 0 | False | False | 2031 | 2035 | -0.02 | 0.44 |\n", + "| SSA | 0 | False | False | 2030 | 2034 | -0.02 | 0.42 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| USA | 0 | False | False | 2030 | 2034 | -0.03 | 0.56 |\n", + "| USA | 0 | False | False | 2030 | 2034 | -0.03 | 0.62 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| World | 0 | False | False | 2031 | 2035 | -0.02 | 6.4 |\n", + "| World | 0 | False | False | 2031 | 2035 | -0.02 | 7.66 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", "\n", "Summary of the petrol marginal market mixes:\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", "| Region | Measurement method | Foresight? | Duration | Avg. start year | Avg. end year | Avg. capital repl. rate | Volume change |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| CAZ | 0 | False | False | 2030 | 2034 | -0.03 | -0.03 |\n", + "| CAZ | 0 | False | False | 2030 | 2034 | -0.03 | -0.05 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| CHA | 0 | False | False | 2030 | 2034 | -0.03 | 0.02 |\n", + "| CHA | 0 | False | False | 2031 | 2035 | -0.03 | -0.03 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| EUR | 0 | False | False | 2031 | 2035 | -0.03 | -0.12 |\n", + "| EUR | 0 | False | False | 2031 | 2035 | -0.03 | -0.15 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| IND | 0 | False | False | 2031 | 2035 | -0.03 | 0.03 |\n", + "| IND | 0 | False | False | 2031 | 2035 | -0.03 | -0.06 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| JPN | 0 | False | False | 2031 | 2035 | -0.03 | 0.0 |\n", + "| JPN | 0 | False | False | 2031 | 2035 | -0.03 | 0.01 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| LAM | 0 | False | False | 2031 | 2035 | -0.03 | 0.08 |\n", + "| LAM | 0 | False | False | 2031 | 2035 | -0.03 | -0.07 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| MEA | 0 | False | False | 2030 | 2034 | -0.03 | -0.01 |\n", + "| MEA | 0 | False | False | 2031 | 2035 | -0.03 | -0.03 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| NEU | 0 | False | False | 2031 | 2035 | -0.03 | 0.0 |\n", + "| NEU | 0 | False | False | 2031 | 2035 | -0.03 | -0.0 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| OAS | 0 | False | False | 2031 | 2035 | -0.03 | -0.07 |\n", + "| OAS | 0 | False | False | 2031 | 2035 | -0.03 | -0.11 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", "| REF | 0 | False | False | 2031 | 2035 | -0.03 | -0.01 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| SSA | 0 | False | False | 2031 | 2035 | -0.03 | 0.11 |\n", + "| SSA | 0 | False | False | 2031 | 2035 | -0.03 | 0.02 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| USA | 0 | False | False | 2031 | 2035 | -0.03 | 0.1 |\n", + "| USA | 0 | False | False | 2031 | 2035 | -0.03 | 0.18 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| World | 0 | False | False | 2031 | 2035 | -0.03 | -0.14 |\n", + "| World | 0 | False | False | 2030 | 2034 | -0.03 | -0.59 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", "\n", "Summary of the diesel marginal market mixes:\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", "| Region | Measurement method | Foresight? | Duration | Avg. start year | Avg. end year | Avg. capital repl. rate | Volume change |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| CAZ | 0 | False | False | 2031 | 2035 | -0.03 | -0.14 |\n", + "| CAZ | 0 | False | False | 2031 | 2035 | -0.03 | -0.16 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| CHA | 0 | False | False | 2030 | 2034 | -0.03 | 0.0 |\n", + "| CHA | 0 | False | False | 2031 | 2035 | -0.03 | -0.08 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| EUR | 0 | False | False | 2031 | 2035 | -0.03 | -0.23 |\n", + "| EUR | 0 | False | False | 2031 | 2035 | -0.03 | -0.32 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| IND | 0 | False | False | 2030 | 2034 | -0.03 | 0.09 |\n", + "| IND | 0 | False | False | 2031 | 2035 | -0.03 | -0.08 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| JPN | 0 | False | False | 2031 | 2035 | -0.03 | -0.04 |\n", + "| JPN | 0 | False | False | 2030 | 2034 | -0.03 | -0.05 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| LAM | 0 | False | False | 2030 | 2034 | -0.03 | -0.05 |\n", + "| LAM | 0 | False | False | 2031 | 2035 | -0.03 | -0.1 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| MEA | 0 | False | False | 2031 | 2035 | -0.03 | -0.09 |\n", + "| MEA | 0 | False | False | 2031 | 2035 | -0.03 | -0.14 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| NEU | 0 | False | False | 2031 | 2035 | -0.03 | -0.01 |\n", + "| NEU | 0 | False | False | 2030 | 2034 | -0.03 | -0.02 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| OAS | 0 | False | False | 2031 | 2035 | -0.03 | -0.09 |\n", + "| OAS | 0 | False | False | 2031 | 2035 | -0.03 | -0.15 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| REF | 0 | False | False | 2031 | 2035 | -0.03 | -0.1 |\n", + "| REF | 0 | False | False | 2031 | 2035 | -0.03 | -0.11 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| SSA | 0 | False | False | 2030 | 2034 | -0.03 | 0.11 |\n", + "| SSA | 0 | False | False | 2030 | 2034 | -0.03 | 0.04 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| USA | 0 | False | False | 2030 | 2034 | -0.03 | -0.34 |\n", + "| USA | 0 | False | False | 2031 | 2035 | -0.03 | -0.49 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| World | 0 | False | False | 2031 | 2035 | -0.03 | -0.9 |\n", + "| World | 0 | False | False | 2031 | 2035 | -0.03 | -1.64 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", "\n", "Summary of the gas marginal market mixes:\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", "| Region | Measurement method | Foresight? | Duration | Avg. start year | Avg. end year | Avg. capital repl. rate | Volume change |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| CAZ | 0 | False | False | 2031 | 2035 | -0.03 | -0.13 |\n", + "| CAZ | 0 | False | False | 2031 | 2035 | -0.03 | -0.14 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| CHA | 0 | False | False | 2031 | 2035 | -0.03 | -0.14 |\n", + "| CHA | 0 | False | False | 2031 | 2035 | -0.03 | -0.28 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| EUR | 0 | False | False | 2031 | 2035 | -0.03 | -0.51 |\n", + "| EUR | 0 | False | False | 2031 | 2035 | -0.03 | -0.87 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", "| IND | 0 | False | False | 2031 | 2035 | -0.03 | -0.01 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| JPN | 0 | False | False | 2031 | 2035 | -0.03 | -0.06 |\n", + "| JPN | 0 | False | False | 2031 | 2035 | -0.03 | -0.09 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| LAM | 0 | False | False | 2031 | 2035 | -0.03 | -0.07 |\n", + "| LAM | 0 | False | False | 2031 | 2035 | -0.03 | -0.11 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| MEA | 0 | False | False | 2031 | 2035 | -0.03 | -0.33 |\n", + "| MEA | 0 | False | False | 2031 | 2035 | -0.03 | -0.36 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| NEU | 0 | False | False | 2031 | 2035 | -0.03 | -0.03 |\n", + "| NEU | 0 | False | False | 2031 | 2035 | -0.03 | -0.08 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| OAS | 0 | False | False | 2031 | 2035 | -0.03 | -0.06 |\n", + "| OAS | 0 | False | False | 2031 | 2035 | -0.03 | -0.26 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| REF | 0 | False | False | 2031 | 2035 | -0.03 | -0.43 |\n", + "| REF | 0 | False | False | 2031 | 2035 | -0.03 | -0.4 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| SSA | 0 | False | False | 2031 | 2035 | -0.03 | 0.05 |\n", + "| SSA | 0 | False | False | 2031 | 2035 | -0.03 | 0.0 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| USA | 0 | False | False | 2031 | 2035 | -0.03 | -0.68 |\n", + "| USA | 0 | False | False | 2031 | 2035 | -0.03 | -0.8 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| World | 0 | False | False | 2031 | 2035 | -0.03 | -2.41 |\n", + "| World | 0 | False | False | 2031 | 2035 | -0.03 | -3.41 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", "\n", "Summary of the hydrogen marginal market mixes:\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", "| Region | Measurement method | Foresight? | Duration | Avg. start year | Avg. end year | Avg. capital repl. rate | Volume change |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| CAZ | 0 | False | False | 2031 | 2035 | -0.03 | 0.03 |\n", + "| CAZ | 0 | False | False | 2031 | 2035 | -0.03 | 0.05 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| CHA | 0 | False | False | 2031 | 2035 | -0.03 | 0.07 |\n", + "| CHA | 0 | False | False | 2030 | 2034 | -0.03 | 0.29 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| EUR | 0 | False | False | 2031 | 2035 | -0.03 | 0.12 |\n", + "| EUR | 0 | False | False | 2030 | 2034 | -0.03 | 0.26 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| IND | 0 | False | False | 2031 | 2035 | -0.03 | 0.13 |\n", + "| IND | 0 | False | False | 2031 | 2035 | -0.03 | 0.14 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| JPN | 0 | False | False | 2031 | 2035 | -0.03 | 0.06 |\n", + "| JPN | 0 | False | False | 2030 | 2034 | -0.03 | 0.06 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| LAM | 0 | False | False | 2031 | 2035 | -0.03 | 0.07 |\n", + "| LAM | 0 | False | False | 2030 | 2034 | -0.03 | 0.11 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| MEA | 0 | False | False | 2031 | 2035 | -0.03 | 0.14 |\n", + "| MEA | 0 | False | False | 2030 | 2034 | -0.03 | 0.19 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| NEU | 0 | False | False | 2031 | 2035 | -0.03 | 0.01 |\n", + "| NEU | 0 | False | False | 2030 | 2034 | -0.03 | 0.04 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| OAS | 0 | False | False | 2031 | 2035 | -0.03 | 0.07 |\n", + "| OAS | 0 | False | False | 2031 | 2035 | -0.03 | 0.14 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| REF | 0 | False | False | 2031 | 2035 | -0.03 | 0.02 |\n", + "| REF | 0 | False | False | 2031 | 2035 | -0.03 | 0.08 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| SSA | 0 | False | False | 2031 | 2035 | -0.03 | 0.03 |\n", + "| SSA | 0 | False | False | 2030 | 2034 | -0.03 | 0.03 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| USA | 0 | False | False | 2031 | 2035 | -0.03 | 0.13 |\n", + "| USA | 0 | False | False | 2031 | 2035 | -0.03 | 0.36 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "| World | 0 | False | False | 2030 | 2034 | -0.03 | 0.8 |\n", + "| World | 0 | False | False | 2031 | 2035 | -0.03 | 1.88 |\n", "+--------+--------------------+------------+----------+-----------------+---------------+-------------------------+---------------+\n", - "Done!\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Processing scenarios: 100%|█████████████| 1/1 [01:20<00:00, 81.00s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ "Done!\n", - "\n", - "Write new database(s) to Brightway.\n", - "Running all checks...\n", - "Minor anomalies found: check the change report.\n", - "---> MAJOR anomalies found: check the change report.\n" - ] - }, - { - "ename": "KeyError", - "evalue": "\"Can't find linking activity for exchange:\\n{'amount': 0.0148,\\n 'location': 'GLO',\\n 'name': 'market for neutralising agent, sodium hydroxide-equivalent',\\n 'type': 'technosphere',\\n 'unit': 'kilogram'}\"", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "File \u001b[0;32m/opt/homebrew/Caskroom/miniforge/base/envs/premise/lib/python3.11/site-packages/wurst/linking.py:28\u001b[0m, in \u001b[0;36mlink_internal\u001b[0;34m(data, fields)\u001b[0m\n\u001b[1;32m 27\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 28\u001b[0m exc[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124minput\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m products[\u001b[43mget_tuple\u001b[49m\u001b[43m(\u001b[49m\u001b[43mexc\u001b[49m\u001b[43m)\u001b[49m]\n\u001b[1;32m 29\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m:\n", - "File \u001b[0;32m/opt/homebrew/Caskroom/miniforge/base/envs/premise/lib/python3.11/site-packages/wurst/linking.py:12\u001b[0m, in \u001b[0;36mlink_internal..\u001b[0;34m(exc)\u001b[0m\n\u001b[1;32m 11\u001b[0m input_databases \u001b[38;5;241m=\u001b[39m get_input_databases(data)\n\u001b[0;32m---> 12\u001b[0m get_tuple \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mlambda\u001b[39;00m exc: \u001b[38;5;28mtuple\u001b[39m(\u001b[43m[\u001b[49m\u001b[43mexc\u001b[49m\u001b[43m[\u001b[49m\u001b[43mf\u001b[49m\u001b[43m]\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mf\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mfields\u001b[49m\u001b[43m]\u001b[49m)\n\u001b[1;32m 13\u001b[0m products \u001b[38;5;241m=\u001b[39m {\n\u001b[1;32m 14\u001b[0m get_tuple(reference_product(ds)): (ds[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdatabase\u001b[39m\u001b[38;5;124m\"\u001b[39m], ds[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m]) \u001b[38;5;28;01mfor\u001b[39;00m ds \u001b[38;5;129;01min\u001b[39;00m data\n\u001b[1;32m 15\u001b[0m }\n", - "File \u001b[0;32m/opt/homebrew/Caskroom/miniforge/base/envs/premise/lib/python3.11/site-packages/wurst/linking.py:12\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 11\u001b[0m input_databases \u001b[38;5;241m=\u001b[39m get_input_databases(data)\n\u001b[0;32m---> 12\u001b[0m get_tuple \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mlambda\u001b[39;00m exc: \u001b[38;5;28mtuple\u001b[39m([\u001b[43mexc\u001b[49m\u001b[43m[\u001b[49m\u001b[43mf\u001b[49m\u001b[43m]\u001b[49m \u001b[38;5;28;01mfor\u001b[39;00m f \u001b[38;5;129;01min\u001b[39;00m fields])\n\u001b[1;32m 13\u001b[0m products \u001b[38;5;241m=\u001b[39m {\n\u001b[1;32m 14\u001b[0m get_tuple(reference_product(ds)): (ds[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdatabase\u001b[39m\u001b[38;5;124m\"\u001b[39m], ds[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m]) \u001b[38;5;28;01mfor\u001b[39;00m ds \u001b[38;5;129;01min\u001b[39;00m data\n\u001b[1;32m 15\u001b[0m }\n", - "\u001b[0;31mKeyError\u001b[0m: 'product'", - "\nDuring handling of the above exception, another exception occurred:\n", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[3], line 18\u001b[0m\n\u001b[1;32m 9\u001b[0m ndb \u001b[38;5;241m=\u001b[39m NewDatabase(\n\u001b[1;32m 10\u001b[0m scenarios \u001b[38;5;241m=\u001b[39m scenarios, \n\u001b[1;32m 11\u001b[0m source_db\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mecoinvent-3.10-consequential\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[38;5;66;03m#system_args = args\u001b[39;00m\n\u001b[1;32m 16\u001b[0m )\n\u001b[1;32m 17\u001b[0m ndb\u001b[38;5;241m.\u001b[39mupdate()\n\u001b[0;32m---> 18\u001b[0m \u001b[43mndb\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mwrite_db_to_brightway\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/GitHub/premise/premise/new_database.py:1047\u001b[0m, in \u001b[0;36mNewDatabase.write_db_to_brightway\u001b[0;34m(self, name)\u001b[0m\n\u001b[1;32m 1039\u001b[0m scenario \u001b[38;5;241m=\u001b[39m load_database(scenario)\n\u001b[1;32m 1040\u001b[0m _prepare_database(\n\u001b[1;32m 1041\u001b[0m scenario\u001b[38;5;241m=\u001b[39mscenario,\n\u001b[1;32m 1042\u001b[0m db_name\u001b[38;5;241m=\u001b[39mname[s],\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 1045\u001b[0m biosphere_name\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbiosphere_name,\n\u001b[1;32m 1046\u001b[0m )\n\u001b[0;32m-> 1047\u001b[0m \u001b[43mwrite_brightway_database\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1048\u001b[0m \u001b[43m \u001b[49m\u001b[43mscenario\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mdatabase\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1049\u001b[0m \u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[43m[\u001b[49m\u001b[43ms\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1050\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1051\u001b[0m \u001b[38;5;66;03m# delete the database from the scenario\u001b[39;00m\n\u001b[1;32m 1052\u001b[0m \u001b[38;5;28;01mdel\u001b[39;00m scenario[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdatabase\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n", - "File \u001b[0;32m~/GitHub/premise/premise/brightway2.py:46\u001b[0m, in \u001b[0;36mwrite_brightway_database\u001b[0;34m(data, name)\u001b[0m\n\u001b[1;32m 43\u001b[0m \u001b[38;5;66;03m# Restore parameters to Brightway2 format\u001b[39;00m\n\u001b[1;32m 44\u001b[0m \u001b[38;5;66;03m# which allows for uncertainty and comments\u001b[39;00m\n\u001b[1;32m 45\u001b[0m change_db_name(data, name)\n\u001b[0;32m---> 46\u001b[0m \u001b[43mlink_internal\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdata\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 47\u001b[0m check_internal_linking(data)\n\u001b[1;32m 48\u001b[0m BW2Importer(name, data)\u001b[38;5;241m.\u001b[39mwrite_database()\n", - "File \u001b[0;32m/opt/homebrew/Caskroom/miniforge/base/envs/premise/lib/python3.11/site-packages/wurst/linking.py:30\u001b[0m, in \u001b[0;36mlink_internal\u001b[0;34m(data, fields)\u001b[0m\n\u001b[1;32m 28\u001b[0m exc[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124minput\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m products[get_tuple(exc)]\n\u001b[1;32m 29\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m:\n\u001b[0;32m---> 30\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(\n\u001b[1;32m 31\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCan\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mt find linking activity for exchange:\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m.\u001b[39mformat(pformat(exc))\n\u001b[1;32m 32\u001b[0m )\n\u001b[1;32m 33\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m data\n", - "\u001b[0;31mKeyError\u001b[0m: \"Can't find linking activity for exchange:\\n{'amount': 0.0148,\\n 'location': 'GLO',\\n 'name': 'market for neutralising agent, sodium hydroxide-equivalent',\\n 'type': 'technosphere',\\n 'unit': 'kilogram'}\"" + "premise requires the name of your biosphere database.\n", + "Please enter the name of your biosphere database as it appears in your project.\n", + "Databases dictionary with 4 object(s):\n", + "\tecoinvent-3.10-biosphere\n", + "\tecoinvent-3.10-consequential\n", + "\ttest1\n", + "\ttest2\n" ] } ], "source": [ + "clear_cache()\n", "scenarios = [\n", " {\"model\": \"remind\", \"pathway\":\"SSP2-PkBudg500\", \"year\": 2030},\n", " #{\"model\": \"remind\", \"pathway\":\"SSP2-PkBudg1150\", \"year\": 2050},\n", @@ -948,80 +782,34 @@ " system_model=\"consequential\",\n", " #system_args = args\n", " )\n", - " ndb.update()\n", - " ndb.write_db_to_brightway()\n", + " #ndb.update()\n", + " #ndb.write_db_to_brightway()\n", " " ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "11c51f14-4187-462e-997e-218baf195cc2", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[('IPCC 2001 (superseded)', 'climate change', 'GWP 500a'),\n", - " ('IPCC 2001 (superseded)', 'climate change', 'GWP 20a'),\n", - " ('IPCC 2001 (superseded)', 'climate change', 'GWP 100a'),\n", - " ('IPCC 2007 (superseded)', 'climate change', 'GWP 100a'),\n", - " ('IPCC 2007 (superseded)', 'climate change', 'GWP 20a'),\n", - " ('IPCC 2007 (superseded)', 'climate change', 'GWP 500a'),\n", - " ('IPCC 2007 no LT (superseded)', 'climate change', 'GWP 100a'),\n", - " ('IPCC 2007 no LT (superseded)', 'climate change', 'GWP 20a'),\n", - " ('IPCC 2007 no LT (superseded)', 'climate change', 'GWP 500a'),\n", - " ('IPCC 2013 no LT', 'climate change', 'GTP 100a'),\n", - " ('IPCC 2013 no LT', 'climate change', 'GTP 20a'),\n", - " ('IPCC 2013 no LT', 'climate change', 'GWP 100a'),\n", - " ('IPCC 2013 no LT', 'climate change', 'GWP 20a'),\n", - " ('IPCC 2013', 'climate change', 'GTP 100a'),\n", - " ('IPCC 2013', 'climate change', 'GTP 20a'),\n", - " ('IPCC 2013', 'climate change', 'GWP 100a'),\n", - " ('IPCC 2013', 'climate change', 'GWP 20a'),\n", - " ('IPCC 2013', 'climate change', 'GWP 20a, incl. H'),\n", - " ('IPCC 2013', 'climate change', 'GWP 20a, incl. H and bio CO2'),\n", - " ('IPCC 2013', 'climate change', 'GWP 100a, incl. H and bio CO2'),\n", - " ('IPCC 2013', 'climate change', 'GTP 100a, incl. bio CO2'),\n", - " ('IPCC 2013', 'climate change', 'GTP 20a, incl. bio CO2'),\n", - " ('IPCC 2013', 'climate change', 'GWP 100a, incl. H')]" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "[m for m in bw.methods if \"IPCC\" in m[0]]" ] }, { "cell_type": "code", - "execution_count": 25, + "execution_count": null, "id": "167c3c97-d697-4ffa-844f-ecd124f6d15c", "metadata": {}, - "outputs": [ - { - "ename": "KeyError", - "evalue": "'ben0'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "Input \u001b[0;32mIn [25]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mbw\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcalculation_setups\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mben0\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\n", - "File \u001b[0;32m/opt/homebrew/Caskroom/miniforge/base/envs/premise/lib/python3.9/site-packages/bw2data/serialization.py:146\u001b[0m, in \u001b[0;36mSerializedDict.__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 144\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(key, \u001b[38;5;28mlist\u001b[39m):\n\u001b[1;32m 145\u001b[0m key \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mtuple\u001b[39m(key)\n\u001b[0;32m--> 146\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdata\u001b[49m\u001b[43m[\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m]\u001b[49m\n", - "\u001b[0;31mKeyError\u001b[0m: 'ben0'" - ] - } - ], + "outputs": [], "source": [ "bw.calculation_setups[\"ben0\"]" ] }, { "cell_type": "code", - "execution_count": 33, + "execution_count": null, "id": "384800ec-5ab8-4cbb-988c-985708df7be5", "metadata": {}, "outputs": [], @@ -1032,7 +820,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": null, "id": "77396b6e-0dd4-49f2-b0b6-6ef679df7e0a", "metadata": {}, "outputs": [], @@ -1048,24 +836,10 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": null, "id": "3f66c789-cbbd-4064-8671-82d1fdff3838", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'inv': [{('ben_db_0', '9498048180618909048101470389'): 1},\n", - " {('ben_db_0', '4143946432033982059594954568'): 1},\n", - " {('ben_db_0', '56883951199402670991359028683'): 1}],\n", - " 'ia': [('IPCC 2013', 'climate change', 'GWP 100a')]}" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "bw.calculation_setups[\"ben_0\"]" ] @@ -1082,255 +856,10 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "e6fb1b00-f5e6-4e07-a857-648619561f19", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+------------------------------------------------------------------+\n", - "| Warning |\n", - "+------------------------------------------------------------------+\n", - "| Because some of the scenarios can yield LCI databases |\n", - "| containing net negative emission technologies (NET), |\n", - "| it is advised to account for biogenic CO2 flows when calculating |\n", - "| Global Warming potential indicators. |\n", - "| `premise_gwp` provides characterization factors for such flows. |\n", - "| |\n", - "| Within your bw2 project: |\n", - "| from premise_gwp import add_premise_gwp |\n", - "| add_premise_gwp() |\n", - "+------------------------------------------------------------------+\n", - "\n", - "////////////////////// EXTRACTING SOURCE DATABASE //////////////////\n", - "Done!\n", - "\n", - "//////////////////// IMPORTING DEFAULT INVENTORIES /////////////////\n", - "Done!\n", - "\n", - "///////////////////////// EXTRACTING IAM DATA //////////////////////\n", - "(28,)\n", - "[[2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " ...\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]]\n", - "(28,)\n", - "[[2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " ...\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]]\n", - "(28,)\n", - "[[2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " ...\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]]\n", - "(28,)\n", - "[[2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " ...\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]]\n", - "(28,)\n", - "[[2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " ...\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]]\n", - "(28,)\n", - "[[2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " ...\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]]\n", - "(28,)\n", - "[[2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " ...\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]]\n", - "(28,)\n", - "[[2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " ...\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]]\n", - "(28,)\n", - "[[2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " ...\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]]\n", - "(28,)\n", - "[[2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " ...\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]]\n", - "(28,)\n", - "[[2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " ...\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]]\n", - "(28,)\n", - "[[2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " ...\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]]\n", - "(28,)\n", - "[[2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " ...\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]]\n", - "(28,)\n", - "[[2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " ...\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]]\n", - "(28,)\n", - "[[2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " ...\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]]\n", - "(28,)\n", - "[[2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " ...\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]]\n", - "(28,)\n", - "[[2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " ...\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]]\n", - "(28,)\n", - "[[2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " ...\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]]\n", - "(28,)\n", - "[[2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " ...\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]]\n", - "(28,)\n", - "[[2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " ...\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]]\n", - "(28,)\n", - "[[2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " ...\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]]\n", - "(28,)\n", - "[[2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " ...\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]]\n", - "(28,)\n", - "[[2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " ...\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]]\n", - "(28,)\n", - "[[2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " ...\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]]\n", - "(28,)\n", - "[[2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " ...\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]]\n", - "(28,)\n", - "[[2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " ...\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]]\n", - "(28,)\n", - "[[2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " [2. 2. 2. ... 2. 2. 2.]\n", - " ...\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]]\n", - "Done!\n" - ] - } - ], + "outputs": [], "source": [ "import brightway2 as bw\n", "from premise import *\n", @@ -1366,7 +895,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "929ac8e3-af97-4b13-820b-20a1d8c070cf", "metadata": {}, "outputs": [], diff --git a/premise/__init__.py b/premise/__init__.py index 3dc3b24e..d1a864ec 100644 --- a/premise/__init__.py +++ b/premise/__init__.py @@ -4,7 +4,7 @@ "clear_inventory_cache", "get_regions_definition", ) -__version__ = (2, 1, 2) +__version__ = (2, 1, 3) from premise.new_database import NewDatabase diff --git a/premise/data/additional_inventories/lci-PV-perovskite.xlsx b/premise/data/additional_inventories/lci-PV-perovskite.xlsx index 2be1d9f0d63c4ffbcebbcb2f763f605687fafc61..8695d6c5923a1dd5a64f177002a342fe1cb9ea1e 100644 GIT binary patch delta 32141 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 JJO0!1{{amw=-B`O delta 32196 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 WJ%Wt7M8M-fIbD=6mhJz!^#1@Yp|@ZF diff --git a/premise/new_database.py b/premise/new_database.py index ca183de5..3282cf2f 100644 --- a/premise/new_database.py +++ b/premise/new_database.py @@ -713,7 +713,7 @@ def __import_inventories(self) -> List[dict]: # with HiddenPrints(): # Manual import # file path and original ecoinvent version - data = [] + data, unlinked = [], [] filepaths = [ (FILEPATH_OIL_GAS_INVENTORIES, "3.7"), (FILEPATH_CARMA_INVENTORIES, "3.5"), @@ -817,6 +817,10 @@ def __import_inventories(self) -> List[dict]: datasets = inventory.merge_inventory() data.extend(datasets) self.database.extend(datasets) + unlinked.extend(inventory.list_unlinked) + + if len(unlinked) > 0: + raise ValueError("Fix the unlinked exchanges before proceeding") return data diff --git a/tests/test_process_ei38_conseq.py b/tests/test_process_ei38_conseq.py new file mode 100644 index 00000000..7488620b --- /dev/null +++ b/tests/test_process_ei38_conseq.py @@ -0,0 +1,82 @@ +import gc +import os + +import bw2calc +import bw2data +import bw2io +import pytest +from dotenv import load_dotenv + +from premise import NewDatabase, clear_inventory_cache +from premise.utils import delete_all_pickles + +load_dotenv() + + +ei_user = os.environ["EI_USERNAME"] +ei_pass = os.environ["EI_PASSWORD"] +key = os.environ["IAM_FILES_KEY"] +# convert to bytes +key = key.encode() + +ei_version = "3.8" +system_model = "consequential" + + +scenarios = [ + {"model": "remind", "pathway": "SSP2-Base", "year": 2050}, + {"model": "image", "pathway": "SSP2-RCP19", "year": 2050}, +] + + +@pytest.mark.slow +def test_brightway(): + + bw2data.projects.set_current(f"ecoinvent-{ei_version}-{system_model}") + + clear_inventory_cache() + + if f"ecoinvent-{ei_version}-{system_model}" not in bw2data.databases: + bw2io.import_ecoinvent_release( + version=ei_version, + system_model=system_model, + username=ei_user, + password=ei_pass, + ) + + ndb = NewDatabase( + scenarios=scenarios, + source_db=f"ecoinvent-{ei_version}-{system_model}", + source_version=ei_version, + key=key, + system_model=system_model, + biosphere_name=f"ecoinvent-{ei_version}-biosphere", + ) + + ndb.update() + + if "test1" in bw2data.databases: + del bw2data.databases["test1"] + if "test2" in bw2data.databases: + del bw2data.databases["test2"] + + ndb.write_db_to_brightway( + [ + "test1", + "test2", + ] + ) + + method = [m for m in bw2data.methods if "IPCC" in m[0]][0] + + lca = bw2calc.LCA({bw2data.Database("test1").random(): 1}, method) + lca.lci() + lca.lcia() + assert isinstance(lca.score, float) + print(lca.score) + + # destroy all objects + del ndb + del lca + gc.collect() + delete_all_pickles() diff --git a/tests/test_process_ei38_cutoff.py b/tests/test_process_ei38_cutoff.py new file mode 100644 index 00000000..6a19a59b --- /dev/null +++ b/tests/test_process_ei38_cutoff.py @@ -0,0 +1,81 @@ +import gc +import os + +import bw2calc +import bw2data +import bw2io +import pytest +from dotenv import load_dotenv + +from premise import NewDatabase, clear_inventory_cache +from premise.utils import delete_all_pickles + +load_dotenv() + + +ei_user = os.environ["EI_USERNAME"] +ei_pass = os.environ["EI_PASSWORD"] +key = os.environ["IAM_FILES_KEY"] +# convert to bytes +key = key.encode() + +ei_version = "3.8" +system_model = "cutoff" + + +scenarios = [ + {"model": "remind", "pathway": "SSP2-Base", "year": 2050}, + {"model": "image", "pathway": "SSP2-RCP19", "year": 2050}, +] + + +@pytest.mark.slow +def test_brightway(): + + bw2data.projects.set_current(f"ecoinvent-{ei_version}-{system_model}") + clear_inventory_cache() + + if f"ecoinvent-{ei_version}-{system_model}" not in bw2data.databases: + bw2io.import_ecoinvent_release( + version=ei_version, + system_model=system_model, + username=ei_user, + password=ei_pass, + ) + + ndb = NewDatabase( + scenarios=scenarios, + source_db=f"ecoinvent-{ei_version}-{system_model}", + source_version=ei_version, + key=key, + system_model=system_model, + biosphere_name=f"ecoinvent-{ei_version}-biosphere", + ) + + ndb.update() + + if "test1" in bw2data.databases: + del bw2data.databases["test1"] + if "test2" in bw2data.databases: + del bw2data.databases["test2"] + + ndb.write_db_to_brightway( + [ + "test1", + "test2", + ] + ) + + method = [m for m in bw2data.methods if "IPCC" in m[0]][0] + + lca = bw2calc.LCA({bw2data.Database("test1").random(): 1}, method) + lca.lci() + lca.lcia() + assert isinstance(lca.score, float) + print(lca.score) + + # destroy all objects + del ndb + del lca + gc.collect() + delete_all_pickles() diff --git a/tests/test_process_ei39_conseq.py b/tests/test_process_ei39_conseq.py new file mode 100644 index 00000000..6c600f4e --- /dev/null +++ b/tests/test_process_ei39_conseq.py @@ -0,0 +1,82 @@ +import gc +import os + +import bw2calc +import bw2data +import bw2io +import pytest +from dotenv import load_dotenv + +from premise import NewDatabase, clear_inventory_cache +from premise.utils import delete_all_pickles + +load_dotenv() + + +ei_user = os.environ["EI_USERNAME"] +ei_pass = os.environ["EI_PASSWORD"] +key = os.environ["IAM_FILES_KEY"] +# convert to bytes +key = key.encode() + +ei_version = "3.9.1" +system_model = "consequential" + + +scenarios = [ + {"model": "remind", "pathway": "SSP2-Base", "year": 2050}, + {"model": "image", "pathway": "SSP2-RCP19", "year": 2050}, +] + + +@pytest.mark.slow +def test_brightway(): + + bw2data.projects.set_current(f"ecoinvent-{ei_version}-{system_model}") + + clear_inventory_cache() + + if f"ecoinvent-{ei_version}-{system_model}" not in bw2data.databases: + bw2io.import_ecoinvent_release( + version=ei_version, + system_model=system_model, + username=ei_user, + password=ei_pass, + ) + + ndb = NewDatabase( + scenarios=scenarios, + source_db=f"ecoinvent-{ei_version}-{system_model}", + source_version=ei_version, + key=key, + system_model=system_model, + biosphere_name=f"ecoinvent-{ei_version}-biosphere", + ) + + ndb.update() + + if "test1" in bw2data.databases: + del bw2data.databases["test1"] + if "test2" in bw2data.databases: + del bw2data.databases["test2"] + + ndb.write_db_to_brightway( + [ + "test1", + "test2", + ] + ) + + method = [m for m in bw2data.methods if "IPCC" in m[0]][0] + + lca = bw2calc.LCA({bw2data.Database("test1").random(): 1}, method) + lca.lci() + lca.lcia() + assert isinstance(lca.score, float) + print(lca.score) + + # destroy all objects + del ndb + del lca + gc.collect() + delete_all_pickles()