|
import streamlit as st |
|
import pandas as pd |
|
import matplotlib.pyplot as plt |
|
from statsmodels.tsa.arima.model import ARIMA |
|
import pickle |
|
|
|
|
|
st.title("MLCast v1.1 - Intelligent Sales Forecasting System") |
|
|
|
|
|
uploaded_file = st.file_uploader("Upload your store data here (must contain Date and Sales)", type="csv") |
|
|
|
|
|
if uploaded_file is not None: |
|
|
|
df = pd.read_csv(uploaded_file) |
|
|
|
|
|
if 'Date' in df.columns and 'Sale' in df.columns: |
|
st.success("File uploaded successfully!") |
|
|
|
|
|
st.write(df.head()) |
|
|
|
|
|
df['Date'] = pd.to_datetime(df['Date']) |
|
|
|
|
|
df_arima = df.rename(columns={'Date': 'ds', 'Sale': 'y'}) |
|
|
|
|
|
with open('arima_sales_model.pkl', 'rb') as f: |
|
arima_model = pickle.load(f) |
|
|
|
|
|
forecast_period = 30 |
|
forecast = arima_model.get_forecast(steps=forecast_period) |
|
forecast_index = pd.date_range(df['Date'].max(), periods=forecast_period + 1, freq='D')[1:] |
|
|
|
|
|
forecast_df = pd.DataFrame({ |
|
'Date': forecast_index, |
|
'Sales Forecast': forecast.predicted_mean |
|
}) |
|
|
|
|
|
fig, ax = plt.subplots(figsize=(10, 6)) |
|
ax.plot(df['Date'], df['Sale'], label='Historical Sales', color='blue') |
|
ax.plot(forecast_df['Date'], forecast_df['Sales Forecast'], label='Sales Forecast', color='red', linestyle='--') |
|
ax.set_xlabel('Date') |
|
ax.set_ylabel('Sales') |
|
ax.set_title('Sales Forecasting with ARIMA') |
|
ax.legend() |
|
|
|
|
|
st.pyplot(fig) |
|
|
|
|
|
st.sidebar.title("Adjust Forecast Range") |
|
start_date = st.sidebar.date_input('Start Date', df['Date'].min()) |
|
end_date = st.sidebar.date_input('End Date', df['Date'].max()) |
|
|
|
|
|
filtered_df = df[(df['Date'] >= pd.to_datetime(start_date)) & (df['Date'] <= pd.to_datetime(end_date))] |
|
|
|
|
|
st.subheader(f"Sales Data from {start_date} to {end_date}") |
|
fig_filtered, ax_filtered = plt.subplots(figsize=(10, 6)) |
|
ax_filtered.plot(filtered_df['Date'], filtered_df['Sale'], label=f'Sales from {start_date} to {end_date}') |
|
ax_filtered.set_xlabel('Date') |
|
ax_filtered.set_ylabel('Sale') |
|
ax_filtered.set_title(f'Sales Forecasting from {start_date} to {end_date}') |
|
ax_filtered.legend() |
|
st.pyplot(fig_filtered) |
|
|
|
else: |
|
st.error("The uploaded file must contain at least 'Date' and 'Sales' columns.") |
|
|