File size: 3,706 Bytes
a3fa541 fde69ff f27b577 fde69ff 8c7c72e fde69ff 7d4df4c fde69ff 304cd2d fde69ff 304cd2d 339bffb f27b577 1d8445c fde69ff |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
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') |