{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Fugitive" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Table of contents**\n", "- Overview\n", "- Setup\n", " - Authentication Token\n", "- Query\n", " - Output Description\n", "- Related Links" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Overview" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "Scope 1 emissions are calculations of direct greenhouse gas emissions that can be directly controlled by an organization. The source of the emissions is owned by the organization, for example, fossil fuels.\n", "\n", "Use the Fugitive API to calculate emissions leaks of greenhouse gasses from refrigeration or air conditioning units.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Setup" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ensure that Python 3+ is installed on your system.\n", "\n", "\n", "Note: To run this notebook, you must first add your credentials to `'../../../auth/secrets.ini'` in the following format:\n", "\n", "```\n", "[EAPI]\n", "api.api_key = \n", "api.tenant_id = \n", "api.org_id = \n", "\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Install the prerequisite Python packages\n", "%pip install pandas configparser IPython requests matplotlib" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import configparser\n", "import requests\n", "import json\n", "from IPython.display import display as display_summary" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Authorization Token" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Run the following code snippet to generate a Bearer Token by using your api_key configured in secrets.ini." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Authentication Success\n" ] } ], "source": [ "config = configparser.RawConfigParser()\n", "config.read(['../../../auth/secrets.ini','../../../auth/config.ini'])\n", "\n", "EAPI_API_KEY = config.get('EAPI', 'api.api_key')\n", "EAPI_TENANT_ID = config.get('EAPI', 'api.tenant_id')\n", "EAPI_CLIENT_ID = 'ghgemissions-' + EAPI_TENANT_ID\n", "EAPI_ORG_ID = config.get('EAPI', 'api.org_id')\n", "\n", "EAPI_AUTH_CLIENT_ID = 'saascore-' + EAPI_TENANT_ID\n", "EAPI_AUTH_ENDPOINT = config.get('EAPI', 'api.auth_endpoint')\n", "\n", "EAPI_BASE_URL = config.get('EAPI', 'api.base_url')\n", "EAPI_ENDPOINT = f\"{EAPI_BASE_URL}/fugitive\"\n", "\n", "auth_request_headers: dict = {}\n", "auth_request_headers[\"X-IBM-Client-Id\"] = EAPI_AUTH_CLIENT_ID\n", "auth_request_headers[\"X-API-Key\"] = EAPI_API_KEY\n", "\n", "verify = True\n", "\n", "auth_url = f\"{EAPI_AUTH_ENDPOINT}?orgId={EAPI_ORG_ID}\"\n", " \n", "response = requests.get(url = auth_url,\n", " headers = auth_request_headers,\n", " verify = verify\n", " )\n", "if response.status_code == 200:\n", " jwt_token = response.text\n", " print(\"Authentication Success\")\n", "else: \n", " print(\"Authentication Failed\")\n", " print(response.text)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Query" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The example request payload (below) queries IBM Envizi - Emissions API for 1 kilogram (kg) of leaked R-404A in the state of New York, United States of America for 2025-01-01:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "payload = {\n", " \"activity\": {\n", " \"type\": \"R-404A\",\n", " \"value\": 1,\n", " \"unit\": \"kg\"\n", " },\n", " \"location\": {\n", " \"country\": \"USA\",\n", " \"stateProvince\": \"New York\"\n", " },\n", " \"time\": {\n", " \"date\": \"2025-01-01\"\n", " }\n", "}" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# Create the query headers\n", "request_headers: dict = {}\n", "request_headers[\"Content-Type\"] = \"application/json\"\n", "request_headers[\"x-ibm-client-id\"] = EAPI_CLIENT_ID\n", "request_headers[\"Authorization\"] = \"Bearer \" + jwt_token\n", "\n", "# Submit the request\n", "response = requests.post(EAPI_ENDPOINT, \n", " headers = request_headers, \n", " data = json.dumps(payload))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For more information about allowable parameters for the payload, please see [Emissions API Developer Guide]()." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
transactionIdtotalCO2eHFCunitdescription
0bf34f5f0-fb11-4264-883c-3dccc57be7a547284728kgCO2eThe R-404A emissions factor used to calculate this result was obtained from the GHG - AR6 factor set for the area Earth.
\n", "
" ], "text/plain": [ " transactionId totalCO2e HFC unit \\\n", "0 bf34f5f0-fb11-4264-883c-3dccc57be7a5 4728 4728 kgCO2e \n", "\n", " description \n", "0 The R-404A emissions factor used to calculate this result was obtained from the GHG - AR6 factor set for the area Earth. " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "if response.text != \"\":\n", " # Get the response as json\n", " response_json = response.json()\n", " \n", " # Get json and convert to dataframe\n", " json_str = json.dumps(response_json)\n", " dict = json.loads(json_str)\n", " dataframe = pd.json_normalize(dict) \n", " \n", " # display\n", " print(\"\\n\\n\")\n", " pd.set_option('display.max_colwidth', None)\n", " display( dataframe) \n", "else:\n", " print(\"Empty Response\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Output Explanation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "transactionId - An Emissions API transaction id.\n", "\n", "totalCO2e - The total emissions as CO2 equivalent (CO2e)\n", "\n", "co2 - The amount of CO2 (Carbon Dioxide) in the CO2e value.\n", "\n", "ch4 - The amount of CH4 (Methane) in the CO2e value.\n", "\n", "n2O - The amount of N2O (Nitrous Oxide) in the CO2e value.\n", "\n", "hfc - The amount of HFCs (Hydrofluorocarbons) in the CO2e value.\n", "\n", "pfc - The amount of PFCs (Perfluorocarbons) in the CO2e value.\n", "\n", "sf6 - The amount of SF6 (Sulphur Hexafluoride) in the CO2e value.\n", "\n", "nf3 - The amount of NF3 (Nitrogen Trifluoride) in the CO2e value.\n", "\n", "bioCo2 - The amount of bio CO2 in the CO2 value.\n", "\n", "indirectCo2e - The amount of CO2e that is indirect in the CO2e value.\n", "\n", "unit - The unit of measure of the values.\n", "\n", "description - A description of the source factor set of the factor used in the calculation." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Related Links" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Emissions API Developer Guide]()" ] } ], "metadata": { "kernelspec": { "display_name": ".venv", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.1" } }, "nbformat": 4, "nbformat_minor": 4 }