sdikici's picture
Update app.py
42f7885 verified
raw
history blame
4.9 kB
# -*- coding: utf-8 -*-
"""Huggingface_Prototype.ipynb
Automatically generated by Colab.
Original file is located at
https://colab.research.google.com/drive/1i--A21QuJPKdv-HM2kUrFSwj89Qfv4cb
"""
#! mkdir ~/.kaggle
#! cp kaggle.json ~/.kaggle/
#! chmod 600 ~/.kaggle/kaggle.json
#!kaggle datasets download -d sercandikici/merged-dataset-electricty-weather-for-modelling
#! unzip merged-dataset-electricty-weather-for-modelling.zip
#pip install gradio
#from google.colab import files
#uploaded = files.upload()
#df = pd.read_csv("merged_data.csv")
#df.drop('is_holiday', axis=1, inplace=True)
#df.to_csv('merged_data_huggingface.csv', index=False)
#from google.colab import files
#files.download('merged_data_huggingface.csv')
from prophet import Prophet
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
import gradio as gr
def forecast_plot(forecast_days,test_days, days):
fig, ax = plt.subplots(figsize=(14, 4))
ax.plot(forecast_days['ds'], forecast_days['yhat'], label='Forecast', color='green')
ax.scatter(test_days['ds'], test_days['y'], label='Actual', color='orange')
ax.set_xlabel('Date')
ax.set_ylabel('MGW')
plt.title(f'Prophet Forecast - Model 3 - {days} days horizon')
plt.legend()
return fig
def mean_absolute_percentage_error(y_true, y_pred):
y_true, y_pred = np.array(y_true), np.array(y_pred)
mape = np.mean(np.abs((y_true - y_pred) / y_true))
return mape
def root_mean_squared_error(y_true, y_pred):
y_true, y_pred = np.array(y_true), np.array(y_pred)
mse = np.mean((y_true - y_pred) ** 2)
rmse = np.sqrt(mse)
return rmse
def r_squared(y_true, y_pred):
y_true, y_pred = np.array(y_true), np.array(y_pred)
mean_y_true = np.mean(y_true)
ss_total = np.sum((y_true - mean_y_true) ** 2)
ss_residual = np.sum((y_true - y_pred) ** 2)
r2 = 1 - (ss_residual / ss_total)
return r2
def predict_and_evaluate(csv_file, days_to_predict,freq, country_name):
df_model = pd.read_csv(csv_file)
df_model.columns = ["ds", "y", "temp"]
df_model['ds'] = pd.to_datetime(df_model['ds'])
split_from = 90 * 12
train_data = df_model[:-split_from]
test_data = df_model[-split_from:]
freq = freq
seasonality_prior_scale = 0.01
changepoint_prior_scale = 0.05
mcmc_samples = 50
periods = days_to_predict * 12
m = Prophet(mcmc_samples=mcmc_samples, changepoint_prior_scale=changepoint_prior_scale,
seasonality_prior_scale=seasonality_prior_scale)
m.add_country_holidays(country_name=country_name)
m.add_regressor("temp", mode="additive")
m.fit(train_data)
future = m.make_future_dataframe(periods=periods, freq=freq)
train_idx = future["ds"].isin(train_data.ds)
test_idx = ~train_idx
reg = ["temp"]
for r in reg:
future.loc[train_idx, r] = train_data[r].to_list()
for r in reg:
future.loc[test_idx, r] = test_data.iloc[:periods][r].to_list()
forecast = m.predict(future)
forecast_days = forecast[forecast["ds"] >= test_data["ds"].iloc[0]]
test_days = test_data[(test_data["ds"] >= test_data["ds"].iloc[0]) & (
test_data["ds"] <= forecast_days["ds"].iloc[-1])]
plot = forecast_plot(forecast_days, test_days, days_to_predict)
mape = mean_absolute_percentage_error(test_days["y"], forecast_days["yhat"])
rmse = root_mean_squared_error(test_days["y"], forecast_days["yhat"])
rsqr = r_squared(test_days["y"], forecast_days["yhat"])
metrics = {
"MAPE": round(mape,3),
"RMSE": round(rmse,1),
"R-squared": round(rsqr,3)
}
return metrics,plot
csv_name = "merged_data_huggingface.csv"
#df_merged['settlement_date'] = pd.to_datetime(df_merged['settlement_date'])
#df_model = df_merged[["tsd", "settlement_date", "temp"]]
#df_model.columns = ["y", "ds", "temp"]
days_to_predict = 15 # Set the default value for days to predict
country_name = "UK" # Set the default value for country to predict
freq = "2H" # Set the default value for country to predict
predict_and_evaluate(csv_name, days_to_predict, freq, country_name)
iface = gr.Interface(
fn=predict_and_evaluate,
inputs=[
gr.File(label="CSV File"),
gr.Slider(1, 90, value=30, step=1, label="Days to Predict"),
gr.Textbox(label="Data Frequency", placeholder="Enter frequency (e.g., 2H for 2 hourly)"),
gr.Textbox(label="Country Code", placeholder="Enter country code (e.g., UK)")
],
outputs=[
gr.Textbox(label=" Evaluation Metrics"),
"plot"
],
title="Prophet Electricty Load Forecasting Model",
description="Upload a CSV file of time series data to generate electricty demand forecasts using Prophet. Update country code(eg UK or DE) for holidays and data frequency",
examples=[
["merged_data_huggingface.csv", 30, "2H", "UK"]
]
)
iface.launch()