diff --git a/eirgrid-api.ipynb b/eirgrid-api.ipynb deleted file mode 100644 index 3de0ba1..0000000 --- a/eirgrid-api.ipynb +++ /dev/null @@ -1,3073 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**EirGrid-Scraping**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Co2 Forecast " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This Python script is designed to fetch CO2 data from a specific API. It includes the following key components:\n", - "\n", - "1. **Round Down Time Function (`round_down_time`)**\n", - " - Rounds down the current time to the nearest half-hour, accommodating the data's 30-minute availability intervals.\n", - "\n", - "2. **URL Creation Function (`create_url`)**\n", - " - Constructs the API URL using formatted start and end times and a chosen region.\n", - "\n", - "3. **Time and Region Settings**\n", - " - Sets the current time (`now`), applies the round-down function, and calculates the end time as 24 hours from the current time.\n", - " - Selects a region (example: 'ROI') for data fetching.\n", - "\n", - "4. **API Request**\n", - " - Generates the API URL and performs a GET request to retrieve the data.\n", - " - Stores the response in JSON format.\n", - "\n", - "This script is tailored for accessing time-sensitive environmental data from a designated API endpoint.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "from datetime import datetime, timedelta\n", - "import requests\n", - "from pandas import DataFrame\n", - "\n", - "# data is availble every 30 minutes, so we need to start at the nearest half-hour \n", - "def round_down_time(dt):\n", - " # Round down to the nearest half-ho/ur\n", - " new_minute = 30 if dt.minute >= 30 else 0\n", - " return dt.replace(minute=new_minute, second=0, microsecond=0)\n", - "\n", - "# Function to create the API URL based on the start and end datetimes and the region\n", - "def create_url(start_datetime, end_datetime, region):\n", - " start_str = start_datetime.strftime(\"%Y%m%d%H%M\")\n", - " end_str = end_datetime.strftime(\"%Y%m%d%H%M\")\n", - " url = f\"https://www.co2.smartgriddashboard.com/api/co2_fc/{start_str}/{end_str}/{region}\"\n", - " return url\n", - "\n", - "# Current date and time\n", - "now = datetime.now()\n", - "# Round down to the nearest half-hour\n", - "start_time = round_down_time(now)\n", - "# For end time, let's use 24 hours from now\n", - "end_time = now.replace(hour=23, minute=59, second=59, microsecond=0) #now + timedelta(days=1)\n", - "\n", - "# Define the region\n", - "region = ['ROI', 'NI', 'ALL']\n", - "\n", - "# Create the URL\n", - "api_url = create_url(start_time, end_time, region[2])\n", - "response = requests.get(api_url)\n", - "Rs = response.json()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "df_carbon_forecast = pd.DataFrame(Rs['Rows'])\n", - "\n", - "# Convert 'EffectiveTime' to datetime and set as index\n", - "df_carbon_forecast['EffectiveTime'] = pd.to_datetime(df_carbon_forecast['EffectiveTime'], format='%d-%b-%Y %H:%M:%S')\n", - "df_carbon_forecast_indexed = df_carbon_forecast.set_index('EffectiveTime')\n", - "\n", - "# Now you can slice the DataFrame using datetime index\n", - "# # For example, to access data at '26-JAN-2024 21:30:00'\n", - "# specific_time_data = df_carbon_forecast_indexed.loc['2024-01-26 21:30:00']\n", - "\n", - "# # To access a range of times\n", - "# time_range_data = df_carbon_forecast_indexed['2024-01-26 21:00:00':'2024-01-26 22:00:00']\n", - "\n", - "# # Print to see the results\n", - "# print(specific_time_data)\n", - "# print(time_range_data)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
FieldNameRegionValue
EffectiveTime
2024-01-31 16:00:00CO2_INTENSITY_FORECASTALL192.9747
2024-01-31 16:30:00CO2_INTENSITY_FORECASTALL204.8873
2024-01-31 17:00:00CO2_INTENSITY_FORECASTALL207.7346
2024-01-31 17:30:00CO2_INTENSITY_FORECASTALL213.5658
2024-01-31 18:00:00CO2_INTENSITY_FORECASTALL211.1651
2024-01-31 18:30:00CO2_INTENSITY_FORECASTALL214.0227
2024-01-31 19:00:00CO2_INTENSITY_FORECASTALL215.0443
2024-01-31 19:30:00CO2_INTENSITY_FORECASTALL218.4071
2024-01-31 20:00:00CO2_INTENSITY_FORECASTALL227.2394
2024-01-31 20:30:00CO2_INTENSITY_FORECASTALL239.7786
2024-01-31 21:00:00CO2_INTENSITY_FORECASTALL246.6198
2024-01-31 21:30:00CO2_INTENSITY_FORECASTALL251.8885
2024-01-31 22:00:00CO2_INTENSITY_FORECASTALL250.4504
2024-01-31 22:30:00CO2_INTENSITY_FORECASTALL263.3766
2024-01-31 23:00:00CO2_INTENSITY_FORECASTALL268.8076
2024-01-31 23:30:00CO2_INTENSITY_FORECASTALL276.3731
\n", - "
" - ], - "text/plain": [ - " FieldName Region Value\n", - "EffectiveTime \n", - "2024-01-31 16:00:00 CO2_INTENSITY_FORECAST ALL 192.9747\n", - "2024-01-31 16:30:00 CO2_INTENSITY_FORECAST ALL 204.8873\n", - "2024-01-31 17:00:00 CO2_INTENSITY_FORECAST ALL 207.7346\n", - "2024-01-31 17:30:00 CO2_INTENSITY_FORECAST ALL 213.5658\n", - "2024-01-31 18:00:00 CO2_INTENSITY_FORECAST ALL 211.1651\n", - "2024-01-31 18:30:00 CO2_INTENSITY_FORECAST ALL 214.0227\n", - "2024-01-31 19:00:00 CO2_INTENSITY_FORECAST ALL 215.0443\n", - "2024-01-31 19:30:00 CO2_INTENSITY_FORECAST ALL 218.4071\n", - "2024-01-31 20:00:00 CO2_INTENSITY_FORECAST ALL 227.2394\n", - "2024-01-31 20:30:00 CO2_INTENSITY_FORECAST ALL 239.7786\n", - "2024-01-31 21:00:00 CO2_INTENSITY_FORECAST ALL 246.6198\n", - "2024-01-31 21:30:00 CO2_INTENSITY_FORECAST ALL 251.8885\n", - "2024-01-31 22:00:00 CO2_INTENSITY_FORECAST ALL 250.4504\n", - "2024-01-31 22:30:00 CO2_INTENSITY_FORECAST ALL 263.3766\n", - "2024-01-31 23:00:00 CO2_INTENSITY_FORECAST ALL 268.8076\n", - "2024-01-31 23:30:00 CO2_INTENSITY_FORECAST ALL 276.3731" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_carbon_forecast_indexed" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Co2 intensity (measured) from day before" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Start Time: 30-jan-2024+16%3A15\n", - "End Time: 31-jan-2024+16%3A15\n" - ] - } - ], - "source": [ - "import datetime\n", - "\n", - "# Function to round time to the nearest 15 minutes\n", - "def round_time(dt):\n", - " # Round minutes to the nearest 15\n", - " new_minute = (dt.minute // 15) * 15\n", - " return dt.replace(minute=new_minute, second=0, microsecond=0)\n", - "\n", - "# Function to format date in your specific format\n", - "def format_date(dt):\n", - " return dt.strftime(\"%d-%b-%Y\").lower() + \"+\" + dt.strftime(\"%H%%3A%M\")\n", - "\n", - "# Current date and time, rounded to the nearest 15 minutes\n", - "now = round_time(datetime.datetime.now())\n", - "\n", - "# Start time (same time yesterday, rounded to the nearest 15 minutes)\n", - "yesterday = now - datetime.timedelta(days=1)\n", - "startDateTime = format_date(yesterday)\n", - "\n", - "# End time (current time, rounded to the nearest 15 minutes)\n", - "endDateTime = format_date(now)\n", - "\n", - "# Print formatted start and end times\n", - "print(\"Start Time:\", startDateTime)\n", - "print(\"End Time:\", endDateTime)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "import requests , json\n", - "\n", - "area = ['CO2Stats', 'generationactual', 'co2emission', 'co2intensity', 'interconnection', 'SnspAll', 'frequency', 'demandactual', 'windactual']\n", - "region = ['ROI', 'NI', 'ALL']\n", - "Rows = []\n", - "\n", - "url = f'http://smartgriddashboard.eirgrid.com/DashboardService.svc/data?area={area[3]}®ion={region[2]}&datefrom={startDateTime}&dateto={endDateTime}'\n", - "response = requests.get(url)\n", - "Rs = json.loads(response.text)[\"Rows\"]\n", - "for row in Rs:\n", - " Rows.append(row)\n", - "\n", - "df_carbon_intensity_day_before= DataFrame(Rows)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "# Convert 'EffectiveTime' to datetime and set as index\n", - "df_carbon_intensity_day_before['EffectiveTime'] = pd.to_datetime(df_carbon_intensity_day_before['EffectiveTime'], format='%d-%b-%Y %H:%M:%S')\n", - "df_carbon_intensity_indexed = df_carbon_intensity_day_before.set_index('EffectiveTime')" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
FieldNameRegionValue
EffectiveTime
2024-01-30 16:15:00CO2_INTENSITYALL224.0
2024-01-30 16:30:00CO2_INTENSITYALL227.0
2024-01-30 16:45:00CO2_INTENSITYALL226.0
2024-01-30 17:00:00CO2_INTENSITYALL219.0
2024-01-30 17:15:00CO2_INTENSITYALL216.0
............
2024-01-31 15:15:00CO2_INTENSITYALL145.0
2024-01-31 15:30:00CO2_INTENSITYALL151.0
2024-01-31 15:45:00CO2_INTENSITYALL156.0
2024-01-31 16:00:00CO2_INTENSITYALL157.0
2024-01-31 16:15:00CO2_INTENSITYALLNaN
\n", - "

97 rows × 3 columns

\n", - "
" - ], - "text/plain": [ - " FieldName Region Value\n", - "EffectiveTime \n", - "2024-01-30 16:15:00 CO2_INTENSITY ALL 224.0\n", - "2024-01-30 16:30:00 CO2_INTENSITY ALL 227.0\n", - "2024-01-30 16:45:00 CO2_INTENSITY ALL 226.0\n", - "2024-01-30 17:00:00 CO2_INTENSITY ALL 219.0\n", - "2024-01-30 17:15:00 CO2_INTENSITY ALL 216.0\n", - "... ... ... ...\n", - "2024-01-31 15:15:00 CO2_INTENSITY ALL 145.0\n", - "2024-01-31 15:30:00 CO2_INTENSITY ALL 151.0\n", - "2024-01-31 15:45:00 CO2_INTENSITY ALL 156.0\n", - "2024-01-31 16:00:00 CO2_INTENSITY ALL 157.0\n", - "2024-01-31 16:15:00 CO2_INTENSITY ALL NaN\n", - "\n", - "[97 rows x 3 columns]" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_carbon_intensity_indexed" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "last_value_index = df_carbon_intensity_indexed['Value'].last_valid_index()" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Timestamp('2024-01-31 16:00:00')" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "last_value_index" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/var/folders/n8/5rf_2zc91lx1ffhm5t27hrsw0000gn/T/ipykernel_1901/751672942.py:14: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " df_carbon_intensity_recent['Value'] = df_carbon_intensity_recent['Value'].interpolate()\n" - ] - } - ], - "source": [ - "import pandas as pd\n", - "import numpy as np\n", - "\n", - "\n", - "# Interpolate NaN values, except for the last NaN\n", - "last_value_index_co_intensity = df_carbon_intensity_indexed['Value'].last_valid_index()\n", - "\n", - "# Reverse the DataFrame\n", - "\n", - "\n", - "# Select rows up to the row before the last NaN\n", - "df_carbon_intensity_recent = df_carbon_intensity_indexed.loc[:last_value_index_co_intensity]\n", - "\n", - "df_carbon_intensity_recent['Value'] = df_carbon_intensity_recent['Value'].interpolate()\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
FieldNameRegionValue
EffectiveTime
2024-01-30 16:15:00CO2_INTENSITYALL224.0
2024-01-30 16:30:00CO2_INTENSITYALL227.0
2024-01-30 16:45:00CO2_INTENSITYALL226.0
2024-01-30 17:00:00CO2_INTENSITYALL219.0
2024-01-30 17:15:00CO2_INTENSITYALL216.0
............
2024-01-31 15:00:00CO2_INTENSITYALL142.0
2024-01-31 15:15:00CO2_INTENSITYALL145.0
2024-01-31 15:30:00CO2_INTENSITYALL151.0
2024-01-31 15:45:00CO2_INTENSITYALL156.0
2024-01-31 16:00:00CO2_INTENSITYALL157.0
\n", - "

96 rows × 3 columns

\n", - "
" - ], - "text/plain": [ - " FieldName Region Value\n", - "EffectiveTime \n", - "2024-01-30 16:15:00 CO2_INTENSITY ALL 224.0\n", - "2024-01-30 16:30:00 CO2_INTENSITY ALL 227.0\n", - "2024-01-30 16:45:00 CO2_INTENSITY ALL 226.0\n", - "2024-01-30 17:00:00 CO2_INTENSITY ALL 219.0\n", - "2024-01-30 17:15:00 CO2_INTENSITY ALL 216.0\n", - "... ... ... ...\n", - "2024-01-31 15:00:00 CO2_INTENSITY ALL 142.0\n", - "2024-01-31 15:15:00 CO2_INTENSITY ALL 145.0\n", - "2024-01-31 15:30:00 CO2_INTENSITY ALL 151.0\n", - "2024-01-31 15:45:00 CO2_INTENSITY ALL 156.0\n", - "2024-01-31 16:00:00 CO2_INTENSITY ALL 157.0\n", - "\n", - "[96 rows x 3 columns]" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_carbon_intensity_recent" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
FieldNameRegionValue
EffectiveTime
2024-01-29 00:00:00CO2_INTENSITYALL295.0
2024-01-29 00:15:00CO2_INTENSITYALL293.0
2024-01-29 00:30:00CO2_INTENSITYALL294.0
2024-01-29 00:45:00CO2_INTENSITYALL294.0
2024-01-29 01:00:00CO2_INTENSITYALL291.0
............
2024-01-29 23:00:00CO2_INTENSITYALL237.0
2024-01-29 23:15:00CO2_INTENSITYALL241.0
2024-01-29 23:30:00CO2_INTENSITYALL244.0
2024-01-29 23:45:00CO2_INTENSITYALL244.0
2024-01-30 00:00:00CO2_INTENSITYALL244.0
\n", - "

97 rows × 3 columns

\n", - "
" - ], - "text/plain": [ - " FieldName Region Value\n", - "EffectiveTime \n", - "2024-01-29 00:00:00 CO2_INTENSITY ALL 295.0\n", - "2024-01-29 00:15:00 CO2_INTENSITY ALL 293.0\n", - "2024-01-29 00:30:00 CO2_INTENSITY ALL 294.0\n", - "2024-01-29 00:45:00 CO2_INTENSITY ALL 294.0\n", - "2024-01-29 01:00:00 CO2_INTENSITY ALL 291.0\n", - "... ... ... ...\n", - "2024-01-29 23:00:00 CO2_INTENSITY ALL 237.0\n", - "2024-01-29 23:15:00 CO2_INTENSITY ALL 241.0\n", - "2024-01-29 23:30:00 CO2_INTENSITY ALL 244.0\n", - "2024-01-29 23:45:00 CO2_INTENSITY ALL 244.0\n", - "2024-01-30 00:00:00 CO2_INTENSITY ALL 244.0\n", - "\n", - "[97 rows x 3 columns]" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_carbon_intensity_recent" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{\"mean\": 259.659793814433, \"min\": 226.0, \"max\": 319.0}\n" - ] - } - ], - "source": [ - "import json\n", - "\n", - "# Calculate mean, min, and max\n", - "mean_val = df_carbon_intensity_recent['Value'].mean()\n", - "min_val = df_carbon_intensity_recent['Value'].min()\n", - "max_val = df_carbon_intensity_recent['Value'].max()\n", - "\n", - "# Create a dictionary with these values\n", - "co2_stats_prior_day = {\n", - " \"mean\": mean_val,\n", - " \"min\": min_val,\n", - " \"max\": max_val\n", - "}\n", - "\n", - "# Convert the dictionary to a JSON string\n", - "co2_stats_json_prior_day = json.dumps(co2_stats_prior_day)\n", - "\n", - "print(co2_stats_json_prior_day)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "319.0" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "co2_stats_prior_day['max']" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
FieldNameRegionValue
EffectiveTime
2024-01-29 00:00:00CO2_INTENSITYALL295.0
2024-01-29 00:15:00CO2_INTENSITYALL293.0
2024-01-29 00:30:00CO2_INTENSITYALL294.0
2024-01-29 00:45:00CO2_INTENSITYALL294.0
2024-01-29 01:00:00CO2_INTENSITYALL291.0
............
2024-01-29 23:00:00CO2_INTENSITYALL237.0
2024-01-29 23:15:00CO2_INTENSITYALL241.0
2024-01-29 23:30:00CO2_INTENSITYALL244.0
2024-01-29 23:45:00CO2_INTENSITYALLNaN
2024-01-30 00:00:00CO2_INTENSITYALLNaN
\n", - "

97 rows × 3 columns

\n", - "
" - ], - "text/plain": [ - " FieldName Region Value\n", - "EffectiveTime \n", - "2024-01-29 00:00:00 CO2_INTENSITY ALL 295.0\n", - "2024-01-29 00:15:00 CO2_INTENSITY ALL 293.0\n", - "2024-01-29 00:30:00 CO2_INTENSITY ALL 294.0\n", - "2024-01-29 00:45:00 CO2_INTENSITY ALL 294.0\n", - "2024-01-29 01:00:00 CO2_INTENSITY ALL 291.0\n", - "... ... ... ...\n", - "2024-01-29 23:00:00 CO2_INTENSITY ALL 237.0\n", - "2024-01-29 23:15:00 CO2_INTENSITY ALL 241.0\n", - "2024-01-29 23:30:00 CO2_INTENSITY ALL 244.0\n", - "2024-01-29 23:45:00 CO2_INTENSITY ALL NaN\n", - "2024-01-30 00:00:00 CO2_INTENSITY ALL NaN\n", - "\n", - "[97 rows x 3 columns]" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_carbon_intensity_indexed" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Timestamp('2024-01-29 23:30:00')" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_carbon_intensity_indexed.iloc[::-1]['Value'].first_valid_index()" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
FieldNameRegionValue
EffectiveTime
2024-01-29 00:00:00CO2_INTENSITYALL295.0
2024-01-29 00:15:00CO2_INTENSITYALL293.0
2024-01-29 00:30:00CO2_INTENSITYALL294.0
2024-01-29 00:45:00CO2_INTENSITYALL294.0
2024-01-29 01:00:00CO2_INTENSITYALL291.0
............
2024-01-29 23:00:00CO2_INTENSITYALL237.0
2024-01-29 23:15:00CO2_INTENSITYALL241.0
2024-01-29 23:30:00CO2_INTENSITYALL244.0
2024-01-29 23:45:00CO2_INTENSITYALLNaN
2024-01-30 00:00:00CO2_INTENSITYALLNaN
\n", - "

97 rows × 3 columns

\n", - "
" - ], - "text/plain": [ - " FieldName Region Value\n", - "EffectiveTime \n", - "2024-01-29 00:00:00 CO2_INTENSITY ALL 295.0\n", - "2024-01-29 00:15:00 CO2_INTENSITY ALL 293.0\n", - "2024-01-29 00:30:00 CO2_INTENSITY ALL 294.0\n", - "2024-01-29 00:45:00 CO2_INTENSITY ALL 294.0\n", - "2024-01-29 01:00:00 CO2_INTENSITY ALL 291.0\n", - "... ... ... ...\n", - "2024-01-29 23:00:00 CO2_INTENSITY ALL 237.0\n", - "2024-01-29 23:15:00 CO2_INTENSITY ALL 241.0\n", - "2024-01-29 23:30:00 CO2_INTENSITY ALL 244.0\n", - "2024-01-29 23:45:00 CO2_INTENSITY ALL NaN\n", - "2024-01-30 00:00:00 CO2_INTENSITY ALL NaN\n", - "\n", - "[97 rows x 3 columns]" - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_carbon_intensity_indexed" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "# Interpolate NaN values, except for the last NaN\n", - "# df_carbon_forecast_interp = df_carbon_intensity_indexed.interpolate()\n", - "\n", - "# Reverse the DataFrame\n", - "df_reversed_forecast = df_carbon_intensity_indexed.iloc[::-1]\n", - "\n", - "# Find the first valid index in the reversed DataFrame, which corresponds to the last NaN before non-NaN values\n", - "last_nan_index_before_non_nan = df_reversed_forecast['Value'].first_valid_index()\n", - "\n", - "\n", - "# Select rows up to the row before the last NaN\n", - "df_carbon_forecast_recent = df_carbon_intensity_indexed.loc[:last_nan_index_before_non_nan]" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'df_carbon_forecast_recent' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[12], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mdf_carbon_forecast_recent\u001b[49m\n", - "\u001b[0;31mNameError\u001b[0m: name 'df_carbon_forecast_recent' is not defined" - ] - } - ], - "source": [ - "df_carbon_forecast_recent" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
FieldNameRegionValuestatus_compared_to_yesterdaystatus_compared_to_EU
EffectiveTime
2024-01-30 00:00:00CO2_INTENSITY_FORECASTALL248.8503mediumlow
2024-01-30 00:30:00CO2_INTENSITY_FORECASTALL260.4392mediummedium
2024-01-30 01:00:00CO2_INTENSITY_FORECASTALL262.7611mediummedium
2024-01-30 01:30:00CO2_INTENSITY_FORECASTALL272.8510mediummedium
2024-01-30 02:00:00CO2_INTENSITY_FORECASTALL273.7224mediummedium
2024-01-30 02:30:00CO2_INTENSITY_FORECASTALL274.4874mediummedium
2024-01-30 03:00:00CO2_INTENSITY_FORECASTALL280.9840mediummedium
2024-01-30 03:30:00CO2_INTENSITY_FORECASTALL286.3714mediummedium
2024-01-30 04:00:00CO2_INTENSITY_FORECASTALL286.8409mediummedium
2024-01-30 04:30:00CO2_INTENSITY_FORECASTALL287.5332mediummedium
2024-01-30 05:00:00CO2_INTENSITY_FORECASTALL288.7824mediummedium
2024-01-30 05:30:00CO2_INTENSITY_FORECASTALL284.3577mediummedium
2024-01-30 06:00:00CO2_INTENSITY_FORECASTALL275.7350mediummedium
2024-01-30 06:30:00CO2_INTENSITY_FORECASTALL272.7976mediummedium
2024-01-30 07:00:00CO2_INTENSITY_FORECASTALL266.3387mediummedium
2024-01-30 07:30:00CO2_INTENSITY_FORECASTALL273.7274mediummedium
2024-01-30 08:00:00CO2_INTENSITY_FORECASTALL267.6136mediummedium
2024-01-30 08:30:00CO2_INTENSITY_FORECASTALL266.0288mediummedium
2024-01-30 09:00:00CO2_INTENSITY_FORECASTALL263.6102mediummedium
2024-01-30 09:30:00CO2_INTENSITY_FORECASTALL267.4311mediummedium
2024-01-30 10:00:00CO2_INTENSITY_FORECASTALL265.6489mediummedium
2024-01-30 10:30:00CO2_INTENSITY_FORECASTALL257.6208mediummedium
2024-01-30 11:00:00CO2_INTENSITY_FORECASTALL254.2569mediummedium
2024-01-30 11:30:00CO2_INTENSITY_FORECASTALL254.5991mediummedium
2024-01-30 12:00:00CO2_INTENSITY_FORECASTALL254.9786mediummedium
2024-01-30 12:30:00CO2_INTENSITY_FORECASTALL248.0611mediumlow
2024-01-30 13:00:00CO2_INTENSITY_FORECASTALL241.8669mediumlow
2024-01-30 13:30:00CO2_INTENSITY_FORECASTALL231.4084mediumlow
2024-01-30 14:00:00CO2_INTENSITY_FORECASTALL232.6857mediumlow
2024-01-30 14:30:00CO2_INTENSITY_FORECASTALL240.7019mediumlow
2024-01-30 15:00:00CO2_INTENSITY_FORECASTALL242.6909mediumlow
2024-01-30 15:30:00CO2_INTENSITY_FORECASTALL239.7500mediumlow
2024-01-30 16:00:00CO2_INTENSITY_FORECASTALL250.7756mediummedium
2024-01-30 16:30:00CO2_INTENSITY_FORECASTALL251.0792mediummedium
2024-01-30 17:00:00CO2_INTENSITY_FORECASTALL241.8699mediumlow
2024-01-30 17:30:00CO2_INTENSITY_FORECASTALL232.1933mediumlow
2024-01-30 18:00:00CO2_INTENSITY_FORECASTALL231.2662mediumlow
2024-01-30 18:30:00CO2_INTENSITY_FORECASTALL234.2504mediumlow
2024-01-30 19:00:00CO2_INTENSITY_FORECASTALL242.8936mediumlow
2024-01-30 19:30:00CO2_INTENSITY_FORECASTALL247.3083mediumlow
2024-01-30 20:00:00CO2_INTENSITY_FORECASTALL215.7545lowlow
2024-01-30 20:30:00CO2_INTENSITY_FORECASTALL202.2327lowlow
2024-01-30 21:00:00CO2_INTENSITY_FORECASTALL207.0673lowlow
2024-01-30 21:30:00CO2_INTENSITY_FORECASTALL191.0093lowlow
2024-01-30 22:00:00CO2_INTENSITY_FORECASTALL178.0945lowlow
2024-01-30 22:30:00CO2_INTENSITY_FORECASTALL175.7561lowlow
2024-01-30 23:00:00CO2_INTENSITY_FORECASTALLNaNmediummedium
2024-01-30 23:30:00CO2_INTENSITY_FORECASTALLNaNmediummedium
\n", - "
" - ], - "text/plain": [ - " FieldName Region Value \\\n", - "EffectiveTime \n", - "2024-01-30 00:00:00 CO2_INTENSITY_FORECAST ALL 248.8503 \n", - "2024-01-30 00:30:00 CO2_INTENSITY_FORECAST ALL 260.4392 \n", - "2024-01-30 01:00:00 CO2_INTENSITY_FORECAST ALL 262.7611 \n", - "2024-01-30 01:30:00 CO2_INTENSITY_FORECAST ALL 272.8510 \n", - "2024-01-30 02:00:00 CO2_INTENSITY_FORECAST ALL 273.7224 \n", - "2024-01-30 02:30:00 CO2_INTENSITY_FORECAST ALL 274.4874 \n", - "2024-01-30 03:00:00 CO2_INTENSITY_FORECAST ALL 280.9840 \n", - "2024-01-30 03:30:00 CO2_INTENSITY_FORECAST ALL 286.3714 \n", - "2024-01-30 04:00:00 CO2_INTENSITY_FORECAST ALL 286.8409 \n", - "2024-01-30 04:30:00 CO2_INTENSITY_FORECAST ALL 287.5332 \n", - "2024-01-30 05:00:00 CO2_INTENSITY_FORECAST ALL 288.7824 \n", - "2024-01-30 05:30:00 CO2_INTENSITY_FORECAST ALL 284.3577 \n", - "2024-01-30 06:00:00 CO2_INTENSITY_FORECAST ALL 275.7350 \n", - "2024-01-30 06:30:00 CO2_INTENSITY_FORECAST ALL 272.7976 \n", - "2024-01-30 07:00:00 CO2_INTENSITY_FORECAST ALL 266.3387 \n", - "2024-01-30 07:30:00 CO2_INTENSITY_FORECAST ALL 273.7274 \n", - "2024-01-30 08:00:00 CO2_INTENSITY_FORECAST ALL 267.6136 \n", - "2024-01-30 08:30:00 CO2_INTENSITY_FORECAST ALL 266.0288 \n", - "2024-01-30 09:00:00 CO2_INTENSITY_FORECAST ALL 263.6102 \n", - "2024-01-30 09:30:00 CO2_INTENSITY_FORECAST ALL 267.4311 \n", - "2024-01-30 10:00:00 CO2_INTENSITY_FORECAST ALL 265.6489 \n", - "2024-01-30 10:30:00 CO2_INTENSITY_FORECAST ALL 257.6208 \n", - "2024-01-30 11:00:00 CO2_INTENSITY_FORECAST ALL 254.2569 \n", - "2024-01-30 11:30:00 CO2_INTENSITY_FORECAST ALL 254.5991 \n", - "2024-01-30 12:00:00 CO2_INTENSITY_FORECAST ALL 254.9786 \n", - "2024-01-30 12:30:00 CO2_INTENSITY_FORECAST ALL 248.0611 \n", - "2024-01-30 13:00:00 CO2_INTENSITY_FORECAST ALL 241.8669 \n", - "2024-01-30 13:30:00 CO2_INTENSITY_FORECAST ALL 231.4084 \n", - "2024-01-30 14:00:00 CO2_INTENSITY_FORECAST ALL 232.6857 \n", - "2024-01-30 14:30:00 CO2_INTENSITY_FORECAST ALL 240.7019 \n", - "2024-01-30 15:00:00 CO2_INTENSITY_FORECAST ALL 242.6909 \n", - "2024-01-30 15:30:00 CO2_INTENSITY_FORECAST ALL 239.7500 \n", - "2024-01-30 16:00:00 CO2_INTENSITY_FORECAST ALL 250.7756 \n", - "2024-01-30 16:30:00 CO2_INTENSITY_FORECAST ALL 251.0792 \n", - "2024-01-30 17:00:00 CO2_INTENSITY_FORECAST ALL 241.8699 \n", - "2024-01-30 17:30:00 CO2_INTENSITY_FORECAST ALL 232.1933 \n", - "2024-01-30 18:00:00 CO2_INTENSITY_FORECAST ALL 231.2662 \n", - "2024-01-30 18:30:00 CO2_INTENSITY_FORECAST ALL 234.2504 \n", - "2024-01-30 19:00:00 CO2_INTENSITY_FORECAST ALL 242.8936 \n", - "2024-01-30 19:30:00 CO2_INTENSITY_FORECAST ALL 247.3083 \n", - "2024-01-30 20:00:00 CO2_INTENSITY_FORECAST ALL 215.7545 \n", - "2024-01-30 20:30:00 CO2_INTENSITY_FORECAST ALL 202.2327 \n", - "2024-01-30 21:00:00 CO2_INTENSITY_FORECAST ALL 207.0673 \n", - "2024-01-30 21:30:00 CO2_INTENSITY_FORECAST ALL 191.0093 \n", - "2024-01-30 22:00:00 CO2_INTENSITY_FORECAST ALL 178.0945 \n", - "2024-01-30 22:30:00 CO2_INTENSITY_FORECAST ALL 175.7561 \n", - "2024-01-30 23:00:00 CO2_INTENSITY_FORECAST ALL NaN \n", - "2024-01-30 23:30:00 CO2_INTENSITY_FORECAST ALL NaN \n", - "\n", - " status_compared_to_yesterday status_compared_to_EU \n", - "EffectiveTime \n", - "2024-01-30 00:00:00 medium low \n", - "2024-01-30 00:30:00 medium medium \n", - "2024-01-30 01:00:00 medium medium \n", - "2024-01-30 01:30:00 medium medium \n", - "2024-01-30 02:00:00 medium medium \n", - "2024-01-30 02:30:00 medium medium \n", - "2024-01-30 03:00:00 medium medium \n", - "2024-01-30 03:30:00 medium medium \n", - "2024-01-30 04:00:00 medium medium \n", - "2024-01-30 04:30:00 medium medium \n", - "2024-01-30 05:00:00 medium medium \n", - "2024-01-30 05:30:00 medium medium \n", - "2024-01-30 06:00:00 medium medium \n", - "2024-01-30 06:30:00 medium medium \n", - "2024-01-30 07:00:00 medium medium \n", - "2024-01-30 07:30:00 medium medium \n", - "2024-01-30 08:00:00 medium medium \n", - "2024-01-30 08:30:00 medium medium \n", - "2024-01-30 09:00:00 medium medium \n", - "2024-01-30 09:30:00 medium medium \n", - "2024-01-30 10:00:00 medium medium \n", - "2024-01-30 10:30:00 medium medium \n", - "2024-01-30 11:00:00 medium medium \n", - "2024-01-30 11:30:00 medium medium \n", - "2024-01-30 12:00:00 medium medium \n", - "2024-01-30 12:30:00 medium low \n", - "2024-01-30 13:00:00 medium low \n", - "2024-01-30 13:30:00 medium low \n", - "2024-01-30 14:00:00 medium low \n", - "2024-01-30 14:30:00 medium low \n", - "2024-01-30 15:00:00 medium low \n", - "2024-01-30 15:30:00 medium low \n", - "2024-01-30 16:00:00 medium medium \n", - "2024-01-30 16:30:00 medium medium \n", - "2024-01-30 17:00:00 medium low \n", - "2024-01-30 17:30:00 medium low \n", - "2024-01-30 18:00:00 medium low \n", - "2024-01-30 18:30:00 medium low \n", - "2024-01-30 19:00:00 medium low \n", - "2024-01-30 19:30:00 medium low \n", - "2024-01-30 20:00:00 low low \n", - "2024-01-30 20:30:00 low low \n", - "2024-01-30 21:00:00 low low \n", - "2024-01-30 21:30:00 low low \n", - "2024-01-30 22:00:00 low low \n", - "2024-01-30 22:30:00 low low \n", - "2024-01-30 23:00:00 medium medium \n", - "2024-01-30 23:30:00 medium medium " - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_carbon_forecast_indexed" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "df_carbon_forecast_value = df_carbon_forecast_indexed['Value']\n", - "\n", - "carbon_forecast_hourly = df_carbon_forecast_value.resample('1H').mean()" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Value
EffectiveTime
2024-01-28 16:00:00154.21970
2024-01-28 17:00:00175.99605
2024-01-28 18:00:00181.06505
2024-01-28 19:00:00186.09680
2024-01-28 20:00:00198.60950
2024-01-28 21:00:00207.39105
2024-01-28 22:00:00232.07710
2024-01-28 23:00:00262.53065
\n", - "
" - ], - "text/plain": [ - " Value\n", - "EffectiveTime \n", - "2024-01-28 16:00:00 154.21970\n", - "2024-01-28 17:00:00 175.99605\n", - "2024-01-28 18:00:00 181.06505\n", - "2024-01-28 19:00:00 186.09680\n", - "2024-01-28 20:00:00 198.60950\n", - "2024-01-28 21:00:00 207.39105\n", - "2024-01-28 22:00:00 232.07710\n", - "2024-01-28 23:00:00 262.53065" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.DataFrame(carbon_forecast_hourly)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "def classify_status(value, min_val, max_val):\n", - " if value < min_val:\n", - " return 'low'\n", - " elif value > max_val:\n", - " return 'high'\n", - " else:\n", - " return 'medium'\n", - " \n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "df_carbon_forecast_indexed['status_compared_to_yesterday'] = df_carbon_forecast_indexed['Value'].apply(classify_status, args=(co2_stats_prior_day['min'], co2_stats_prior_day['max']))\n", - "df_carbon_forecast_indexed['status_compared_to_EU'] = df_carbon_forecast_indexed['Value'].apply(classify_status, args=(250, 500))\n" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
FieldNameRegionValuestatus_compared_to_yesterdaystatus_compared_to_EU
EffectiveTime
2024-01-30 00:00:00CO2_INTENSITY_FORECASTALL248.8503mediumlow
2024-01-30 00:30:00CO2_INTENSITY_FORECASTALL260.4392mediummedium
2024-01-30 01:00:00CO2_INTENSITY_FORECASTALL262.7611mediummedium
2024-01-30 01:30:00CO2_INTENSITY_FORECASTALL272.8510mediummedium
2024-01-30 02:00:00CO2_INTENSITY_FORECASTALL273.7224mediummedium
2024-01-30 02:30:00CO2_INTENSITY_FORECASTALL274.4874mediummedium
2024-01-30 03:00:00CO2_INTENSITY_FORECASTALL280.9840mediummedium
2024-01-30 03:30:00CO2_INTENSITY_FORECASTALL286.3714mediummedium
2024-01-30 04:00:00CO2_INTENSITY_FORECASTALL286.8409mediummedium
2024-01-30 04:30:00CO2_INTENSITY_FORECASTALL287.5332mediummedium
2024-01-30 05:00:00CO2_INTENSITY_FORECASTALL288.7824mediummedium
2024-01-30 05:30:00CO2_INTENSITY_FORECASTALL284.3577mediummedium
2024-01-30 06:00:00CO2_INTENSITY_FORECASTALL275.7350mediummedium
2024-01-30 06:30:00CO2_INTENSITY_FORECASTALL272.7976mediummedium
2024-01-30 07:00:00CO2_INTENSITY_FORECASTALL266.3387mediummedium
2024-01-30 07:30:00CO2_INTENSITY_FORECASTALL273.7274mediummedium
2024-01-30 08:00:00CO2_INTENSITY_FORECASTALL267.6136mediummedium
2024-01-30 08:30:00CO2_INTENSITY_FORECASTALL266.0288mediummedium
2024-01-30 09:00:00CO2_INTENSITY_FORECASTALL263.6102mediummedium
2024-01-30 09:30:00CO2_INTENSITY_FORECASTALL267.4311mediummedium
2024-01-30 10:00:00CO2_INTENSITY_FORECASTALL265.6489mediummedium
2024-01-30 10:30:00CO2_INTENSITY_FORECASTALL257.6208mediummedium
2024-01-30 11:00:00CO2_INTENSITY_FORECASTALL254.2569mediummedium
2024-01-30 11:30:00CO2_INTENSITY_FORECASTALL254.5991mediummedium
2024-01-30 12:00:00CO2_INTENSITY_FORECASTALL254.9786mediummedium
2024-01-30 12:30:00CO2_INTENSITY_FORECASTALL248.0611mediumlow
2024-01-30 13:00:00CO2_INTENSITY_FORECASTALL241.8669mediumlow
2024-01-30 13:30:00CO2_INTENSITY_FORECASTALL231.4084mediumlow
2024-01-30 14:00:00CO2_INTENSITY_FORECASTALL232.6857mediumlow
2024-01-30 14:30:00CO2_INTENSITY_FORECASTALL240.7019mediumlow
2024-01-30 15:00:00CO2_INTENSITY_FORECASTALL242.6909mediumlow
2024-01-30 15:30:00CO2_INTENSITY_FORECASTALL239.7500mediumlow
2024-01-30 16:00:00CO2_INTENSITY_FORECASTALL250.7756mediummedium
2024-01-30 16:30:00CO2_INTENSITY_FORECASTALL251.0792mediummedium
2024-01-30 17:00:00CO2_INTENSITY_FORECASTALL241.8699mediumlow
2024-01-30 17:30:00CO2_INTENSITY_FORECASTALL232.1933mediumlow
2024-01-30 18:00:00CO2_INTENSITY_FORECASTALL231.2662mediumlow
2024-01-30 18:30:00CO2_INTENSITY_FORECASTALL234.2504mediumlow
2024-01-30 19:00:00CO2_INTENSITY_FORECASTALL242.8936mediumlow
2024-01-30 19:30:00CO2_INTENSITY_FORECASTALL247.3083mediumlow
2024-01-30 20:00:00CO2_INTENSITY_FORECASTALL215.7545lowlow
2024-01-30 20:30:00CO2_INTENSITY_FORECASTALL202.2327lowlow
2024-01-30 21:00:00CO2_INTENSITY_FORECASTALL207.0673lowlow
2024-01-30 21:30:00CO2_INTENSITY_FORECASTALL191.0093lowlow
2024-01-30 22:00:00CO2_INTENSITY_FORECASTALL178.0945lowlow
2024-01-30 22:30:00CO2_INTENSITY_FORECASTALL175.7561lowlow
2024-01-30 23:00:00CO2_INTENSITY_FORECASTALLNaNmediummedium
2024-01-30 23:30:00CO2_INTENSITY_FORECASTALLNaNmediummedium
\n", - "
" - ], - "text/plain": [ - " FieldName Region Value \\\n", - "EffectiveTime \n", - "2024-01-30 00:00:00 CO2_INTENSITY_FORECAST ALL 248.8503 \n", - "2024-01-30 00:30:00 CO2_INTENSITY_FORECAST ALL 260.4392 \n", - "2024-01-30 01:00:00 CO2_INTENSITY_FORECAST ALL 262.7611 \n", - "2024-01-30 01:30:00 CO2_INTENSITY_FORECAST ALL 272.8510 \n", - "2024-01-30 02:00:00 CO2_INTENSITY_FORECAST ALL 273.7224 \n", - "2024-01-30 02:30:00 CO2_INTENSITY_FORECAST ALL 274.4874 \n", - "2024-01-30 03:00:00 CO2_INTENSITY_FORECAST ALL 280.9840 \n", - "2024-01-30 03:30:00 CO2_INTENSITY_FORECAST ALL 286.3714 \n", - "2024-01-30 04:00:00 CO2_INTENSITY_FORECAST ALL 286.8409 \n", - "2024-01-30 04:30:00 CO2_INTENSITY_FORECAST ALL 287.5332 \n", - "2024-01-30 05:00:00 CO2_INTENSITY_FORECAST ALL 288.7824 \n", - "2024-01-30 05:30:00 CO2_INTENSITY_FORECAST ALL 284.3577 \n", - "2024-01-30 06:00:00 CO2_INTENSITY_FORECAST ALL 275.7350 \n", - "2024-01-30 06:30:00 CO2_INTENSITY_FORECAST ALL 272.7976 \n", - "2024-01-30 07:00:00 CO2_INTENSITY_FORECAST ALL 266.3387 \n", - "2024-01-30 07:30:00 CO2_INTENSITY_FORECAST ALL 273.7274 \n", - "2024-01-30 08:00:00 CO2_INTENSITY_FORECAST ALL 267.6136 \n", - "2024-01-30 08:30:00 CO2_INTENSITY_FORECAST ALL 266.0288 \n", - "2024-01-30 09:00:00 CO2_INTENSITY_FORECAST ALL 263.6102 \n", - "2024-01-30 09:30:00 CO2_INTENSITY_FORECAST ALL 267.4311 \n", - "2024-01-30 10:00:00 CO2_INTENSITY_FORECAST ALL 265.6489 \n", - "2024-01-30 10:30:00 CO2_INTENSITY_FORECAST ALL 257.6208 \n", - "2024-01-30 11:00:00 CO2_INTENSITY_FORECAST ALL 254.2569 \n", - "2024-01-30 11:30:00 CO2_INTENSITY_FORECAST ALL 254.5991 \n", - "2024-01-30 12:00:00 CO2_INTENSITY_FORECAST ALL 254.9786 \n", - "2024-01-30 12:30:00 CO2_INTENSITY_FORECAST ALL 248.0611 \n", - "2024-01-30 13:00:00 CO2_INTENSITY_FORECAST ALL 241.8669 \n", - "2024-01-30 13:30:00 CO2_INTENSITY_FORECAST ALL 231.4084 \n", - "2024-01-30 14:00:00 CO2_INTENSITY_FORECAST ALL 232.6857 \n", - "2024-01-30 14:30:00 CO2_INTENSITY_FORECAST ALL 240.7019 \n", - "2024-01-30 15:00:00 CO2_INTENSITY_FORECAST ALL 242.6909 \n", - "2024-01-30 15:30:00 CO2_INTENSITY_FORECAST ALL 239.7500 \n", - "2024-01-30 16:00:00 CO2_INTENSITY_FORECAST ALL 250.7756 \n", - "2024-01-30 16:30:00 CO2_INTENSITY_FORECAST ALL 251.0792 \n", - "2024-01-30 17:00:00 CO2_INTENSITY_FORECAST ALL 241.8699 \n", - "2024-01-30 17:30:00 CO2_INTENSITY_FORECAST ALL 232.1933 \n", - "2024-01-30 18:00:00 CO2_INTENSITY_FORECAST ALL 231.2662 \n", - "2024-01-30 18:30:00 CO2_INTENSITY_FORECAST ALL 234.2504 \n", - "2024-01-30 19:00:00 CO2_INTENSITY_FORECAST ALL 242.8936 \n", - "2024-01-30 19:30:00 CO2_INTENSITY_FORECAST ALL 247.3083 \n", - "2024-01-30 20:00:00 CO2_INTENSITY_FORECAST ALL 215.7545 \n", - "2024-01-30 20:30:00 CO2_INTENSITY_FORECAST ALL 202.2327 \n", - "2024-01-30 21:00:00 CO2_INTENSITY_FORECAST ALL 207.0673 \n", - "2024-01-30 21:30:00 CO2_INTENSITY_FORECAST ALL 191.0093 \n", - "2024-01-30 22:00:00 CO2_INTENSITY_FORECAST ALL 178.0945 \n", - "2024-01-30 22:30:00 CO2_INTENSITY_FORECAST ALL 175.7561 \n", - "2024-01-30 23:00:00 CO2_INTENSITY_FORECAST ALL NaN \n", - "2024-01-30 23:30:00 CO2_INTENSITY_FORECAST ALL NaN \n", - "\n", - " status_compared_to_yesterday status_compared_to_EU \n", - "EffectiveTime \n", - "2024-01-30 00:00:00 medium low \n", - "2024-01-30 00:30:00 medium medium \n", - "2024-01-30 01:00:00 medium medium \n", - "2024-01-30 01:30:00 medium medium \n", - "2024-01-30 02:00:00 medium medium \n", - "2024-01-30 02:30:00 medium medium \n", - "2024-01-30 03:00:00 medium medium \n", - "2024-01-30 03:30:00 medium medium \n", - "2024-01-30 04:00:00 medium medium \n", - "2024-01-30 04:30:00 medium medium \n", - "2024-01-30 05:00:00 medium medium \n", - "2024-01-30 05:30:00 medium medium \n", - "2024-01-30 06:00:00 medium medium \n", - "2024-01-30 06:30:00 medium medium \n", - "2024-01-30 07:00:00 medium medium \n", - "2024-01-30 07:30:00 medium medium \n", - "2024-01-30 08:00:00 medium medium \n", - "2024-01-30 08:30:00 medium medium \n", - "2024-01-30 09:00:00 medium medium \n", - "2024-01-30 09:30:00 medium medium \n", - "2024-01-30 10:00:00 medium medium \n", - "2024-01-30 10:30:00 medium medium \n", - "2024-01-30 11:00:00 medium medium \n", - "2024-01-30 11:30:00 medium medium \n", - "2024-01-30 12:00:00 medium medium \n", - "2024-01-30 12:30:00 medium low \n", - "2024-01-30 13:00:00 medium low \n", - "2024-01-30 13:30:00 medium low \n", - "2024-01-30 14:00:00 medium low \n", - "2024-01-30 14:30:00 medium low \n", - "2024-01-30 15:00:00 medium low \n", - "2024-01-30 15:30:00 medium low \n", - "2024-01-30 16:00:00 medium medium \n", - "2024-01-30 16:30:00 medium medium \n", - "2024-01-30 17:00:00 medium low \n", - "2024-01-30 17:30:00 medium low \n", - "2024-01-30 18:00:00 medium low \n", - "2024-01-30 18:30:00 medium low \n", - "2024-01-30 19:00:00 medium low \n", - "2024-01-30 19:30:00 medium low \n", - "2024-01-30 20:00:00 low low \n", - "2024-01-30 20:30:00 low low \n", - "2024-01-30 21:00:00 low low \n", - "2024-01-30 21:30:00 low low \n", - "2024-01-30 22:00:00 low low \n", - "2024-01-30 22:30:00 low low \n", - "2024-01-30 23:00:00 medium medium \n", - "2024-01-30 23:30:00 medium medium " - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_carbon_forecast_indexed" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/var/folders/n8/5rf_2zc91lx1ffhm5t27hrsw0000gn/T/ipykernel_4155/3058254539.py:14: FutureWarning: Styler.applymap has been deprecated. Use Styler.map instead.\n", - " df_styled = df_carbon_forecast_indexed.style.applymap(color_status, subset=['status_compared_to_yesterday', 'status_compared_to_EU'])\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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
 FieldNameRegionValuestatus_compared_to_yesterdaystatus_compared_to_EU
EffectiveTime     
2024-01-30 00:00:00CO2_INTENSITY_FORECASTALL248.850300mediumlow
2024-01-30 00:30:00CO2_INTENSITY_FORECASTALL260.439200mediummedium
2024-01-30 01:00:00CO2_INTENSITY_FORECASTALL262.761100mediummedium
2024-01-30 01:30:00CO2_INTENSITY_FORECASTALL272.851000mediummedium
2024-01-30 02:00:00CO2_INTENSITY_FORECASTALL273.722400mediummedium
2024-01-30 02:30:00CO2_INTENSITY_FORECASTALL274.487400mediummedium
2024-01-30 03:00:00CO2_INTENSITY_FORECASTALL280.984000mediummedium
2024-01-30 03:30:00CO2_INTENSITY_FORECASTALL286.371400mediummedium
2024-01-30 04:00:00CO2_INTENSITY_FORECASTALL286.840900mediummedium
2024-01-30 04:30:00CO2_INTENSITY_FORECASTALL287.533200mediummedium
2024-01-30 05:00:00CO2_INTENSITY_FORECASTALL288.782400mediummedium
2024-01-30 05:30:00CO2_INTENSITY_FORECASTALL284.357700mediummedium
2024-01-30 06:00:00CO2_INTENSITY_FORECASTALL275.735000mediummedium
2024-01-30 06:30:00CO2_INTENSITY_FORECASTALL272.797600mediummedium
2024-01-30 07:00:00CO2_INTENSITY_FORECASTALL266.338700mediummedium
2024-01-30 07:30:00CO2_INTENSITY_FORECASTALL273.727400mediummedium
2024-01-30 08:00:00CO2_INTENSITY_FORECASTALL267.613600mediummedium
2024-01-30 08:30:00CO2_INTENSITY_FORECASTALL266.028800mediummedium
2024-01-30 09:00:00CO2_INTENSITY_FORECASTALL263.610200mediummedium
2024-01-30 09:30:00CO2_INTENSITY_FORECASTALL267.431100mediummedium
2024-01-30 10:00:00CO2_INTENSITY_FORECASTALL265.648900mediummedium
2024-01-30 10:30:00CO2_INTENSITY_FORECASTALL257.620800mediummedium
2024-01-30 11:00:00CO2_INTENSITY_FORECASTALL254.256900mediummedium
2024-01-30 11:30:00CO2_INTENSITY_FORECASTALL254.599100mediummedium
2024-01-30 12:00:00CO2_INTENSITY_FORECASTALL254.978600mediummedium
2024-01-30 12:30:00CO2_INTENSITY_FORECASTALL248.061100mediumlow
2024-01-30 13:00:00CO2_INTENSITY_FORECASTALL241.866900mediumlow
2024-01-30 13:30:00CO2_INTENSITY_FORECASTALL231.408400mediumlow
2024-01-30 14:00:00CO2_INTENSITY_FORECASTALL232.685700mediumlow
2024-01-30 14:30:00CO2_INTENSITY_FORECASTALL240.701900mediumlow
2024-01-30 15:00:00CO2_INTENSITY_FORECASTALL242.690900mediumlow
2024-01-30 15:30:00CO2_INTENSITY_FORECASTALL239.750000mediumlow
2024-01-30 16:00:00CO2_INTENSITY_FORECASTALL250.775600mediummedium
2024-01-30 16:30:00CO2_INTENSITY_FORECASTALL251.079200mediummedium
2024-01-30 17:00:00CO2_INTENSITY_FORECASTALL241.869900mediumlow
2024-01-30 17:30:00CO2_INTENSITY_FORECASTALL232.193300mediumlow
2024-01-30 18:00:00CO2_INTENSITY_FORECASTALL231.266200mediumlow
2024-01-30 18:30:00CO2_INTENSITY_FORECASTALL234.250400mediumlow
2024-01-30 19:00:00CO2_INTENSITY_FORECASTALL242.893600mediumlow
2024-01-30 19:30:00CO2_INTENSITY_FORECASTALL247.308300mediumlow
2024-01-30 20:00:00CO2_INTENSITY_FORECASTALL215.754500lowlow
2024-01-30 20:30:00CO2_INTENSITY_FORECASTALL202.232700lowlow
2024-01-30 21:00:00CO2_INTENSITY_FORECASTALL207.067300lowlow
2024-01-30 21:30:00CO2_INTENSITY_FORECASTALL191.009300lowlow
2024-01-30 22:00:00CO2_INTENSITY_FORECASTALL178.094500lowlow
2024-01-30 22:30:00CO2_INTENSITY_FORECASTALL175.756100lowlow
2024-01-30 23:00:00CO2_INTENSITY_FORECASTALLnanmediummedium
2024-01-30 23:30:00CO2_INTENSITY_FORECASTALLnanmediummedium
\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import pandas as pd\n", - "\n", - "# Assuming df is your DataFrame\n", - "\n", - "def color_status(val):\n", - " if val == 'low':\n", - " color = 'green'\n", - " elif val == 'medium':\n", - " color = 'orange'\n", - " else: # high\n", - " color = 'red'\n", - " return f'background-color: {color}'\n", - "\n", - "df_styled = df_carbon_forecast_indexed.style.applymap(color_status, subset=['status_compared_to_yesterday', 'status_compared_to_EU'])\n", - "df_styled\n" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'plt' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[21], line 10\u001b[0m\n\u001b[1;32m 7\u001b[0m color_map \u001b[38;5;241m=\u001b[39m {\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlow\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mgreen\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmedium\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;124m'\u001b[39m\u001b[38;5;124morange\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mhigh\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mred\u001b[39m\u001b[38;5;124m'\u001b[39m}\n\u001b[1;32m 9\u001b[0m \u001b[38;5;66;03m# Create figure and axes\u001b[39;00m\n\u001b[0;32m---> 10\u001b[0m fig, ax \u001b[38;5;241m=\u001b[39m \u001b[43mplt\u001b[49m\u001b[38;5;241m.\u001b[39msubplots(figsize\u001b[38;5;241m=\u001b[39m(\u001b[38;5;241m5\u001b[39m, \u001b[38;5;241m6\u001b[39m))\n\u001b[1;32m 12\u001b[0m \u001b[38;5;66;03m# Plot a bar for each row in the DataFrame.\u001b[39;00m\n\u001b[1;32m 13\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i, (index, row) \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(df\u001b[38;5;241m.\u001b[39miterrows()):\n\u001b[1;32m 14\u001b[0m \u001b[38;5;66;03m# Use the index i as the y-coordinate for the bar.\u001b[39;00m\n", - "\u001b[0;31mNameError\u001b[0m: name 'plt' is not defined" - ] - } - ], - "source": [ - "# Assuming df_carbon_forecast_indexed is your DataFrame\n", - "df = df_carbon_forecast_indexed.reset_index(inplace=False)\n", - "df['EffectiveTime'] = pd.to_datetime(df['EffectiveTime'])\n", - "df.sort_values('EffectiveTime', inplace=True)\n", - "\n", - "# Map status to colors\n", - "color_map = {'low': 'green', 'medium': 'orange', 'high': 'red'}\n", - "\n", - "# Create figure and axes\n", - "fig, ax = plt.subplots(figsize=(5, 6))\n", - "\n", - "# Plot a bar for each row in the DataFrame.\n", - "for i, (index, row) in enumerate(df.iterrows()):\n", - " # Use the index i as the y-coordinate for the bar.\n", - " ax.barh(i, 1, color=color_map[row['status_compared_to_yesterday']], edgecolor='none')\n", - " ax.barh(i, 1, left=1, color=color_map[row['status_compared_to_EU']], edgecolor='none')\n", - "\n", - "# Customize plot appearance.\n", - "ax.set_facecolor('black')\n", - "fig.patch.set_facecolor('black')\n", - "ax.tick_params(axis='x', colors='white') # X-axis ticks color.\n", - "ax.spines['top'].set_visible(False)\n", - "ax.spines['right'].set_visible(False)\n", - "ax.spines['left'].set_color('white')\n", - "ax.spines['bottom'].set_color('white')\n", - "\n", - "# Remove x-axis ticks.\n", - "ax.xaxis.set_ticks([])\n", - "\n", - "# Set y-axis labels.\n", - "# Convert EffectiveTime to the desired string format and use it as y-tick labels.\n", - "ax.set_yticks(range(len(df)))\n", - "ax.set_yticklabels(df['EffectiveTime'].dt.strftime('%Y-%m-%d %H:%M'), color='white', fontsize=8)\n", - "\n", - "# Ensure everything fits without overlap.\n", - "plt.tight_layout()\n", - "\n", - "\n", - "ax.set_title('CO2 Intensity Forecast for the Remaining Hours of Today', color='white')\n", - "ax.set_xticks([0.5, 1.5])\n", - "ax.set_xticklabels(['Compared to \\n Yesterday', 'Compared to \\n EU Standards'], color='white')\n", - "\n", - "# Display the plot.\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Playground for visualisation " - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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UFZWplVvWwAkl8u1VpvaS0lJQUxMDJKTk/Hll1/ixRdfRFRUFD7//HOtfG37hVlaWuK5556DTCZDU1MTLl269EB9X7t2Lb755ht89913yMrKgr+/P9566y14eXnpLTciIgIrVqxAcHAwSkpKpHJra2tRV1cHoPX+sp07dyI3Nxc5OTn47W9/i+eff15r24j58+cjKChIuvT4+uuvw9bWFmfPnkVtbS3Gjh2LNWvW4OTJk1IwaMh4OTg44NixY5g7d6506bGrOVapVNi+fTvWrVuHW7duobq6Gl999RUuXLgg3ctGRET0tOpW8NW21cH935gDgJCQEOzYsQNA675cffv2xebNmzFw4ED88MMP8PPzkwKoCRMmwM3NDQB0bhAfPnx4l6tEnVGpVPD19UViYiJyc3Nx+/ZtxMXF6dzndP78eenfEydOxHvvvYeSkhKMGDFCb9mG9P1vf/sbQkND8emnnyIhIQGXL1/G9OnT8f3333darrm5Ob799lut9GXLlkn3we3duxfPPvssfv/738Pe3h4FBQUICAhAaWmplH/w4MEYOXKk9Ly+vh6/+c1vsH79epibm6OsrAz79u3DqlWrujVeZmZmGD16tNZ+Zl3NMdB6r9ndu3exd+9e9O3bF8eOHUNISAju3bundyyIiIieBg+0zxfRo8J9vuhpwH2+6Im27HE34MeL240TERERGRGDLyIiIiIjYvBFREREZEQMvoiIiIiMiMEXERERkREx+CIiIiIyIgZfREREREbUo992JDIW63mAmtt8ERHRE4QrX0RERERGxOCLiIiIyIgYfBEREREZEYMvIiIiIiNi8EVERERkRAy+iIiIiIyIW03Qj9unAJoedyOIHg2x7HG3gOjRMXncDfgR48oXERERkREx+CIiIiIyIgZfREREREbE4IuIiIjIiBh8ERERERkRgy8iIiIiI2LwRURERGREDL6IiIiIjIjBFxEREZERdSv4ioyMxJkzZ6BSqaBQKLB//344OTnp5IuJiUF5eTk0Gg2ysrIwduxY6djAgQORkJCAoqIi1NXV4fr169iwYQOsra07rLN37944d+4chBCQyWRdttHZ2RnHjx+HRqPBjRs3EB0drXXczs4Ou3fvRlFREVpaWrB+/fqH2vfRo0cjNTUVNTU1UKlUyMnJwdChQ/WWO2/ePHz33Xeorq5GdXU1MjMz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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import matplotlib.pyplot as plt\n", - "import matplotlib.colors as mcolors\n", - "import pandas as pd\n", - "\n", - "data = {\n", - " 'EffectiveTime': [\n", - " '2024-01-26 18:00:00', '2024-01-26 18:30:00',\n", - " '2024-01-26 19:00:00', '2024-01-26 19:30:00',\n", - " '2024-01-26 20:00:00', '2024-01-26 20:30:00',\n", - " '2024-01-26 21:00:00', '2024-01-26 21:30:00',\n", - " '2024-01-26 22:00:00', '2024-01-26 22:30:00',\n", - " '2024-01-26 23:00:00', '2024-01-26 23:30:00'\n", - " ],\n", - " 'status_compared_to_yesterday': [\n", - " 'low', 'medium',\n", - " 'medium', 'high',\n", - " 'low', 'medium',\n", - " 'high', 'medium',\n", - " 'medium', 'low',\n", - " 'medium', 'low'\n", - " ],\n", - " 'status_compared_to_EU': [\n", - " 'medium', 'high',\n", - " 'low', 'medium',\n", - " 'high', 'low',\n", - " 'medium', 'high',\n", - " 'low', 'medium',\n", - " 'low', 'medium'\n", - " ]\n", - "}\n", - "\n", - "df = pd.DataFrame(data)\n", - "\n", - "# Map status to colors\n", - "color_map = {'low': 'green', 'medium': 'orange', 'high': 'red'}\n", - "\n", - "# Create figure and axes\n", - "fig, ax = plt.subplots(figsize=(5, 6))\n", - "\n", - "# Plot bars\n", - "for i, row in df.iterrows():\n", - " ax.barh(row['EffectiveTime'], 1, color=color_map[row['status_compared_to_yesterday']], edgecolor='none')\n", - " ax.barh(row['EffectiveTime'], 1, left=1, color=color_map[row['status_compared_to_EU']], edgecolor='none')\n", - "\n", - "# Customize plot appearance\n", - "ax.set_facecolor('black')\n", - "fig.patch.set_facecolor('black')\n", - "ax.tick_params(axis='x', colors='white') # X-axis ticks color\n", - "ax.spines['top'].set_visible(False)\n", - "ax.spines['right'].set_visible(False)\n", - "ax.spines['left'].set_color('white')\n", - "ax.spines['bottom'].set_color('white')\n", - "\n", - "# Remove x-axis ticks\n", - "ax.xaxis.set_ticks([])\n", - "\n", - "# Set y-axis labels\n", - "ax.set_yticks(df['EffectiveTime'])\n", - "ax.set_yticklabels(df['EffectiveTime'], color='white')\n", - "\n", - "# Set title\n", - "ax.set_title('CO2 Intensity Forecast for the Remaining Hours of Today', color='white')\n", - "ax.set_xticks([0.5, 1.5])\n", - "ax.set_xticklabels(['Compared to \\n Yesterday', 'Compared to \\n EU Standards'], color='white')\n", - "\n", - "# Show plot\n", - "plt.show()\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "base", - "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.10.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -}