forecasting / app.py
filipeclduarte's picture
Update app.py
afd4840
raw
history blame
4.18 kB
import streamlit as st
import numpy as np
import pandas as pd
import plotly.express as px
import plotly.graph_objs as go
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_forecast = go.Figure([
go.Scatter(
name=series,
x=series_train['ds'],
y=series_train['y'],
mode='lines',
marker=dict(color='blue'),
line=dict(width=1),
showlegend=True
),
go.Scatter(
name=f'auto_arima_season_length-{seasonality}_mean',
x=forecasts['ds'],
y=forecasts[f'auto_arima_season_length-{seasonality}_mean'],
mode='lines',
marker=dict(color='green'),
line=dict(width=1),
showlegend=True
),
go.Scatter(
name=f'seasonal_naive_season_length-{seasonality}',
x=forecasts['ds'],
y=forecasts[f'seasonal_naive_season_length-{seasonality}'],
mode='lines',
marker=dict(color='red'),
line=dict(width=1),
showlegend=True
)
])
fig_forecast.update_layout(
yaxis_title=series,
title=f'Forecasting {series}'
)
st.plotly_chart(fig_forecast)
# 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='green', width=1),
# 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='red', width=1),
# showlegend=True
# )
# st.plotly_chart(fig)