From 4e6a008c234753f16dcef129b6c18407305f016c Mon Sep 17 00:00:00 2001 From: Lucas Tan Date: Sat, 22 Mar 2025 23:39:52 +0800 Subject: [PATCH] excel to csv --- TNB Base Tariff History.csv | 22 ++++++++ TNB Base Tariff History.xlsx | Bin 8899 -> 0 bytes TNB_tariff_history.ipynb | 94 +++++++++++++++++++++++++++++++++-- 3 files changed, 113 insertions(+), 3 deletions(-) create mode 100644 TNB Base Tariff History.csv delete mode 100644 TNB Base Tariff History.xlsx diff --git a/TNB Base Tariff History.csv b/TNB Base Tariff History.csv new file mode 100644 index 0000000..0bc2aac --- /dev/null +++ b/TNB Base Tariff History.csv @@ -0,0 +1,22 @@ +Year,Base Tariff (sen/kWh) +2005,23.5 +2006,26.300000000000001 +2007,26.300000000000001 +2008,32.5 +2009,31.300000000000001 +2010,31.300000000000001 +2011,33.5 +2012,33.5 +2013,33.5 +2014,38.5 +2015,38.5 +2016,38.5 +2017,38.5 +2018,39.399999999999999 +2019,39.399999999999999 +2020,39.399999999999999 +2021,39.399999999999999 +2022,39.899999999999999 +2023,39.899999999999999 +2024,39.899999999999999 +2025,45.600000000000001 diff --git a/TNB Base Tariff History.xlsx b/TNB Base Tariff History.xlsx deleted file mode 100644 index 764fc336328d019fbcfefd5407251b7990025e0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8899 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" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "\n", + "pl.figure(figsize=(12, 6))\n", + "pl.rcParams[\"font.family\"] = \"Exo 2\"\n", + "font_manager.fontManager.addfont('C:/Users/User/Documents/Exo2-VariableFont_wght.ttf')\n", + "\n", + "start_year = df[\"Year\"].min()\n", + "end_year = df[\"Year\"].max()\n", + "plot_title = f\"TNB Base Tariff History ({start_year} - {end_year})\"\n", + "\n", + "# Line and points\n", + "pl.plot(df[\"Year\"], df[\"Base Tariff (sen/kWh)\"],\n", + " linewidth=1,\n", + " color='#fcd913',\n", + " alpha=0.9)\n", + "pl.ylim(bottom=20)\n", + "pl.title(plot_title, fontsize=24, fontweight='bold', color='grey')\n", + "\n", + "# Set x-axis to show years as integers only\n", + "pl.gca().xaxis.set_major_formatter(pl.FuncFormatter(lambda x, _: f'{int(x):d}'))\n", + "pl.gca().tick_params(axis='both', colors='grey')\n", + "pl.xlabel('Year', fontsize=14, fontweight='bold', color='grey')\n", + "pl.ylabel('Base Tariff (sen/kWh)', fontsize=14, fontweight='bold', color='grey')\n", + "\n", + "\n", + "# set grid edges to be white\n", + "pl.gca().spines['bottom'].set_color('white')\n", + "pl.gca().spines['top'].set_color('white')\n", + "pl.gca().spines['right'].set_color('white')\n", + "pl.gca().spines['left'].set_color('white')\n", + "\n", + "\n", + "# Fill the space below the line with a gradient\n", + "x = df[\"Year\"]\n", + "y = df[\"Base Tariff (sen/kWh)\"]\n", + "pl.fill_between(x, y, color='#fcd913', alpha=0.3)\n", + "\n", + "# Fit a line using shifted years so that the intercept represents the base tariff at start_year\n", + "shifted_years = x - start_year\n", + "# calculate the year over year perentage increase\n", + "percentage_increase = (y - y.shift(1)) / y.shift(1) * 100\n", + "slope, intercept = np.polyfit(shifted_years, y, 1)\n", + "\n", + "# Compute the best fit line values\n", + "best_fit = intercept + slope * (x - start_year)\n", + "pl.plot(x, best_fit, color='orange', linestyle='--', linewidth=2)\n", + "\n", + "# Compute the gradient as percentage increase per year relative to the starting tariff\n", + "average_annnual_increase = np.mean(percentage_increase)\n", + "\n", + "# Annotate the plot with the gradient information\n", + "pl.text(start_year + 1, y.min() + 2, f'Avg. Yearly Increase: {average_annnual_increase:.2f}%', color='orange', fontsize=12)\n", + "pl.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": {