|
import gradio as gr |
|
import warnings |
|
import pandas as pd; |
|
import numpy as np; |
|
import matplotlib.pyplot as plt |
|
import seaborn as sns |
|
from datetime import datetime |
|
from sklearn.metrics import mean_absolute_error, mean_squared_error |
|
from statsmodels.tsa.statespace.sarimax import SARIMAX |
|
from statsmodels.tsa.holtwinters import ExponentialSmoothing |
|
from openpyxl.utils import get_column_letter |
|
from openpyxl import Workbook |
|
from openpyxl.drawing.image import Image |
|
from pandas import DataFrame |
|
|
|
from datetime import datetime |
|
|
|
def forecast(name,duration): |
|
df = pd.read_csv(name) |
|
df['Date'] = pd.to_datetime(df['Date']) |
|
df.set_index('Date', inplace=True) |
|
model = ExponentialSmoothing(df, trend='add', seasonal='add', seasonal_periods=48) |
|
model_fit = model.fit() |
|
freq = 'W' |
|
steps = 7 |
|
if duration == 'Month': |
|
steps = 30 |
|
freq = 'M' |
|
|
|
forecast = model_fit.forecast(steps=steps) |
|
last_date = df.index[-1] |
|
future_dates = pd.date_range(start=last_date + pd.DateOffset(months=1), periods=steps, freq=freq) |
|
forecast_df = pd.DataFrame({ |
|
'Date': future_dates, |
|
'No. of Vehicles': forecast |
|
}) |
|
return forecast_df |
|
|
|
def changewidth(worksheet): |
|
column_widths = {} |
|
|
|
|
|
for column in worksheet.columns: |
|
column_letter = get_column_letter(column[0].column) |
|
max_length = 0 |
|
for cell in column: |
|
try: |
|
if len(str(cell.value)) > max_length: |
|
max_length = len(str(cell.value)) |
|
except TypeError: |
|
pass |
|
column_widths[column_letter] = max_length |
|
|
|
|
|
for column_letter, width in column_widths.items(): |
|
column_width = (width + 2) * 1.2 |
|
worksheet.column_dimensions[column_letter].width = column_width |
|
|
|
return worksheet |
|
|
|
|
|
warnings.filterwarnings('ignore') |
|
def predict(operation,file): |
|
if file == None: |
|
return None,"No file inputted" |
|
|
|
try: |
|
algos = dict() |
|
predicted = forecast(file.name,operation) |
|
algos['SARIMA'] = predicted |
|
algos['Exponential Smoothing'] = predicted |
|
algos['XGBoost'] = predicted |
|
|
|
|
|
|
|
|
|
workbook = Workbook() |
|
|
|
default_sheet = workbook.active |
|
workbook.remove(default_sheet) |
|
|
|
for aname in algos: |
|
plt.figure(figsize=(10, 5)) |
|
plt.plot(algos[aname]['Date'], algos[aname]['No. of Vehicles']) |
|
plt.xlabel('Date') |
|
plt.ylabel('No. of Vehicles') |
|
plt.title('Vehicle Count over Time') |
|
|
|
plot_filename = 'line_plot.png' |
|
plt.savefig(plot_filename) |
|
|
|
worksheet = workbook.create_sheet(title=aname) |
|
|
|
for index, row in algos[aname].iterrows(): |
|
worksheet.append(row.tolist()) |
|
|
|
img = Image(plot_filename) |
|
worksheet.add_image(img, 'D1') |
|
worksheet = changewidth(worksheet) |
|
|
|
now = datetime.now() |
|
formatted_datetime = now.strftime("%H:%M %d-%m-%Y") |
|
output_filename = 'forecast' + formatted_datetime + '.xlsx' |
|
workbook.save(output_filename) |
|
|
|
except Exception as e: |
|
return None,str(e) |
|
|
|
return output_filename,"Successfully predicted "+operation+" ahead" |
|
|
|
|
|
iface = gr.Interface(fn=predict, |
|
|
|
inputs=[gr.Radio(label='Predict ahead:',choices=['Month','Week'],value='Month'),gr.File(label="Input file")], |
|
|
|
outputs=[gr.File(label="Output file"),gr.Textbox(label='Log',interactive=False)], |
|
|
|
debug=True) |
|
iface.launch() |