Storm-Prediction / Prediction_of_storm_characteristics.ipynb
Prediction_of_storm_characteristics.ipynb
Raw
{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "provenance": []
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "language_info": {
      "name": "python"
    }
  },
  "cells": [
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "9bJE2poMZa7d"
      },
      "outputs": [],
      "source": [
        "!pip install keras-tuner --upgrade"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "import tensorflow as tf\n",
        "tf.test.gpu_device_name()"
      ],
      "metadata": {
        "id": "_8J9yh7CZetf"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# Importing the necessary libraries\n",
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "import pandas as pd\n",
        "import seaborn as sns\n",
        "from pylab import rcParams\n",
        "from pandas.plotting import register_matplotlib_converters\n",
        "register_matplotlib_converters()\n",
        "sns.set(style='whitegrid', palette='muted', font_scale=1.5)\n",
        "plt.rcParams['figure.figsize'] = [20, 6]\n",
        "\n",
        "import random\n",
        "\n",
        "# Set random seed for reproducibility\n",
        "np.random.seed(42)\n",
        "random.seed(42)\n",
        "tf.random.set_seed(42)"
      ],
      "metadata": {
        "id": "xKu9txjSZg0V"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# Importing the dataset\n",
        "df= pd.read_csv('dataset.csv', encoding='latin1')\n",
        "df"
      ],
      "metadata": {
        "id": "fLnYqpSMZjuR"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "df.info()"
      ],
      "metadata": {
        "id": "awEvf1TDZqZc"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "df = df.drop(['numer_sta', 'lat', 'lon', 'storm name', 'Storm'], axis=1)\n",
        "df.head()"
      ],
      "metadata": {
        "id": "AXrrSjXlZq7k"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "df['date'] = pd.to_datetime(df['date'])\n",
        "df = df.set_index(\"date\")"
      ],
      "metadata": {
        "id": "NiQwIExVZvJW"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# Dealing with missing values\n",
        "print(df.isnull().sum())"
      ],
      "metadata": {
        "id": "_z0z5Tf-Zylr"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "from sklearn.impute import SimpleImputer\n",
        "\n",
        "# Create an imputer object using median as the strategy\n",
        "imputer = SimpleImputer(missing_values=np.nan, strategy='median')\n",
        "\n",
        "# Define the columns where you want to apply the imputation\n",
        "columns_to_impute = ['Temperature',\t'Humidity',\t'Wind speed',\t'Pressure', 'Wave height', 'Wave period']\n",
        "\n",
        "# Apply the imputer to the selected columns of the DataFrame\n",
        "df[columns_to_impute] = imputer.fit_transform(df[columns_to_impute])\n",
        "\n",
        "# Checking the DataFrame to ensure no more missing values\n",
        "df.isnull().values.any()"
      ],
      "metadata": {
        "id": "33HxdNSoZ1uX"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "num_variables = len(df.columns)\n",
        "fig, axes = plt.subplots(nrows=num_variables, ncols=1, figsize=(20, 5 * num_variables))\n",
        "\n",
        "# Plot each variable on its own subplot\n",
        "for i, column in enumerate(df.columns):\n",
        "    axes[i].plot(df.index, df[column], label=f'{column}', color=plt.cm.tab10(i))\n",
        "    axes[i].set_title(f'Time Series of {column}', fontsize=16)\n",
        "    axes[i].legend(loc='upper right')\n",
        "    axes[i].set_ylabel(column)\n",
        "    axes[i].tick_params(labelsize=12)\n",
        "\n",
        "# Set common labels\n",
        "plt.xlabel(\"Index (Time)\", fontsize=14)\n",
        "plt.xticks(fontsize=14)\n",
        "plt.tight_layout()\n",
        "plt.show()"
      ],
      "metadata": {
        "id": "Jc0uL3FVZ5Df"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "from statsmodels.graphics.tsaplots import plot_acf\n",
        "\n",
        "wave_height = df['Wave height']\n",
        "\n",
        "# Plot the ACF\n",
        "plt.figure(figsize=(14,7))\n",
        "plot_acf(wave_height, lags=100, alpha=0.05)\n",
        "plt.title('Autocorrelation of Wave Height')\n",
        "plt.show()\n",
        "\n",
        "wave_period = df['Wave period']\n",
        "\n",
        "# Plot the ACF\n",
        "plt.figure(figsize=(14,7))\n",
        "plot_acf(wave_period, lags=100, alpha=0.05)\n",
        "plt.title('Autocorrelation of Wave Period')\n",
        "plt.show()\n",
        "\n",
        "\n",
        "Wind_speed = df['Wind speed']\n",
        "\n",
        "# Plot the ACF\n",
        "plt.figure(figsize=(14,7))\n",
        "plot_acf(Wind_speed, lags=100, alpha=0.05)\n",
        "plt.title('Autocorrelation of Wind Speed')\n",
        "plt.show()\n",
        "\n",
        "temperature = df['Temperature']\n",
        "# Plot the ACF\n",
        "plt.figure(figsize=(14,7))\n",
        "plot_acf(temperature, lags=100, alpha=0.05)\n",
        "plt.title('Autocorrelation of Temperature')\n",
        "plt.show()\n",
        "\n",
        "humidity = df['Humidity']\n",
        "# Plot the ACF\n",
        "plt.figure(figsize=(14,7))\n",
        "plot_acf(humidity, lags=100, alpha=0.05)\n",
        "plt.title('Autocorrelation of Humidity')\n",
        "plt.show()\n",
        "\n",
        "pressure = df['Pressure']\n",
        "# Plot the ACF\n",
        "plt.figure(figsize=(14,7))\n",
        "plot_acf(pressure, lags=100, alpha=0.05)\n",
        "plt.title('Autocorrelation of Pressure')\n",
        "plt.show()"
      ],
      "metadata": {
        "id": "n9juG2xiZ8Iy"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# Data Formating/ Preparing the input shape\n",
        "\n",
        "def df_to_X_y(df_1, window_size=30):\n",
        "  df_as_np = df_1.to_numpy()\n",
        "  X = []\n",
        "  y = []\n",
        "  for i in range(len(df_as_np)-window_size):\n",
        "    row = [r for r in df_as_np[i:i+window_size]]\n",
        "    X.append(row)\n",
        "    label = [df_as_np[i+window_size][0], df_as_np[i+window_size][1], df_as_np[i+window_size][2], df_as_np[i+window_size][3], df_as_np[i+window_size][4], df_as_np[i+window_size][5]]\n",
        "    y.append(label)\n",
        "  return np.array(X), np.array(y)"
      ],
      "metadata": {
        "id": "ro9WjX9eaBAy"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "X, y = df_to_X_y(df)\n",
        "print(f\"Shape of X: {X.shape}\")\n",
        "print(f\"Shape of y: {y.shape}\")"
      ],
      "metadata": {
        "id": "pqadgGiOaG8N"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# Define the size of the training set\n",
        "train_size = int(len(X) * 0.80)  # Using 80% of data for training and 20% for testing\n",
        "\n",
        "# Split the data into training and test sets by slicing\n",
        "X_train, y_train = X[:train_size], y[:train_size]\n",
        "X_test, y_test = X[train_size:], y[train_size:]\n",
        "\n",
        "# Print the shapes to verify the split\n",
        "print(\"X_train shape:\", X_train.shape)\n",
        "print(\"y_train shape:\", y_train.shape)\n",
        "print(\"X_test shape:\", X_test.shape)\n",
        "print(\"y_test shape:\", y_test.shape)"
      ],
      "metadata": {
        "id": "SLlvBE7xaHqc"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# Normalization\n",
        "temp_training_mean = np.mean(X_train[:, :, 0])\n",
        "temp_training_std = np.std(X_train[:, :, 0])\n",
        "\n",
        "hum_training_mean = np.mean(X_train[:, :, 1])\n",
        "hum_training_std = np.std(X_train[:, :, 1])\n",
        "\n",
        "wind_training_mean = np.mean(X_train[:, :, 2])\n",
        "wind_training_std = np.std(X_train[:, :, 2])\n",
        "\n",
        "pres_training_mean = np.mean(X_train[:, :, 3])\n",
        "pres_training_std = np.std(X_train[:, :, 3])\n",
        "\n",
        "waveH_training_mean = np.mean(X_train[:, :, 4])\n",
        "waveH_training_std = np.std(X_train[:, :, 4])\n",
        "\n",
        "waveP_training_mean = np.mean(X_train[:, :, 5])\n",
        "waveP_training_std = np.std(X_train[:, :, 5])\n",
        "\n",
        "def preprocess(X):\n",
        "  X[:, :, 0] = (X[:, :, 0] - temp_training_mean) / temp_training_std\n",
        "  X[:, :, 1] = (X[:, :, 1] - hum_training_mean) / hum_training_std\n",
        "  X[:, :, 2] = (X[:, :, 2] - wind_training_mean) / wind_training_std\n",
        "  X[:, :, 3] = (X[:, :, 3] - pres_training_mean) / pres_training_std\n",
        "  X[:, :, 4] = (X[:, :, 4] - waveH_training_mean) / waveH_training_std\n",
        "  X[:, :, 5] = (X[:, :, 5] - waveP_training_mean) / waveP_training_std\n",
        "\n",
        "def preprocess_output(y):\n",
        "  y[:, 0] = (y[:, 0] - temp_training_mean) / temp_training_std\n",
        "  y[:, 1] = (y[:, 1] - hum_training_mean) / hum_training_std\n",
        "  y[:, 2] = (y[:, 2] - wind_training_mean) / wind_training_std\n",
        "  y[:, 3] = (y[:, 3] - pres_training_mean) / pres_training_std\n",
        "  y[:, 4] = (y[:, 4] - waveH_training_mean) / waveH_training_std\n",
        "  y[:, 5] = (y[:, 5] - waveP_training_mean) / waveP_training_std\n",
        "  return y"
      ],
      "metadata": {
        "id": "xx_gh9StaQrI"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "preprocess(X_train)\n",
        "preprocess(X_test)"
      ],
      "metadata": {
        "id": "hNIY2T5WaRQ0"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "preprocess_output(y_train)\n",
        "preprocess_output(y_test)"
      ],
      "metadata": {
        "id": "btq-jnqcaUOX"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "import tensorflow as tf\n",
        "from tensorflow import keras\n",
        "from tensorflow.keras import layers\n",
        "from keras_tuner import BayesianOptimization, Objective\n",
        "from sklearn.model_selection import KFold\n",
        "from tensorflow.keras.callbacks import EarlyStopping\n",
        "import keras_tuner as kt\n",
        "from tensorflow.keras.layers import LSTM, Dense, Dropout\n",
        "from sklearn.model_selection import TimeSeriesSplit\n",
        "\n",
        "\n",
        "\n",
        "class MyHyperModel(kt.HyperModel):\n",
        "    def build(self, hp):\n",
        "        model = keras.Sequential()\n",
        "        model.add(LSTM(hp.Int('input_unit',min_value=32,max_value=512,step=32),return_sequences=True, input_shape=(30,6)))\n",
        "        for i in range(hp.Int('n_layers', 1, 4)):\n",
        "          model.add(LSTM(hp.Int(f'lstm_{i}_units',min_value=32,max_value=512,step=32),return_sequences=True))\n",
        "        model.add(LSTM(hp.Int('layer_2_neurons',min_value=32,max_value=512,step=32)))\n",
        "        model.add(Dropout(hp.Float('Dropout_rate',min_value=0,max_value=0.5,step=0.1)))\n",
        "        model.add(Dense(6, activation='linear'))\n",
        "        model.compile(\n",
        "            optimizer=keras.optimizers.Adam(\n",
        "                hp.Choice('learning_rate', [1e-2, 1e-3, 1e-4])),\n",
        "            loss='mean_absolute_error',\n",
        "            metrics=['mean_absolute_error'])\n",
        "        return model\n",
        "\n",
        "    def fit(self, hp, model, *args, **kwargs):\n",
        "        return model.fit(\n",
        "            *args,\n",
        "            batch_size=hp.Choice(\"batch_size\", [16, 32, 64, 128]),\n",
        "            **kwargs,\n",
        "        )\n",
        "\n",
        "tuner = kt.BayesianOptimization(\n",
        "    MyHyperModel(),\n",
        "    objective=\"val_mean_absolute_error\",\n",
        "    max_trials=10,\n",
        "    executions_per_trial=2,\n",
        "    overwrite=True,\n",
        "    directory=\"my_dir\",\n",
        "    project_name=\"tune_hypermodel\",\n",
        ")\n",
        "\n",
        "early_stopping_monitor = EarlyStopping(\n",
        "    monitor='val_mean_absolute_error',\n",
        "    patience=40,\n",
        "    min_delta=0.001,\n",
        "    restore_best_weights=True,\n",
        "    verbose=1\n",
        ")\n",
        "\n",
        "\n",
        "def cross_validate(X, y, n_splits=3):\n",
        "    tscv = TimeSeriesSplit(n_splits=n_splits)\n",
        "    for train_index, val_index in tscv.split(X):\n",
        "        X_train_fold, X_val_fold = X[train_index], X[val_index]\n",
        "        y_train_fold, y_val_fold = y[train_index], y[val_index]\n",
        "        tuner.search(\n",
        "            X_train_fold, y_train_fold, epochs=100,\n",
        "            validation_data=(X_val_fold, y_val_fold),\n",
        "            callbacks=[early_stopping_monitor]\n",
        "        )\n",
        "\n",
        "\n",
        "# Call to perform cross-validation\n",
        "cross_validate(X_train, y_train, n_splits=3)"
      ],
      "metadata": {
        "id": "5w9dcLPYaWRh"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# Get the best hyperparameters\n",
        "best_hps = tuner.get_best_hyperparameters(num_trials=1)[0]\n",
        "\n",
        "# Print the best hyperparameters\n",
        "print(\"The best hyperparameters are:\")\n",
        "print(f\"Input LSTM units: {best_hps.get('input_unit')}\")\n",
        "print(f\"Number of LSTM layers: {best_hps.get('n_layers') + 2}\")  # includes input and final LSTM layers\n",
        "for i in range(best_hps.get('n_layers')):\n",
        "    print(f\"LSTM units in layer {i+1}: {best_hps.get(f'lstm_{i}_units')}\")\n",
        "print(f\"Final LSTM layer units: {best_hps.get('layer_2_neurons')}\")\n",
        "print(f\"Dropout rate: {best_hps.get('Dropout_rate')}\")\n",
        "print(f\"Learning rate: {best_hps.get('learning_rate')}\")\n",
        "print(f\"Batch size: {best_hps.get('batch_size')}\")"
      ],
      "metadata": {
        "id": "nDF_CsN0anZU"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# Build the model with the best hyperparameters\n",
        "model = tuner.hypermodel.build(best_hps)\n",
        "\n",
        "# Training the model with the full training dataset\n",
        "history = model.fit(\n",
        "    X_train, y_train,\n",
        "    epochs=100,\n",
        "    batch_size=best_hps.get('batch_size'),\n",
        "    callbacks=[early_stopping_monitor]\n",
        ")"
      ],
      "metadata": {
        "id": "8J4cZ1Ljavb1"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# Predicting on unseen data\n",
        "predictions = model.predict(X_test)"
      ],
      "metadata": {
        "id": "egcURJ9gax6T"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "temp_preds, hum_preds, wind_preds, pres_preds, waveH_preds, waveP_preds = predictions[:, 0], predictions[:, 1], predictions[:, 2], predictions[:, 3], predictions[:, 4], predictions[:, 5]\n",
        "temp_actuals, hum_actuals, wind_actuals, pres_actuals, waveH_actuals, waveP_actuals = y_test[:, 0], y_test[:, 1], y_test[:, 2], y_test[:, 3], y_test[:, 4], y_test[:, 5]\n",
        "\n",
        "df_prediction = pd.DataFrame(data={'Temperature Predictions': temp_preds, 'Temperature Actuals':temp_actuals,\n",
        "                                   'Humidity Predictions': hum_preds, 'Humidity Actuals':hum_actuals,\n",
        "                                   'Wind speed Predictions': wind_preds, 'Wind speed Actuals': wind_actuals,\n",
        "                                   'Pressure Predictions': pres_preds, 'Pressure Actuals': pres_actuals,\n",
        "                                   'Wave height Predictions': waveH_preds, 'Wave height Actuals': waveH_actuals,\n",
        "                                   'Wave period Predictions': waveP_preds, 'Wave period Actuals': waveP_actuals,\n",
        "\n",
        "                          })"
      ],
      "metadata": {
        "id": "kM9LC1Yya1O3"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "df_prediction.head()"
      ],
      "metadata": {
        "id": "-3BnA6wDa5fR"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "def postprocess_temp(arr):\n",
        "  arr = (arr*temp_training_std) + temp_training_mean\n",
        "  return arr\n",
        "\n",
        "def postprocess_hum(arr):\n",
        "  arr = (arr*hum_training_std) + hum_training_mean\n",
        "  return arr\n",
        "\n",
        "def postprocess_wind(arr):\n",
        "  arr = (arr*wind_training_std) + wind_training_mean\n",
        "  return arr\n",
        "\n",
        "def postprocess_pres(arr):\n",
        "  arr = (arr*pres_training_std) + pres_training_mean\n",
        "  return arr\n",
        "\n",
        "def postprocess_waveH(arr):\n",
        "  arr = (arr*waveH_training_std) + waveH_training_mean\n",
        "  return arr\n",
        "\n",
        "def postprocess_waveP(arr):\n",
        "  arr = (arr*waveP_training_std) + waveP_training_mean\n",
        "  return arr"
      ],
      "metadata": {
        "id": "eumTKioMa8jv"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "temp_preds1, hum_preds1, wind_preds1, pres_preds1, waveH_preds1, waveP_preds1  = postprocess_temp(predictions[:, 0]), postprocess_hum(predictions[:, 1]), postprocess_wind(predictions[:, 2]), postprocess_pres(predictions[:, 3]), postprocess_waveH(predictions[:, 4]), postprocess_waveP(predictions[:, 5])\n",
        "\n",
        "temp_actuals1, hum_actuals1, wind_actuals1, pres_actuals1, waveH_actuals1, waveP_actuals1 = postprocess_temp(y_test[:, 0]), postprocess_hum(y_test[:, 1]), postprocess_wind(y_test[:, 2]), postprocess_pres(y_test[:, 3]), postprocess_waveH(y_test[:, 4]), postprocess_waveP(y_test[:, 5])\n",
        "\n",
        "\n",
        "df_prediction1 = pd.DataFrame(data={'Temperature Predictions': temp_preds1, 'Temperature Actuals':temp_actuals1,\n",
        "                                   'Humidity Predictions': hum_preds1, 'Humidity Actuals':hum_actuals1,\n",
        "                                   'Wind speed Predictions': wind_preds1, 'Wind speed Actuals': wind_actuals1,\n",
        "                                   'Pressure Predictions': pres_preds1, 'Pressure Actuals': pres_actuals1,\n",
        "                                   'Wave height Predictions': waveH_preds1, 'Wave height Actuals': waveH_actuals1,\n",
        "                                    'Wave period Predictions': waveP_preds1, 'Wave period Actuals': waveP_actuals1\n",
        "                          })"
      ],
      "metadata": {
        "id": "Kddls-51bA8a"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "df_prediction1"
      ],
      "metadata": {
        "id": "FYka8inTbE6o"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# Temperature prediction\n",
        "plt.figure(figsize=(20, 8))\n",
        "plt.plot(df[7311:].index, df_prediction1['Temperature Actuals'], label=\"Actual Temperature\")\n",
        "plt.plot(df[7311:].index, df_prediction1['Temperature Predictions'], label=\"Prediction\")\n",
        "plt.legend(loc='best', fontsize='large')\n",
        "plt.xticks(fontsize=18)\n",
        "plt.yticks(fontsize=16)\n",
        "plt.xlabel(\"Date time\")\n",
        "plt.ylabel(\"Temperature\")\n",
        "plt.show()"
      ],
      "metadata": {
        "id": "9reHq2oubIgz"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# Wave height prediction\n",
        "plt.figure(figsize=(20, 8))\n",
        "plt.plot(df[7311:].index, df_prediction1['Wave height Actuals'], label=\"Actual Wave height\")\n",
        "plt.plot(df[7311:].index, df_prediction1['Wave height Predictions'], label=\"Prediction\")\n",
        "plt.legend(loc='best', fontsize='large')\n",
        "plt.xticks(fontsize=18)\n",
        "plt.yticks(fontsize=16)\n",
        "plt.xlabel(\"Date time\")\n",
        "plt.ylabel(\"Wave height\")\n",
        "plt.show()"
      ],
      "metadata": {
        "id": "HHdYpjgobMBb"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# Waind speed prediction\n",
        "plt.figure(figsize=(20, 8))\n",
        "plt.plot(df[7311:].index, df_prediction1['Wind speed Actuals'], label=\"Actual Wind speed\")\n",
        "plt.plot(df[7311:].index, df_prediction1['Wind speed Predictions'], label=\"Prediction\")\n",
        "plt.legend(loc='best', fontsize='large')\n",
        "plt.xticks(fontsize=18)\n",
        "plt.yticks(fontsize=16)\n",
        "plt.xlabel(\"Date time\")\n",
        "plt.ylabel(\"Wind speed\")\n",
        "plt.show()"
      ],
      "metadata": {
        "id": "IbzM6Grfby-w"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# Pressure prediction\n",
        "plt.figure(figsize=(20, 8))\n",
        "plt.plot(df[7311:].index, df_prediction1['Pressure Actuals'], label=\"Actual Pressure\")\n",
        "plt.plot(df[7311:].index, df_prediction1['Pressure Predictions'], label=\"Prediction\")\n",
        "plt.legend(loc='best', fontsize='large')\n",
        "plt.xticks(fontsize=18)\n",
        "plt.yticks(fontsize=16)\n",
        "plt.xlabel(\"Date time\")\n",
        "plt.ylabel(\"Pressure\")\n",
        "plt.show()"
      ],
      "metadata": {
        "id": "nIpoIK5zbz1t"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# Humidity prediction\n",
        "plt.figure(figsize=(20, 8))\n",
        "plt.plot(df[7311:].index, df_prediction1['Humidity Actuals'], label=\"Actual Humidity\")\n",
        "plt.plot(df[7311:].index, df_prediction1['Humidity Predictions'], label=\"Prediction\")\n",
        "plt.legend(loc='best', fontsize='large')\n",
        "plt.xticks(fontsize=18)\n",
        "plt.yticks(fontsize=16)\n",
        "plt.xlabel(\"Date time\")\n",
        "plt.ylabel(\"Humidity\")\n",
        "plt.show()"
      ],
      "metadata": {
        "id": "H7e0_3Dob3EA"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# Wave period prediction\n",
        "plt.figure(figsize=(20, 8))\n",
        "plt.plot(df[7311:].index, df_prediction1['Wave period Actuals'], label=\"Actual Wave period\")\n",
        "plt.plot(df[7311:].index, df_prediction1['Wave period Predictions'], label=\"Prediction\")\n",
        "plt.legend(loc='best', fontsize='large')\n",
        "plt.xticks(fontsize=18)\n",
        "plt.yticks(fontsize=16)\n",
        "plt.xlabel(\"Date time\")\n",
        "plt.ylabel(\"Wave period\")\n",
        "plt.show()"
      ],
      "metadata": {
        "id": "zlqGG3UPb6Nq"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score\n",
        "from scipy import stats\n",
        "\n",
        "# Function to calculate Mean Absolute Percentage Error\n",
        "def mean_absolute_percentage_error(y_true, y_pred):\n",
        "    y_true, y_pred = np.array(y_true), np.array(y_pred)\n",
        "    return np.mean(np.abs((y_true - y_pred) / y_true)) * 100\n",
        "\n",
        "# Calculate performance metrics\n",
        "def calculate_metrics(y_true, y_pred, variable_name):\n",
        "    mae = mean_absolute_error(y_true, y_pred)\n",
        "    mse = mean_squared_error(y_true, y_pred)\n",
        "    rmse = np.sqrt(mse)\n",
        "    mape = mean_absolute_percentage_error(y_true, y_pred)\n",
        "    r2 = r2_score(y_true, y_pred)\n",
        "    correlation, p_value = stats.pearsonr(y_true, y_pred)\n",
        "\n",
        "    print(f'{variable_name} Metrics:')\n",
        "    print(f'Mean Absolute Error: {mae:.4f}')\n",
        "    print(f'Mean Squared Error: {mse:.4f}')\n",
        "    print(f'Root Mean Squared Error: {rmse:.4f}')\n",
        "    print(f'Mean Absolute Percentage Error: {mape:.2f}%')\n",
        "    print(f'R2 Score (Coefficient of Determination): {r2:.4f}')\n",
        "    print(f'Pearson Correlation Coefficient: {correlation:.4f}')\n",
        "    print(f'P-value of Correlation Coefficient: {p_value:.4g}')\n",
        "    print(\"\\n\")\n",
        "\n",
        "# Extract the relevant columns\n",
        "predicted_temperature = df_prediction1['Temperature Predictions']\n",
        "actual_temperature = df_prediction1['Temperature Actuals']\n",
        "\n",
        "predicted_humidity = df_prediction1['Humidity Predictions']\n",
        "actual_humidity = df_prediction1['Humidity Actuals']\n",
        "\n",
        "predicted_wind_speed = df_prediction1['Wind speed Predictions']\n",
        "actual_wind_speed = df_prediction1['Wind speed Actuals']\n",
        "\n",
        "predicted_pressure = df_prediction1['Pressure Predictions']\n",
        "actual_pressure = df_prediction1['Pressure Actuals']\n",
        "\n",
        "predicted_wave_height = df_prediction1['Wave height Predictions']\n",
        "actual_wave_height = df_prediction1['Wave height Actuals']\n",
        "\n",
        "predicted_period = df_prediction1['Wave period Predictions']\n",
        "actual_period = df_prediction1['Wave period Actuals']\n",
        "\n",
        "# Calculate metrics for temperature\n",
        "calculate_metrics(actual_temperature, predicted_temperature, 'Temperature')\n",
        "\n",
        "# Calculate metrics for Humidity\n",
        "calculate_metrics(actual_humidity, predicted_humidity, 'Humidity')\n",
        "\n",
        "# Calculate metrics for Wind speed\n",
        "calculate_metrics(actual_wind_speed, predicted_wind_speed, 'Wind Speed')\n",
        "\n",
        "# Calculate metrics for Pressure\n",
        "calculate_metrics(actual_pressure, predicted_pressure, 'Pressure')\n",
        "\n",
        "# Calculate metrics for Wave height\n",
        "calculate_metrics(actual_wave_height, predicted_wave_height, 'Wave Height')\n",
        "\n",
        "# Calculate metrics for Wave period\n",
        "calculate_metrics(actual_period, predicted_period, 'Wave Period')"
      ],
      "metadata": {
        "id": "Gcdxlm7Xb_Mj"
      },
      "execution_count": null,
      "outputs": []
    }
  ]
}