| 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() |