forecast_tif / app.py
hellorahulk's picture
Update app.py
d1fc725
import pandas as pd
from prophet import Prophet
import plotly.express as px
import gradio as gr
from prophet.plot import plot_plotly, plot_components_plotly
def forecast_timeseries(data_file, forecast_periods):
# Load the input data
df = pd.read_csv(data_file.name,encoding='utf-8')
df['WEIGHT_LBS'] = df['WEIGHT_LBS'].astype('int64')
df = df.rename(columns={'RECV_DATE': 'ds', 'WEIGHT_LBS': 'y'})
weekly_df = df[['ds','y']].sort_values('ds')
weekly_df = weekly_df.groupby('ds',as_index=False)['y'].sum()
weekly_df['ds'] = pd.to_datetime(weekly_df['ds'])
weekly_df.set_index('ds', inplace=True)
weekly_df = weekly_df.resample('w').sum()
weekly_df.reset_index(inplace=True)
train = weekly_df[:int(0.8*(weekly_df.shape[0]))]
test = weekly_df[int(0.8*(weekly_df.shape[0]))+1:]
m = Prophet()
m.fit(train[['ds','y']])
# Create a future dataframe for forecasting
future = m.make_future_dataframe(periods=int(forecast_periods),freq='W')
# Make predictions
forecast = m.predict(future)
# Extract relevant columns from the forecast
forecast_data = forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']]
# Plot the forecasted data with upper and lower bounds
# fig = px.line(forecast, x='ds', y='yhat', title='Forecasted Time Series')
# fig.add_scatter(x=df['ds'], y=df['y'], mode='markers', name='Actual Values')
# fig.add_scatter(x=forecast['ds'], y=forecast['yhat_upper'], mode='lines', name='Upper Bound')
# fig.add_scatter(x=forecast['ds'], y=forecast['yhat_lower'], mode='lines', name='Lower Bound')
fig = plot_plotly(m, forecast)
fig1 = plot_components_plotly(m, forecast)
return df.head(),fig,fig1 ,forecast_data
# Define input and output interfaces for the Gradio app
inputs = [
gr.inputs.File(label="Upload CSV File"),
gr.inputs.Number(label="Forecast Periods", default=7),
]
outputs = [
gr.Dataframe(label="Input Data"),
gr.Plot(label="Forecast Plot"),
gr.Plot(label="Trends"),
gr.Dataframe(label="Forecast Results"),
]
# Create the Gradio app
iface = gr.Interface(fn=forecast_timeseries, inputs=inputs, outputs=outputs, title="Time Series Forecasting with Prophet")
iface.launch(inline = False)