forecasting / app.py
filipeclduarte's picture
Update app.py
9fa0a4d
raw
history blame
2.54 kB
import streamlit as st
import numpy as np
import pandas as pd
import plotly.express as px
from statsforecast import StatsForecast
from statsforecast.models import seasonal_naive, auto_arima
from utils import calc_seasonality
st.title('Forecasting time series')
uploaded_file = st.file_uploader("Choose a CSV file", accept_multiple_files=False)
if uploaded_file is not None:
dataframe = pd.read_csv(uploaded_file)
st.write(dataframe)
series = st.text_input("Write the name of the variable you want to forecast")
date = st.text_input("Write the first date")
freq = st.text_input("Write the frequency")
horizons = int(st.text_input("Write the number of horizons"))
seasonality = calc_seasonality(freq)
st.write(f'Seasonality: {seasonality}')
if series is not None:
series_train = pd.DataFrame(
{
'ds': pd.date_range(start=date, periods=dataframe.shape[0], freq=freq),
'y': dataframe[series].values
},
index=pd.Index([0] * dataframe.shape[0], name='unique_id')
)
fig = px.line(series_train, x='ds', y='y', title=f'{series}')
st.plotly_chart(fig)
fcst = StatsForecast(
series_train,
models=[(auto_arima, seasonality), (seasonal_naive, seasonality)],
freq=freq,
n_jobs=1
)
forecasts = fcst.forecast(horizons, level=(80, 95))
st.write(forecasts)
fig.add_scatter(x=forecasts['ds'], y=forecasts[f'auto_arima_season_length-{seasonality}_mean'], mode='lines')
fig.update_traces(
name=f'auto_arima_season_length-{seasonality}_mean',
line=dict(color='blue', width=3),
showlegend=True
)
fig.add_scatter(x=forecasts['ds'], y=forecasts[f'seasonal_naive_season_length-{seasonality}'], mode='lines')
fig.update_traces(
name=f'seasonal_naive_season_length-{seasonality}',
line=dict(color='blue', width=3),
showlegend=True
)
st.plotly_chart(fig)