Najm_NSR / app.py
XPMaster's picture
Update app.py
7d4df4c
raw
history blame
No virus
3.71 kB
import streamlit as st
import pandas as pd
from statsmodels.tsa.holtwinters import ExponentialSmoothing
import numpy as np
from itertools import product
from io import BytesIO
import plotly.express as px
# Function to run the Exponential Smoothing Model
def run_exp_smoothing(city_data, trend, damped_trend, seasonal, seasonal_period):
try:
model = ExponentialSmoothing(city_data, trend=trend, damped_trend=damped_trend, seasonal=seasonal, seasonal_periods=seasonal_period)
model_fit = model.fit(optimized=True)
return model_fit.forecast(steps=6), model_fit.aic
except Exception as e:
st.error(f"An error occurred during model fitting: {e}")
return None, None
def create_data():
data = pd.read_csv('accident_count.csv', parse_dates=True, index_col=0)
data.index = pd.to_datetime(data.index, format='%Y%m')
data = data.groupby('City').resample('M').sum().reset_index()
#data = data[data['City'] == 'ARAR']
data.index = data['Accident Month Bracket']
data = data.drop(['Accident Month Bracket'],axis=1)
data.index = data.index.strftime('%Y-%m')
return data
# Function to convert DataFrame to Excel
def to_excel(df):
output = BytesIO()
writer = pd.ExcelWriter(output, engine='xlsxwriter')
df.to_excel(writer, sheet_name='Sheet1')
writer.save()
processed_data = output.getvalue()
return processed_data
st.title("Exponential Smoothing Forecasting")
# Grid search button
if st.button('Run Grid Search'):
best_aic = float('inf')
best_params = None
for param_set in product(['add', 'mul', None], [True, False], ['add', 'mul', None], [12]):
_, temp_aic = run_exp_smoothing(city_data, *param_set)
if temp_aic and temp_aic < best_aic:
best_aic = temp_aic
best_params = param_set
st.write(f"Best Parameters: {best_params} with AIC: {best_aic}")
# Upload Data Section
# uploaded_file = st.file_uploader("Choose a file")
# if uploaded_file is not None:
data = create_data()
unique_cities = data['City'].unique()
# Select a city
selected_city = st.selectbox('Select a City', unique_cities)
# Sliders for parameter adjustment
trend = st.select_slider('Select Trend', options=['add', 'mul', None])
damped_trend = st.checkbox('Damped Trend')
seasonal = st.select_slider('Select Seasonal', options=['add', 'mul', None])
seasonal_period = st.slider('Seasonal Period', 1, 24, 12)
# ... [previous code remains the same]
# Display forecast with current parameters
city_data = data[data['City'] == selected_city]['Accident Count']
forecast, aic = run_exp_smoothing(city_data, trend, damped_trend, seasonal, seasonal_period)
if forecast is not None:
st.write(f"Best Parameters with AIC: {aic}")
st.write(f"Trend: {trend}, Damped Trend: {damped_trend}, Seasonal: {seasonal}, Seasonal Period: {seasonal_period}")
forecast_index = pd.date_range(start=city_data.index[-1], periods=7, freq='M')[1:]
forecast_index = forecast_index.to_period('M') # Convert to period index with monthly frequency
# forecast_df = pd.DataFrame(forecast, index=forecast_index, columns=['Forecast'])
forecast_df = pd.DataFrame(forecast,columns=['Forecast'])
# Ensure the index is correctly formatted as 'YYYY-MM'
# forecast_df.index = forecast_df.index.strftime('%Y-%m')
st.table(forecast_df)
fig = px.line(forecast_df, x=forecast_df.index, y="Forecast")
st.plotly_chart(fig)
# Export to Excel button
# if st.button('Export to Excel'):
# df_to_export = pd.DataFrame(forecast)
# excel_data = to_excel(df_to_export)
# st.download_button(label='πŸ“₯ Download Excel', data=excel_data, file_name='forecast.xlsx', mime='application/vnd.ms-excel')