{ "cells": [ { "cell_type": "markdown", "id": "59d19f73", "metadata": {}, "source": [ "# Python API Example - Arb Breakevens Data Import and Storage in Dataframe\n", "\n", "This guide is designed to provide an example of how to call the Arb Breakevens API endpoint, and store the data accordingly.\n", "\n", "__N.B. This guide is just for Arb Breakevens data. If you're looking for other API data products (such as Netbacks, Price releases or Freight routes), please refer to their according code example files.__ " ] }, { "cell_type": "markdown", "id": "b0a05be4", "metadata": {}, "source": [ "### Have any questions?\n", "\n", "If you have any questions regarding our API, or need help accessing specific datasets, please contact us at:\n", "\n", "__data@sparkcommodities.com__" ] }, { "cell_type": "markdown", "id": "9e00ae34", "metadata": {}, "source": [ "## 1. Importing Data\n", "\n", "Here we define the functions that allow us to retrieve the valid credentials to access the Spark API.\n", "\n", "__This section can remain unchanged for most Spark API users.__" ] }, { "cell_type": "code", "execution_count": 20, "id": "705cbb25", "metadata": {}, "outputs": [], "source": [ "# Importing libraries for calling the API\n", "import json\n", "import os\n", "import sys\n", "import pandas as pd\n", "from base64 import b64encode\n", "from urllib.parse import urljoin\n", "\n", "\n", "try:\n", " from urllib import request, parse\n", " from urllib.error import HTTPError\n", "except ImportError:\n", " raise RuntimeError(\"Python 3 required\")" ] }, { "cell_type": "code", "execution_count": 21, "id": "1161e807", "metadata": {}, "outputs": [], "source": [ "# Defining functions for API request\n", "\n", "API_BASE_URL = \"https://api.sparkcommodities.com\"\n", "\n", "\n", "def retrieve_credentials(file_path=None):\n", " \"\"\"\n", " Find credentials either by reading the client_credentials file or reading\n", " environment variables\n", " \"\"\"\n", " if file_path is None:\n", " client_id = os.getenv(\"SPARK_CLIENT_ID\")\n", " client_secret = os.getenv(\"SPARK_CLIENT_SECRET\")\n", " if not client_id or not client_secret:\n", " raise RuntimeError(\n", " \"SPARK_CLIENT_ID and SPARK_CLIENT_SECRET environment vars required\"\n", " )\n", " else:\n", " # Parse the file\n", " if not os.path.isfile(file_path):\n", " raise RuntimeError(\"The file {} doesn't exist\".format(file_path))\n", "\n", " with open(file_path) as fp:\n", " lines = [l.replace(\"\\n\", \"\") for l in fp.readlines()]\n", "\n", " if lines[0] in (\"clientId,clientSecret\", \"client_id,client_secret\"):\n", " client_id, client_secret = lines[1].split(\",\")\n", " else:\n", " print(\"First line read: '{}'\".format(lines[0]))\n", " raise RuntimeError(\n", " \"The specified file {} doesn't look like to be a Spark API client \"\n", " \"credentials file\".format(file_path)\n", " )\n", "\n", " print(\">>>> Found credentials!\")\n", " print(\n", " \">>>> Client_id={}, client_secret={}****\".format(client_id, client_secret[:5])\n", " )\n", "\n", " return client_id, client_secret\n", "\n", "\n", "def do_api_post_query(uri, body, headers):\n", " \"\"\"\n", " OAuth2 authentication requires a POST request with client credentials before accessing the API. \n", " This POST request will return an Access Token which will be used for the API GET request.\n", " \"\"\"\n", " url = urljoin(API_BASE_URL, uri)\n", "\n", " data = json.dumps(body).encode(\"utf-8\")\n", "\n", " # HTTP POST request\n", " req = request.Request(url, data=data, headers=headers)\n", " try:\n", " response = request.urlopen(req)\n", " except HTTPError as e:\n", " print(\"HTTP Error: \", e.code)\n", " print(e.read())\n", " sys.exit(1)\n", "\n", " resp_content = response.read()\n", "\n", " # The server must return HTTP 201. Raise an error if this is not the case\n", " assert response.status == 201, resp_content\n", "\n", " # The server returned a JSON response\n", " content = json.loads(resp_content)\n", "\n", " return content\n", "\n", "\n", "def do_api_get_query(uri, access_token, format='json'):\n", " \"\"\"\n", " After receiving an Access Token, we can request information from the API.\n", " \"\"\"\n", " url = urljoin(API_BASE_URL, uri)\n", "\n", " if format == 'json':\n", " headers = {\n", " \"Authorization\": \"Bearer {}\".format(access_token),\n", " \"Accept\": \"application/json\",\n", " }\n", " elif format == 'csv':\n", " headers = {\n", " \"Authorization\": \"Bearer {}\".format(access_token),\n", " \"Accept\": \"text/csv\"\n", " }\n", "\n", " #headers = {\n", " # \"Authorization\": \"Bearer {}\".format(access_token),\n", " # \"Accept\": \"application/json\",\n", " #}\n", "\n", " # HTTP POST request\n", " req = request.Request(url, headers=headers)\n", " try:\n", " response = request.urlopen(req)\n", " except HTTPError as e:\n", " print(\"HTTP Error: \", e.code)\n", " print(e.read())\n", " sys.exit(1)\n", "\n", " resp_content = response.read()\n", "\n", " # The server must return HTTP 201. Raise an error if this is not the case\n", " assert response.status == 200, resp_content\n", "\n", " # Storing response based on requested format\n", " if format == 'json':\n", " content = json.loads(resp_content)\n", " elif format == 'csv':\n", " content = resp_content\n", "\n", " return content\n", "\n", "\n", "def get_access_token(client_id, client_secret):\n", " \"\"\"\n", " Get a new access_token. Access tokens are the thing that applications use to make\n", " API requests. Access tokens must be kept confidential in storage.\n", "\n", " # Procedure:\n", "\n", " Do a POST query with `grantType` and `scopes` in the body. A basic authorization\n", " HTTP header is required. The \"Basic\" HTTP authentication scheme is defined in\n", " RFC 7617, which transmits credentials as `clientId:clientSecret` pairs, encoded\n", " using base64.\n", " \"\"\"\n", "\n", " # Note: for the sake of this example, we choose to use the Python urllib from the\n", " # standard lib. One should consider using https://requests.readthedocs.io/\n", "\n", " payload = \"{}:{}\".format(client_id, client_secret).encode()\n", " headers = {\n", " \"Authorization\": b64encode(payload).decode(),\n", " \"Accept\": \"application/json\",\n", " \"Content-Type\": \"application/json\",\n", " }\n", " body = {\n", " \"grantType\": \"clientCredentials\",\n", " \"scopes\": \"read:netbacks,read:access,read:prices,read:routes\",\n", " }\n", "\n", " content = do_api_post_query(uri=\"/oauth/token/\", body=body, headers=headers)\n", "\n", " print(\n", " \">>>> Successfully fetched an access token {}****, valid {} seconds.\".format(\n", " content[\"accessToken\"][:5], content[\"expiresIn\"]\n", " )\n", " )\n", "\n", " return content[\"accessToken\"]" ] }, { "cell_type": "markdown", "id": "9c527e40", "metadata": {}, "source": [ "## Reference Data fetching\n", "\n", "In the fetch request, we use the URL:\n", "\n", "__uri=\"/v1.0/netbacks/reference-data/\"__\n", "\n", "This query shows an overview on all available netbacks and according arb breakevens, showing all available ports and possible routes to/from these destinations (i.e. via Suez, Panama etc.)." ] }, { "cell_type": "code", "execution_count": 22, "id": "ada4f167", "metadata": {}, "outputs": [], "source": [ "# Define the function for listing all netbacks\n", "def list_netbacks(access_token):\n", " \"\"\"\n", " Fetch available routes. Return contract ticker symbols\n", "\n", " # Procedure:\n", "\n", " Do a GET query to /v1.0/routes/ with a Bearer token authorization HTTP header.\n", " \"\"\"\n", " content = do_api_get_query(\n", " uri=\"/v1.0/netbacks/reference-data/\", access_token=access_token\n", " )\n", "\n", " print(\">>>> All the routes you can fetch\")\n", " tickers = []\n", " fobPort_names = []\n", "\n", " availablevia = []\n", "\n", " for contract in content[\"data\"][\"staticData\"][\"fobPorts\"]:\n", " tickers.append(contract[\"uuid\"])\n", " fobPort_names.append(contract[\"name\"])\n", "\n", " availablevia.append(contract[\"availableViaPoints\"])\n", "\n", " reldates = content[\"data\"][\"staticData\"][\"sparkReleases\"]\n", "\n", " dicto1 = content[\"data\"]\n", "\n", " return tickers, fobPort_names, availablevia, reldates, dicto1" ] }, { "cell_type": "markdown", "id": "1e890e9e", "metadata": {}, "source": [ "## N.B. Credentials\n", "\n", "Here we call the above functions, and input the file path to our credentials.\n", "\n", "N.B. You must have downloaded your client credentials CSV file before proceeding. Please refer to the API documentation if you have not dowloaded them already. Instructions for downloading your credentials can be found here:\n", "\n", "https://api.sparkcommodities.com/redoc#section/Authentication/Create-an-Oauth2-Client\n" ] }, { "cell_type": "code", "execution_count": null, "id": "2b010f83", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ ">>>> Found credentials!\n", ">>>> Client_id=01c23590-ef6c-4a36-8237-c89c3f1a3b2a, client_secret=80763****\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ ">>>> Successfully fetched an access token eyJhb****, valid 604799 seconds.\n", "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0eXBlIjoiYWNjZXNzVG9rZW4iLCJzdWIiOiIwMWMyMzU5MC1lZjZjLTRhMzYtODIzNy1jODljM2YxYTNiMmEiLCJzdWJUeXBlIjoib2F1dGgtY2xpZW50IiwiZXhwIjoxNzU1ODU3MDIzLCJoYXNoZWRTZWNyZXQiOiJwYmtkZjJfc2hhMjU2JDYwMDAwMCRoTXRMNDlrMUZUaVVzTE42Njlqc2pPJHVCSXNxcml5b1NHVzJTS1AvaHVLNHh3eTZ4d3VDN001aUdGRm43N2l4S1U9Iiwib3JnVXVpZCI6IjQ5MzhiMGJiLTVmMjctNDE2NC04OTM4LTUyNTdmYmQzNTNmZiIsImNsaWVudFR5cGUiOiJvYXV0aC1jbGllbnQifQ.f65SrH9FbI8DqkAfclLHftUXS6U7fqbmz77996ZZVQ0\n", ">>>> All the routes you can fetch\n" ] } ], "source": [ "# Input the path to your client credentials here\n", "client_id, client_secret = retrieve_credentials(file_path=\"/tmp/client_credentials.csv\")\n", "\n", "# Authenticate:\n", "access_token = get_access_token(client_id, client_secret)\n", "print(access_token)\n", "\n", "# Fetch all contracts:\n", "tickers, fobPort_names, availablevia, reldates, dicto1 = list_netbacks(access_token)" ] }, { "cell_type": "code", "execution_count": 24, "id": "5d456a0a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[['suez', None], ['panama', None], ['cogh', 'panama', 'suez', None], ['suez', None], ['cogh', 'panama', 'suez', None], ['cogh', 'panama', 'suez', None], ['cogh', 'suez', None], ['cogh', 'suez', None], ['cogh', None], ['cogh', 'panama', None], ['cogh', 'panama', 'suez', None], ['cogh', 'panama', 'suez', None], ['panama', None], ['cogh', 'suez', None], ['suez', None], ['cogh', 'panama', 'suez', None], ['magellan-straits', 'panama', None], ['cogh', 'panama', 'suez', None], ['cogh', 'suez', None], ['cogh', 'panama', 'suez', None], ['magellan-straits', 'panama', None], ['cogh', 'panama', 'suez', None], ['cogh', 'panama', 'suez', None], ['panama', None], ['cogh', 'suez', None], ['cogh', 'panama', 'suez', None], [None], ['cogh', None], ['cogh', 'panama', 'suez', None], ['cogh', 'panama', 'suez', None], ['panama', None], ['suez', None], ['cogh', 'magellan-straits', 'panama', None], [None], ['cogh', 'suez', None], ['cogh', 'panama', 'suez', None], ['cogh', 'suez', None]]\n" ] } ], "source": [ "# Prints the callable route options, corresponding to each Route ID number shown above\n", "# I.e. availablevia[2] shows the available route options for tickers[2]\n", "\n", "print(availablevia)" ] }, { "cell_type": "code", "execution_count": 25, "id": "7bcee4d3", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['Wheatstone', 'Woodfibre LNG', 'Corpus Christi', 'Bintulu', 'Lake Charles', 'Elba Island', 'Das Island', 'Gorgon', 'Congo LNG', 'Atlantic LNG', 'Bethioua', 'Cove Point', 'Peru LNG', 'Ras Laffan', 'Murmansk', 'Hammerfest', 'LNG Canada', 'Rio Grande LNG', 'Yamal', 'Plaquemines', 'Costa Azul', 'Altamira', 'Sabine Pass', 'Puerto Libertad', 'NWS', 'Delfin FLNG', 'Bioko', 'Bonny LNG', 'Freeport', 'Cameron (Liqu.)', 'Kamchatka', 'GLNG', 'Argentina LNG', 'Soyo', 'Qalhat', 'Calcasieu Pass', 'Tangguh']\n" ] } ], "source": [ "# Print the names of each of the ports, corresponding to Route ID and availablevia details shown above\n", "# Some of these options are currently unavailable. \n", "# Please refer to the Netbacks tool on the Spark Platform to check which Netbacks are currently available\n", "\n", "print(fobPort_names)" ] }, { "cell_type": "code", "execution_count": 26, "id": "4003cf3b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'staticData': {'viaPoints': [{'code': 'panama', 'name': 'Panama'},\n", " {'code': 'suez', 'name': 'Suez'},\n", " {'code': 'cogh', 'name': 'COGH'},\n", " {'code': 'magellan-straits', 'name': 'Strait of Magellan'}],\n", " 'fobPorts': [{'uuid': '00398967-3ee1-4b26-bcdb-805ad19dbcce',\n", " 'name': 'Wheatstone',\n", " 'availableViaPoints': ['suez', None]},\n", " {'uuid': '00314d16-eada-4f37-bff3-d844708aeb45',\n", " 'name': 'Woodfibre LNG',\n", " 'availableViaPoints': ['panama', None]},\n", " {'uuid': '0030c461-9a63-403d-8f53-9327ea773517',\n", " 'name': 'Corpus Christi',\n", " 'availableViaPoints': ['cogh', 'panama', 'suez', None]},\n", " {'uuid': '003342b7-ba5b-4f0e-b6df-4d95837a5691',\n", " 'name': 'Bintulu',\n", " 'availableViaPoints': ['suez', None]},\n", " {'uuid': '003ff22f-77d8-413f-9997-2c6280e7c28c',\n", " 'name': 'Lake Charles',\n", " 'availableViaPoints': ['cogh', 'panama', 'suez', None]},\n", " {'uuid': '00352a22-e959-4233-b93d-d23a0da3dfed',\n", " 'name': 'Elba Island',\n", " 'availableViaPoints': ['cogh', 'panama', 'suez', None]},\n", " {'uuid': '003b48e3-aedd-417c-8ea3-2d1dd434d8a9',\n", " 'name': 'Das Island',\n", " 'availableViaPoints': ['cogh', 'suez', None]},\n", " {'uuid': '00312574-769c-4edf-9a55-362f3da20312',\n", " 'name': 'Gorgon',\n", " 'availableViaPoints': ['cogh', 'suez', None]},\n", " {'uuid': '003349a0-0c2d-4517-bf0f-3aa7c47e3d50',\n", " 'name': 'Congo LNG',\n", " 'availableViaPoints': ['cogh', None]},\n", " {'uuid': '00339787-d27c-4605-8409-e1c544820cec',\n", " 'name': 'Atlantic LNG',\n", " 'availableViaPoints': ['cogh', 'panama', None]},\n", " {'uuid': '003afd77-2b63-41e4-8b7a-6d6294236d78',\n", " 'name': 'Bethioua',\n", " 'availableViaPoints': ['cogh', 'panama', 'suez', None]},\n", " {'uuid': '003e8539-3a98-48fa-b35d-0ba061beea4e',\n", " 'name': 'Cove Point',\n", " 'availableViaPoints': ['cogh', 'panama', 'suez', None]},\n", " {'uuid': '00398395-a9d6-4d09-8e17-f731caf760d9',\n", " 'name': 'Peru LNG',\n", " 'availableViaPoints': ['panama', None]},\n", " {'uuid': '003f9d1b-b4ad-4de9-8c8d-bd7fbcacd3df',\n", " 'name': 'Ras Laffan',\n", " 'availableViaPoints': ['cogh', 'suez', None]},\n", " {'uuid': '003f9252-e4e3-4957-8462-36f4b61b3370',\n", " 'name': 'Murmansk',\n", " 'availableViaPoints': ['suez', None]},\n", " {'uuid': '003f92ce-86d5-4d03-9761-311036c47812',\n", " 'name': 'Hammerfest',\n", " 'availableViaPoints': ['cogh', 'panama', 'suez', None]},\n", " {'uuid': '00369d3c-62db-4833-8c49-ea1a2fbb2b18',\n", " 'name': 'LNG Canada',\n", " 'availableViaPoints': ['magellan-straits', 'panama', None]},\n", " {'uuid': '00383491-7e92-4b89-8b26-473fb3dcb9ed',\n", " 'name': 'Rio Grande LNG',\n", " 'availableViaPoints': ['cogh', 'panama', 'suez', None]},\n", " {'uuid': '003a8724-b074-42e2-9e2f-ac3cc3e67ea4',\n", " 'name': 'Yamal',\n", " 'availableViaPoints': ['cogh', 'suez', None]},\n", " {'uuid': '003adf4e-01b5-4680-9cd7-49613d5d0e3e',\n", " 'name': 'Plaquemines',\n", " 'availableViaPoints': ['cogh', 'panama', 'suez', None]},\n", " {'uuid': '003e4ff1-6888-4d04-95e2-42e5b42ff722',\n", " 'name': 'Costa Azul',\n", " 'availableViaPoints': ['magellan-straits', 'panama', None]},\n", " {'uuid': '00302863-23af-41a6-a8ec-82c703860811',\n", " 'name': 'Altamira',\n", " 'availableViaPoints': ['cogh', 'panama', 'suez', None]},\n", " {'uuid': '003dec0a-ce8f-41db-8c24-4d7ef6addf70',\n", " 'name': 'Sabine Pass',\n", " 'availableViaPoints': ['cogh', 'panama', 'suez', None]},\n", " {'uuid': '003ef335-be59-48ca-97aa-cf1fd8dea6fb',\n", " 'name': 'Puerto Libertad',\n", " 'availableViaPoints': ['panama', None]},\n", " {'uuid': '00381c87-4180-4430-80f1-bf828099124f',\n", " 'name': 'NWS',\n", " 'availableViaPoints': ['cogh', 'suez', None]},\n", " {'uuid': '003fa7a4-b8ff-42e7-a146-983baddc769c',\n", " 'name': 'Delfin FLNG',\n", " 'availableViaPoints': ['cogh', 'panama', 'suez', None]},\n", " {'uuid': '003e50dc-2dca-44e5-b519-c4d704c6762d',\n", " 'name': 'Bioko',\n", " 'availableViaPoints': [None]},\n", " {'uuid': '0034fc9c-bb57-42b6-a91b-6f08c3795a25',\n", " 'name': 'Bonny LNG',\n", " 'availableViaPoints': ['cogh', None]},\n", " {'uuid': '0039b921-cc5c-47e3-9a31-9dfb0c55d345',\n", " 'name': 'Freeport',\n", " 'availableViaPoints': ['cogh', 'panama', 'suez', None]},\n", " {'uuid': '00356046-86ab-4a76-a689-99af1b3027ad',\n", " 'name': 'Cameron (Liqu.)',\n", " 'availableViaPoints': ['cogh', 'panama', 'suez', None]},\n", " {'uuid': '0033d717-1d87-407b-94b0-3f115ecd1887',\n", " 'name': 'Kamchatka',\n", " 'availableViaPoints': ['panama', None]},\n", " {'uuid': '003390dc-0918-485a-ba91-12465d2f1890',\n", " 'name': 'GLNG',\n", " 'availableViaPoints': ['suez', None]},\n", " {'uuid': '0033833f-3403-4397-97e3-2ccb9aedb62c',\n", " 'name': 'Argentina LNG',\n", " 'availableViaPoints': ['cogh', 'magellan-straits', 'panama', None]},\n", " {'uuid': '003bdb09-9cc9-4998-a849-0e0dce812fa7',\n", " 'name': 'Soyo',\n", " 'availableViaPoints': [None]},\n", " {'uuid': '003627f4-c752-4ce4-9ae7-7ad0fa6e53ce',\n", " 'name': 'Qalhat',\n", " 'availableViaPoints': ['cogh', 'suez', None]},\n", " {'uuid': '003e005e-9aeb-4e31-b44f-6f1a5d79ea67',\n", " 'name': 'Calcasieu Pass',\n", " 'availableViaPoints': ['cogh', 'panama', 'suez', None]},\n", " {'uuid': '00387996-f338-4c38-abcf-3fcfd3712339',\n", " 'name': 'Tangguh',\n", " 'availableViaPoints': ['cogh', 'suez', None]}],\n", " 'sparkReleases': ['2025-08-14',\n", " '2025-08-13',\n", " '2025-08-12',\n", " '2025-08-11',\n", " '2025-08-08',\n", " '2025-08-07',\n", " '2025-08-06',\n", " '2025-08-05',\n", " '2025-08-04',\n", " '2025-08-01',\n", " '2025-07-31',\n", " '2025-07-30',\n", " '2025-07-29',\n", " '2025-07-28',\n", " '2025-07-25',\n", " '2025-07-24',\n", " '2025-07-23',\n", " '2025-07-22',\n", " '2025-07-21',\n", " '2025-07-18',\n", " '2025-07-17',\n", " '2025-07-16',\n", " '2025-07-15',\n", " '2025-07-14',\n", " '2025-07-11',\n", " '2025-07-10',\n", " '2025-07-09',\n", " '2025-07-08',\n", " '2025-07-07',\n", " '2025-07-04',\n", " '2025-07-03',\n", " '2025-07-02',\n", " '2025-07-01',\n", " '2025-06-30',\n", " '2025-06-27',\n", " '2025-06-26',\n", " '2025-06-25',\n", " '2025-06-24',\n", " '2025-06-23',\n", " '2025-06-20',\n", " '2025-06-19',\n", " '2025-06-18',\n", " '2025-06-17',\n", " '2025-06-16',\n", " '2025-06-13',\n", " '2025-06-12',\n", " '2025-06-11',\n", " '2025-06-10',\n", " '2025-06-09',\n", " '2025-06-06',\n", " '2025-06-05',\n", " '2025-06-04',\n", " '2025-06-03',\n", " '2025-06-02',\n", " '2025-05-30',\n", " '2025-05-29',\n", " '2025-05-28',\n", " '2025-05-27',\n", " '2025-05-23',\n", " '2025-05-22',\n", " '2025-05-21',\n", " '2025-05-20',\n", " '2025-05-19',\n", " '2025-05-16',\n", " '2025-05-15',\n", " '2025-05-14',\n", " '2025-05-13',\n", " '2025-05-12',\n", " '2025-05-09',\n", " '2025-05-08',\n", " '2025-05-07',\n", " '2025-05-06',\n", " '2025-05-02',\n", " '2025-05-01',\n", " '2025-04-30',\n", " '2025-04-29',\n", " '2025-04-28',\n", " '2025-04-25',\n", " '2025-04-24',\n", " '2025-04-23',\n", " '2025-04-22',\n", " '2025-04-17',\n", " '2025-04-16',\n", " '2025-04-15',\n", " '2025-04-14',\n", " '2025-04-11',\n", " '2025-04-10',\n", " '2025-04-09',\n", " '2025-04-08',\n", " '2025-04-07',\n", " '2025-04-04',\n", " '2025-04-03',\n", " '2025-04-02',\n", " '2025-04-01',\n", " '2025-03-31',\n", " '2025-03-28',\n", " '2025-03-27',\n", " '2025-03-26',\n", " '2025-03-25',\n", " '2025-03-24',\n", " '2025-03-21',\n", " '2025-03-20',\n", " '2025-03-19',\n", " '2025-03-18',\n", " '2025-03-17',\n", " '2025-03-14',\n", " '2025-03-13',\n", " '2025-03-12',\n", " '2025-03-11',\n", " '2025-03-10',\n", " '2025-03-07',\n", " '2025-03-06',\n", " '2025-03-05',\n", " '2025-03-04',\n", " '2025-03-03',\n", " '2025-02-28',\n", " '2025-02-27',\n", " '2025-02-26',\n", " '2025-02-25',\n", " '2025-02-24',\n", " '2025-02-21',\n", " '2025-02-20',\n", " '2025-02-19',\n", " '2025-02-18',\n", " '2025-02-17',\n", " '2025-02-14',\n", " '2025-02-13',\n", " '2025-02-12',\n", " '2025-02-11',\n", " '2025-02-10',\n", " '2025-02-07',\n", " '2025-02-06',\n", " '2025-02-05',\n", " '2025-02-04',\n", " '2025-02-03',\n", " '2025-01-31',\n", " '2025-01-30',\n", " '2025-01-29',\n", " '2025-01-28',\n", " '2025-01-27',\n", " '2025-01-24',\n", " '2025-01-23',\n", " '2025-01-22',\n", " '2025-01-21',\n", " '2025-01-20',\n", " '2025-01-17',\n", " '2025-01-16',\n", " '2025-01-15',\n", " '2025-01-14',\n", " '2025-01-13',\n", " '2025-01-10',\n", " '2025-01-09',\n", " '2025-01-08',\n", " '2025-01-07',\n", " '2025-01-06',\n", " '2025-01-03',\n", " '2025-01-02',\n", " '2024-12-31',\n", " '2024-12-30',\n", " '2024-12-27',\n", " '2024-12-24',\n", " '2024-12-23',\n", " '2024-12-20',\n", " '2024-12-19',\n", " '2024-12-18',\n", " '2024-12-17',\n", " '2024-12-16',\n", " '2024-12-13',\n", " '2024-12-12',\n", " '2024-12-11',\n", " '2024-12-10',\n", " '2024-12-09',\n", " '2024-12-06',\n", " '2024-12-05',\n", " '2024-12-04',\n", " '2024-12-03',\n", " '2024-12-02',\n", " '2024-11-29',\n", " '2024-11-28',\n", " '2024-11-27',\n", " '2024-11-26',\n", " '2024-11-25',\n", " '2024-11-22',\n", " '2024-11-21',\n", " '2024-11-20',\n", " '2024-11-19',\n", " '2024-11-18',\n", " '2024-11-15',\n", " '2024-11-14',\n", " '2024-11-13',\n", " '2024-11-12',\n", " '2024-11-11',\n", " '2024-11-08',\n", " '2024-11-07',\n", " '2024-11-06',\n", " '2024-11-05',\n", " '2024-11-04',\n", " '2024-11-01',\n", " '2024-10-31',\n", " '2024-10-30',\n", " '2024-10-29',\n", " '2024-10-28',\n", " '2024-10-25',\n", " '2024-10-24',\n", " '2024-10-23',\n", " '2024-10-22',\n", " '2024-10-21',\n", " '2024-10-18',\n", " '2024-10-17',\n", " '2024-10-16',\n", " '2024-10-15',\n", " '2024-10-14',\n", " '2024-10-11',\n", " '2024-10-10',\n", " '2024-10-09',\n", " '2024-10-08',\n", " '2024-10-07',\n", " '2024-10-04',\n", " '2024-10-03',\n", " '2024-10-02',\n", " '2024-10-01',\n", " '2024-09-30',\n", " '2024-09-27',\n", " '2024-09-26',\n", " '2024-09-25',\n", " '2024-09-24',\n", " '2024-09-23',\n", " '2024-09-20',\n", " '2024-09-19',\n", " '2024-09-18',\n", " '2024-09-17',\n", " '2024-09-16',\n", " '2024-09-13',\n", " '2024-09-12',\n", " '2024-09-11',\n", " '2024-09-10',\n", " '2024-09-09',\n", " '2024-09-06',\n", " '2024-09-05',\n", " '2024-09-04',\n", " '2024-09-03',\n", " '2024-09-02',\n", " '2024-08-30',\n", " '2024-08-29',\n", " '2024-08-28',\n", " '2024-08-27',\n", " '2024-08-23',\n", " '2024-08-22',\n", " '2024-08-21',\n", " '2024-08-20',\n", " '2024-08-19',\n", " '2024-08-16',\n", " '2024-08-15',\n", " '2024-08-14',\n", " '2024-08-13',\n", " '2024-08-12',\n", " '2024-08-09',\n", " '2024-08-08',\n", " '2024-08-07',\n", " '2024-08-06',\n", " '2024-08-05',\n", " '2024-08-02',\n", " '2024-08-01',\n", " '2024-07-31',\n", " '2024-07-30',\n", " '2024-07-29',\n", " '2024-07-26',\n", " '2024-07-25',\n", " '2024-07-24',\n", " '2024-07-23',\n", " '2024-07-22',\n", " '2024-07-19',\n", " '2024-07-18',\n", " '2024-07-17',\n", " '2024-07-16',\n", " '2024-07-15',\n", " '2024-07-12',\n", " '2024-07-11',\n", " '2024-07-10',\n", " '2024-07-09',\n", " '2024-07-08',\n", " '2024-07-05',\n", " '2024-07-04',\n", " '2024-07-03',\n", " '2024-07-02',\n", " '2024-07-01',\n", " '2024-06-28',\n", " '2024-06-27',\n", " '2024-06-26',\n", " '2024-06-25',\n", " '2024-06-24',\n", " '2024-06-21',\n", " '2024-06-20',\n", " '2024-06-19',\n", " '2024-06-18',\n", " '2024-06-17',\n", " '2024-06-14',\n", " '2024-06-13',\n", " '2024-06-12',\n", " '2024-06-11',\n", " '2024-06-10',\n", " '2024-06-07',\n", " '2024-06-06',\n", " '2024-06-05',\n", " '2024-06-04',\n", " '2024-06-03',\n", " '2024-05-31',\n", " '2024-05-30',\n", " '2024-05-29',\n", " '2024-05-28',\n", " '2024-05-24',\n", " '2024-05-23',\n", " '2024-05-22',\n", " '2024-05-21',\n", " '2024-05-20',\n", " '2024-05-17',\n", " '2024-05-16',\n", " '2024-05-15',\n", " '2024-05-14',\n", " '2024-05-13',\n", " '2024-05-10',\n", " '2024-05-09',\n", " '2024-05-08',\n", " '2024-05-07',\n", " '2024-05-03',\n", " '2024-05-02',\n", " '2024-05-01',\n", " '2024-04-30',\n", " '2024-04-29',\n", " '2024-04-26',\n", " '2024-04-25',\n", " '2024-04-24',\n", " '2024-04-23',\n", " '2024-04-22',\n", " '2024-04-19',\n", " '2024-04-18',\n", " '2024-04-17',\n", " '2024-04-16',\n", " '2024-04-15',\n", " '2024-04-12',\n", " '2024-04-11',\n", " '2024-04-10',\n", " '2024-04-09',\n", " '2024-04-08',\n", " '2024-04-05',\n", " '2024-04-04',\n", " '2024-04-03',\n", " '2024-04-02',\n", " '2024-03-28',\n", " '2024-03-27',\n", " '2024-03-26',\n", " '2024-03-25',\n", " '2024-03-22',\n", " '2024-03-21',\n", " '2024-03-20',\n", " '2024-03-19',\n", " '2024-03-18',\n", " '2024-03-15',\n", " '2024-03-14',\n", " '2024-03-13',\n", " '2024-03-12',\n", " '2024-03-11',\n", " '2024-03-08',\n", " '2024-03-07',\n", " '2024-03-06',\n", " '2024-03-05',\n", " '2024-03-04',\n", " '2024-03-01',\n", " '2024-02-29',\n", " '2024-02-28',\n", " '2024-02-27',\n", " '2024-02-26',\n", " '2024-02-23',\n", " '2024-02-22',\n", " '2024-02-21',\n", " '2024-02-20',\n", " '2024-02-19',\n", " '2024-02-16',\n", " '2024-02-15',\n", " '2024-02-14',\n", " '2024-02-13',\n", " '2024-02-12',\n", " '2024-02-09',\n", " '2024-02-08',\n", " '2024-02-07',\n", " '2024-02-06',\n", " '2024-02-05',\n", " '2024-02-02',\n", " '2024-02-01',\n", " '2024-01-31',\n", " '2024-01-30',\n", " '2024-01-29',\n", " '2024-01-26',\n", " '2024-01-25',\n", " '2024-01-24',\n", " '2024-01-23',\n", " '2024-01-22',\n", " '2024-01-19',\n", " '2024-01-18',\n", " '2024-01-17',\n", " '2024-01-16',\n", " '2024-01-15',\n", " '2024-01-12',\n", " '2024-01-11',\n", " '2024-01-10',\n", " '2024-01-09',\n", " '2024-01-08',\n", " '2024-01-05',\n", " '2024-01-04',\n", " '2024-01-03',\n", " '2024-01-02',\n", " '2023-12-29',\n", " '2023-12-28',\n", " '2023-12-27',\n", " '2023-12-22',\n", " '2023-12-21',\n", " '2023-12-20',\n", " '2023-12-19',\n", " '2023-12-18',\n", " '2023-12-15',\n", " '2023-12-14',\n", " '2023-12-13',\n", " '2023-12-12',\n", " '2023-12-11',\n", " '2023-12-08',\n", " '2023-12-07',\n", " '2023-12-06',\n", " '2023-12-05',\n", " '2023-12-04',\n", " '2023-12-01',\n", " '2023-11-30',\n", " '2023-11-29',\n", " '2023-11-28',\n", " '2023-11-27',\n", " '2023-11-24',\n", " '2023-11-23',\n", " '2023-11-22',\n", " '2023-11-21',\n", " '2023-11-20',\n", " '2023-11-17',\n", " '2023-11-16',\n", " '2023-11-15',\n", " '2023-11-14',\n", " '2023-11-13',\n", " '2023-11-10',\n", " '2023-11-09',\n", " '2023-11-08',\n", " '2023-11-07',\n", " '2023-11-06',\n", " '2023-11-03',\n", " '2023-11-02',\n", " '2023-11-01',\n", " '2023-10-31',\n", " '2023-10-30',\n", " '2023-10-27',\n", " '2023-10-26',\n", " '2023-10-25',\n", " '2023-10-24',\n", " '2023-10-23',\n", " '2023-10-20',\n", " '2023-10-19',\n", " '2023-10-18',\n", " '2023-10-17',\n", " '2023-10-16',\n", " '2023-10-13',\n", " '2023-10-12',\n", " '2023-10-11',\n", " '2023-10-10',\n", " '2023-10-09',\n", " '2023-10-06',\n", " '2023-10-05',\n", " '2023-10-04',\n", " '2023-10-03',\n", " '2023-10-02',\n", " '2023-09-29',\n", " '2023-09-28',\n", " '2023-09-27',\n", " '2023-09-26',\n", " '2023-09-25',\n", " '2023-09-22',\n", " '2023-09-21',\n", " '2023-09-20',\n", " '2023-09-19',\n", " '2023-09-18',\n", " '2023-09-15',\n", " '2023-09-14',\n", " '2023-09-13',\n", " '2023-09-12',\n", " '2023-09-11',\n", " '2023-09-08',\n", " '2023-09-07',\n", " '2023-09-06',\n", " '2023-09-05',\n", " '2023-09-04',\n", " '2023-09-01',\n", " '2023-08-31',\n", " '2023-08-30',\n", " '2023-08-29',\n", " '2023-08-25',\n", " '2023-08-24',\n", " '2023-08-23',\n", " '2023-08-22',\n", " '2023-08-21',\n", " '2023-08-18',\n", " '2023-08-17',\n", " '2023-08-16',\n", " '2023-08-15',\n", " '2023-08-14',\n", " '2023-08-11',\n", " '2023-08-10',\n", " '2023-08-09',\n", " '2023-08-08',\n", " '2023-08-07',\n", " '2023-08-04',\n", " '2023-08-03',\n", " '2023-08-02',\n", " '2023-08-01',\n", " '2023-07-31',\n", " '2023-07-28',\n", " '2023-07-27',\n", " '2023-07-26',\n", " '2023-07-25',\n", " '2023-07-24',\n", " '2023-07-21',\n", " '2023-07-20',\n", " '2023-07-19',\n", " '2023-07-18',\n", " '2023-07-17',\n", " '2023-07-14',\n", " '2023-07-13',\n", " '2023-07-12',\n", " '2023-07-11',\n", " '2023-07-10',\n", " '2023-07-07',\n", " '2023-07-06',\n", " '2023-07-05',\n", " '2023-07-04',\n", " '2023-07-03',\n", " '2023-06-30',\n", " '2023-06-29',\n", " '2023-06-28',\n", " '2023-06-27',\n", " '2023-06-26',\n", " '2023-06-23',\n", " '2023-06-22',\n", " '2023-06-21',\n", " '2023-06-20',\n", " '2023-06-19',\n", " '2023-06-16',\n", " '2023-06-15',\n", " '2023-06-14',\n", " '2023-06-13',\n", " '2023-06-12',\n", " '2023-06-09',\n", " '2023-06-08',\n", " '2023-06-07',\n", " '2023-06-06',\n", " '2023-06-05',\n", " '2023-06-02',\n", " '2023-06-01',\n", " '2023-05-31',\n", " '2023-05-30',\n", " '2023-05-26',\n", " '2023-05-25',\n", " '2023-05-24',\n", " '2023-05-23',\n", " '2023-05-22',\n", " '2023-05-19',\n", " '2023-05-18',\n", " '2023-05-17',\n", " '2023-05-16',\n", " '2023-05-15',\n", " '2023-05-12',\n", " '2023-05-11',\n", " '2023-05-10',\n", " '2023-05-09',\n", " '2023-05-05',\n", " '2023-05-04',\n", " '2023-05-03',\n", " '2023-05-02',\n", " '2023-04-28',\n", " '2023-04-27',\n", " '2023-04-26',\n", " '2023-04-25',\n", " '2023-04-24',\n", " '2023-04-21',\n", " '2023-04-20',\n", " '2023-04-19',\n", " '2023-04-18',\n", " '2023-04-17',\n", " '2023-04-14',\n", " '2023-04-13',\n", " '2023-04-12',\n", " '2023-04-11',\n", " '2023-04-06',\n", " '2023-04-05',\n", " '2023-04-04',\n", " '2023-04-03',\n", " '2023-03-31',\n", " '2023-03-30',\n", " '2023-03-29',\n", " '2023-03-28',\n", " '2023-03-27',\n", " '2023-03-24',\n", " '2023-03-23',\n", " '2023-03-22',\n", " '2023-03-21',\n", " '2023-03-20',\n", " '2023-03-17',\n", " '2023-03-16',\n", " '2023-03-15',\n", " '2023-03-14',\n", " '2023-03-13',\n", " '2023-03-10',\n", " '2023-03-09',\n", " '2023-03-08',\n", " '2023-03-07',\n", " '2023-03-06',\n", " '2023-03-03',\n", " '2023-03-02',\n", " '2023-03-01',\n", " '2023-02-28',\n", " '2023-02-27',\n", " '2023-02-24',\n", " '2023-02-23',\n", " '2023-02-22',\n", " '2023-02-21',\n", " '2023-02-20',\n", " '2023-02-17',\n", " '2023-02-16',\n", " '2023-02-15',\n", " '2023-02-14',\n", " '2023-02-13',\n", " '2023-02-10',\n", " '2023-02-09',\n", " '2023-02-08',\n", " '2023-02-07',\n", " '2023-02-06',\n", " '2023-02-03',\n", " '2023-02-02',\n", " '2023-02-01',\n", " '2023-01-31',\n", " '2023-01-30',\n", " '2023-01-27',\n", " '2023-01-26',\n", " '2023-01-25',\n", " '2023-01-24',\n", " '2023-01-23',\n", " '2023-01-20',\n", " '2023-01-19',\n", " '2023-01-18',\n", " '2023-01-17',\n", " '2023-01-16',\n", " '2023-01-13',\n", " '2023-01-12',\n", " '2023-01-11',\n", " '2023-01-10',\n", " '2023-01-09',\n", " '2023-01-06',\n", " '2023-01-05',\n", " '2023-01-04',\n", " '2023-01-03',\n", " '2022-12-30',\n", " '2022-12-29',\n", " '2022-12-28',\n", " '2022-12-23',\n", " '2022-12-22',\n", " '2022-12-21',\n", " '2022-12-20',\n", " '2022-12-19',\n", " '2022-12-16',\n", " '2022-12-15',\n", " '2022-12-14',\n", " '2022-12-13',\n", " '2022-12-12',\n", " '2022-12-09',\n", " '2022-12-08',\n", " '2022-12-07',\n", " '2022-12-06',\n", " '2022-12-05',\n", " '2022-12-02',\n", " '2022-12-01',\n", " '2022-11-30',\n", " '2022-11-29',\n", " '2022-11-28',\n", " '2022-11-25',\n", " '2022-11-24',\n", " '2022-11-23',\n", " '2022-11-22',\n", " '2022-11-21',\n", " '2022-11-18',\n", " '2022-11-17',\n", " '2022-11-16',\n", " '2022-11-15',\n", " '2022-11-14',\n", " '2022-11-11',\n", " '2022-11-10',\n", " '2022-11-09',\n", " '2022-11-08',\n", " '2022-11-07',\n", " '2022-11-04',\n", " '2022-11-03',\n", " '2022-11-02',\n", " '2022-11-01',\n", " '2022-10-31',\n", " '2022-10-28',\n", " '2022-10-27',\n", " '2022-10-26',\n", " '2022-10-25',\n", " '2022-10-24',\n", " '2022-10-21',\n", " '2022-10-20',\n", " '2022-10-19',\n", " '2022-10-18',\n", " '2022-10-17',\n", " '2022-10-14',\n", " '2022-10-13',\n", " '2022-10-12',\n", " '2022-10-11',\n", " '2022-10-10',\n", " '2022-10-07',\n", " '2022-10-06',\n", " '2022-10-05',\n", " '2022-10-04',\n", " '2022-10-03',\n", " '2022-09-30',\n", " '2022-09-29',\n", " '2022-09-28',\n", " '2022-09-27',\n", " '2022-09-26',\n", " '2022-09-23',\n", " '2022-09-22',\n", " '2022-09-21',\n", " '2022-09-20',\n", " '2022-09-16',\n", " '2022-09-15',\n", " '2022-09-14',\n", " '2022-09-13',\n", " '2022-09-12',\n", " '2022-09-09',\n", " '2022-09-08',\n", " '2022-09-07',\n", " '2022-09-06',\n", " '2022-09-05',\n", " '2022-09-02',\n", " '2022-09-01',\n", " '2022-08-31',\n", " '2022-08-30',\n", " '2022-08-26',\n", " '2022-08-25',\n", " '2022-08-24',\n", " '2022-08-23',\n", " '2022-08-22',\n", " '2022-08-19',\n", " '2022-08-18',\n", " '2022-08-17',\n", " '2022-08-16',\n", " '2022-08-15',\n", " '2022-08-12',\n", " '2022-08-11',\n", " '2022-08-10',\n", " '2022-08-09',\n", " '2022-08-08',\n", " '2022-08-05',\n", " '2022-08-04',\n", " '2022-08-03',\n", " '2022-08-02',\n", " '2022-08-01',\n", " '2022-07-29',\n", " '2022-07-28',\n", " '2022-07-27',\n", " '2022-07-26',\n", " '2022-07-25',\n", " '2022-07-22',\n", " '2022-07-21',\n", " '2022-07-20',\n", " '2022-07-19',\n", " '2022-07-18',\n", " '2022-07-15',\n", " '2022-07-14',\n", " '2022-07-13',\n", " '2022-07-12',\n", " '2022-07-11',\n", " '2022-07-08',\n", " '2022-07-07',\n", " '2022-07-06',\n", " '2022-07-05',\n", " '2022-07-04',\n", " '2022-07-01',\n", " '2022-06-30',\n", " '2022-06-29',\n", " '2022-06-28',\n", " '2022-06-27',\n", " '2022-06-24',\n", " '2022-06-23',\n", " '2022-06-22',\n", " '2022-06-21',\n", " '2022-06-20',\n", " '2022-06-17',\n", " '2022-06-16',\n", " '2022-06-15',\n", " '2022-06-14',\n", " '2022-06-13',\n", " '2022-06-10',\n", " '2022-06-09',\n", " '2022-06-08',\n", " '2022-06-07',\n", " '2022-06-06',\n", " '2022-06-01',\n", " '2022-05-31',\n", " '2022-05-30',\n", " '2022-05-27',\n", " '2022-05-26',\n", " '2022-05-25',\n", " '2022-05-24',\n", " '2022-05-23',\n", " '2022-05-20',\n", " '2022-05-19',\n", " '2022-05-18',\n", " '2022-05-17',\n", " '2022-05-16',\n", " '2022-05-13',\n", " '2022-05-12',\n", " '2022-05-11',\n", " '2022-05-10',\n", " '2022-05-09',\n", " '2022-05-06',\n", " '2022-05-05',\n", " '2022-05-04',\n", " '2022-05-03',\n", " '2022-04-29',\n", " '2022-04-28',\n", " '2022-04-27',\n", " '2022-04-26',\n", " '2022-04-25',\n", " '2022-04-22',\n", " '2022-04-21',\n", " '2022-04-20',\n", " '2022-04-19',\n", " '2022-04-14',\n", " '2022-04-13',\n", " '2022-04-12',\n", " '2022-04-11',\n", " '2022-04-08',\n", " '2022-04-07',\n", " '2022-04-06',\n", " '2022-04-05',\n", " '2022-04-04',\n", " '2022-04-01',\n", " '2022-03-31',\n", " '2022-03-30',\n", " '2022-03-29',\n", " '2022-03-28',\n", " '2022-03-25',\n", " '2022-03-24',\n", " '2022-03-23',\n", " '2022-03-22',\n", " '2022-03-21',\n", " '2022-03-18',\n", " '2022-03-17',\n", " '2022-03-16',\n", " '2022-03-15',\n", " '2022-03-14',\n", " '2022-03-11',\n", " '2022-03-10',\n", " '2022-03-09',\n", " '2022-03-08',\n", " '2022-03-07',\n", " '2022-03-04',\n", " '2022-03-03',\n", " '2022-03-02',\n", " '2022-03-01',\n", " '2022-02-28',\n", " '2022-02-25',\n", " '2022-02-24',\n", " '2022-02-23',\n", " '2022-02-22',\n", " '2022-02-21',\n", " '2022-02-18',\n", " '2022-02-17',\n", " '2022-02-16',\n", " '2022-02-15',\n", " '2022-02-14',\n", " '2022-02-11',\n", " '2022-02-10',\n", " '2022-02-09',\n", " '2022-02-08',\n", " '2022-02-07',\n", " '2022-02-04',\n", " '2022-02-03',\n", " '2022-02-02',\n", " '2022-02-01',\n", " '2022-01-31',\n", " '2022-01-28',\n", " '2022-01-27',\n", " '2022-01-26',\n", " '2022-01-25',\n", " '2022-01-24',\n", " '2022-01-21',\n", " '2022-01-20',\n", " '2022-01-19',\n", " '2022-01-18',\n", " '2022-01-17',\n", " '2022-01-14',\n", " '2022-01-13',\n", " '2022-01-12',\n", " '2022-01-11',\n", " '2022-01-10',\n", " '2022-01-07',\n", " '2022-01-06',\n", " '2022-01-05',\n", " '2022-01-04',\n", " '2021-12-30',\n", " '2021-12-29',\n", " '2021-12-23',\n", " '2021-12-22',\n", " '2021-12-21',\n", " '2021-12-20',\n", " '2021-12-17',\n", " '2021-12-16',\n", " '2021-12-15',\n", " '2021-12-14',\n", " '2021-12-13',\n", " '2021-12-10',\n", " '2021-12-09',\n", " '2021-12-08',\n", " '2021-12-07',\n", " '2021-12-06',\n", " '2021-12-03',\n", " '2021-12-02',\n", " '2021-12-01',\n", " '2021-11-30',\n", " '2021-11-29',\n", " '2021-11-26',\n", " '2021-11-25',\n", " '2021-11-24',\n", " '2021-11-23',\n", " '2021-11-22',\n", " '2021-11-19',\n", " '2021-11-18',\n", " '2021-11-17',\n", " '2021-11-16',\n", " '2021-11-15',\n", " '2021-11-12',\n", " '2021-11-11',\n", " '2021-11-10',\n", " '2021-11-09',\n", " '2021-11-08',\n", " '2021-11-05',\n", " '2021-11-04',\n", " '2021-11-03',\n", " '2021-11-02',\n", " '2021-11-01',\n", " '2021-10-29',\n", " '2021-10-28',\n", " '2021-10-27',\n", " '2021-10-26',\n", " '2021-10-25',\n", " '2021-10-22',\n", " '2021-10-21',\n", " '2021-10-20',\n", " '2021-10-19',\n", " '2021-10-18',\n", " '2021-10-15',\n", " '2021-10-14',\n", " '2021-10-13',\n", " '2021-10-12',\n", " '2021-10-11',\n", " '2021-10-08',\n", " '2021-10-07',\n", " '2021-10-06',\n", " '2021-10-05',\n", " '2021-10-04',\n", " '2021-10-01',\n", " '2021-09-30',\n", " '2021-09-29',\n", " '2021-09-28',\n", " '2021-09-27',\n", " '2021-09-24',\n", " '2021-09-23',\n", " '2021-09-22',\n", " '2021-09-21',\n", " '2021-09-20',\n", " '2021-09-17',\n", " '2021-09-16',\n", " '2021-09-15',\n", " '2021-09-14',\n", " '2021-09-13',\n", " '2021-09-10',\n", " '2021-09-09',\n", " '2021-09-08',\n", " '2021-09-07',\n", " '2021-09-06',\n", " '2021-09-03',\n", " '2021-09-02',\n", " '2021-09-01'],\n", " 'ladenBallastDays': [[0, 0],\n", " [1, 1],\n", " [4, 4],\n", " [7, 7],\n", " [10, 10],\n", " [15, 15],\n", " [20, 20]]}}" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Shows the structure of the raw dictionary called\n", "dicto1" ] }, { "cell_type": "markdown", "id": "91809a58", "metadata": {}, "source": [ "### Reformatting\n", "\n", "For a more accessible data format, we filter the data to only retrieve ports that have available Netbacks data. We then reformat this into a DataFrame." ] }, { "cell_type": "code", "execution_count": 27, "id": "aaefce45", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", " | Index | \n", "Ports | \n", "Ticker | \n", "Available Via | \n", "
---|---|---|---|---|
0 | \n", "0 | \n", "Wheatstone | \n", "00398967-3ee1-4b26-bcdb-805ad19dbcce | \n", "[suez, None] | \n", "
1 | \n", "1 | \n", "Woodfibre LNG | \n", "00314d16-eada-4f37-bff3-d844708aeb45 | \n", "[panama, None] | \n", "
2 | \n", "2 | \n", "Corpus Christi | \n", "0030c461-9a63-403d-8f53-9327ea773517 | \n", "[cogh, panama, suez, None] | \n", "
3 | \n", "3 | \n", "Bintulu | \n", "003342b7-ba5b-4f0e-b6df-4d95837a5691 | \n", "[suez, None] | \n", "
4 | \n", "4 | \n", "Lake Charles | \n", "003ff22f-77d8-413f-9997-2c6280e7c28c | \n", "[cogh, panama, suez, None] | \n", "
\n", " | ReleaseDate | \n", "DeliveryMonthIndex | \n", "DeliveryMonthStart | \n", "DeliveryDate | \n", "NWECargoLoadDate | \n", "NEACargoLoadDate | \n", "DeliveryMonthArb | \n", "JKMTTFSpreadBreakeven | \n", "FobPortUUID | \n", "FobPortName | \n", "ViaPoint | \n", "
---|---|---|---|---|---|---|---|---|---|---|---|
0 | \n", "2025-07-30 | \n", "M+2 | \n", "2025-09 | \n", "2025-09-15 | \n", "2025-08-29 | \n", "2025-08-02 | \n", "NaN | \n", "NaN | \n", "003dec0a-ce8f-41db-8c24-4d7ef6addf70 | \n", "sabine-pass | \n", "cogh | \n", "
1 | \n", "2025-07-30 | \n", "M+3 | \n", "2025-10 | \n", "2025-10-15 | \n", "2025-09-28 | \n", "2025-09-01 | \n", "-0.159 | \n", "0.389 | \n", "003dec0a-ce8f-41db-8c24-4d7ef6addf70 | \n", "sabine-pass | \n", "cogh | \n", "
2 | \n", "2025-07-30 | \n", "M+4 | \n", "2025-11 | \n", "2025-11-15 | \n", "2025-10-29 | \n", "2025-10-02 | \n", "-0.163 | \n", "0.288 | \n", "003dec0a-ce8f-41db-8c24-4d7ef6addf70 | \n", "sabine-pass | \n", "cogh | \n", "
3 | \n", "2025-07-30 | \n", "M+5 | \n", "2025-12 | \n", "2025-12-15 | \n", "2025-11-28 | \n", "2025-11-01 | \n", "-0.138 | \n", "0.458 | \n", "003dec0a-ce8f-41db-8c24-4d7ef6addf70 | \n", "sabine-pass | \n", "cogh | \n", "
4 | \n", "2025-07-30 | \n", "M+6 | \n", "2026-01 | \n", "2026-01-15 | \n", "2025-12-29 | \n", "2025-12-02 | \n", "-0.173 | \n", "0.598 | \n", "003dec0a-ce8f-41db-8c24-4d7ef6addf70 | \n", "sabine-pass | \n", "cogh | \n", "
... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
75 | \n", "2025-07-21 | \n", "M+7 | \n", "2026-02 | \n", "2026-02-15 | \n", "2026-01-29 | \n", "2026-01-02 | \n", "-0.395 | \n", "0.818 | \n", "003dec0a-ce8f-41db-8c24-4d7ef6addf70 | \n", "sabine-pass | \n", "cogh | \n", "
76 | \n", "2025-07-21 | \n", "M+8 | \n", "2026-03 | \n", "2026-03-15 | \n", "2026-02-26 | \n", "2026-01-30 | \n", "-0.548 | \n", "0.723 | \n", "003dec0a-ce8f-41db-8c24-4d7ef6addf70 | \n", "sabine-pass | \n", "cogh | \n", "
77 | \n", "2025-07-21 | \n", "M+9 | \n", "2026-04 | \n", "2026-04-15 | \n", "2026-03-29 | \n", "2026-03-02 | \n", "-0.480 | \n", "0.643 | \n", "003dec0a-ce8f-41db-8c24-4d7ef6addf70 | \n", "sabine-pass | \n", "cogh | \n", "
78 | \n", "2025-07-21 | \n", "M+10 | \n", "2026-05 | \n", "2026-05-15 | \n", "2026-04-28 | \n", "2026-04-01 | \n", "-0.221 | \n", "0.498 | \n", "003dec0a-ce8f-41db-8c24-4d7ef6addf70 | \n", "sabine-pass | \n", "cogh | \n", "
79 | \n", "2025-07-21 | \n", "M+11 | \n", "2026-06 | \n", "2026-06-15 | \n", "2026-05-29 | \n", "2026-05-02 | \n", "-0.028 | \n", "0.348 | \n", "003dec0a-ce8f-41db-8c24-4d7ef6addf70 | \n", "sabine-pass | \n", "cogh | \n", "
80 rows × 11 columns
\n", "