Ashar086 commited on
Commit
b912490
·
verified ·
1 Parent(s): 47d5fd4

Create time_series_analyzer.py

Browse files
Files changed (1) hide show
  1. time_series_analyzer.py +72 -0
time_series_analyzer.py ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import pandas as pd
3
+ import plotly.express as px
4
+ from statsmodels.tsa.seasonal import seasonal_decompose
5
+ from statsmodels.tsa.arima.model import ARIMA
6
+ from prophet import Prophet
7
+
8
+ class TimeSeriesAnalyzer:
9
+ def analyze(self, df):
10
+ date_columns = df.select_dtypes(include=['datetime64']).columns
11
+ if len(date_columns) > 0:
12
+ date_column = st.selectbox("Select date column", date_columns)
13
+ value_column = st.selectbox("Select value column", df.columns)
14
+
15
+ df[date_column] = pd.to_datetime(df[date_column])
16
+ df = df.sort_values(date_column)
17
+
18
+ st.subheader("Time Series Plot")
19
+ fig = px.line(df, x=date_column, y=value_column)
20
+ st.plotly_chart(fig)
21
+
22
+ analysis_type = st.selectbox("Select analysis type", ["Decomposition", "ARIMA Forecasting", "Prophet Forecasting"])
23
+
24
+ if analysis_type == "Decomposition":
25
+ self.perform_decomposition(df, date_column, value_column)
26
+ elif analysis_type == "ARIMA Forecasting":
27
+ self.perform_arima_forecast(df, date_column, value_column)
28
+ elif analysis_type == "Prophet Forecasting":
29
+ self.perform_prophet_forecast(df, date_column, value_column)
30
+ else:
31
+ st.write("No datetime columns found in the dataset.")
32
+
33
+ def perform_decomposition(self, df, date_column, value_column):
34
+ df_temp = df.set_index(date_column)
35
+ result = seasonal_decompose(df_temp[value_column], model='additive', period=30)
36
+
37
+ st.subheader("Time Series Decomposition")
38
+ fig = px.line(x=result.seasonal.index, y=result.seasonal, title="Seasonal")
39
+ st.plotly_chart(fig)
40
+ fig = px.line(x=result.trend.index, y=result.trend, title="Trend")
41
+ st.plotly_chart(fig)
42
+ fig = px.line(x=result.resid.index, y=result.resid, title="Residual")
43
+ st.plotly_chart(fig)
44
+
45
+ def perform_arima_forecast(self, df, date_column, value_column):
46
+ df_temp = df.set_index(date_column)
47
+ model = ARIMA(df_temp[value_column], order=(1,1,1))
48
+ results = model.fit()
49
+
50
+ forecast_steps = st.slider("Select number of steps to forecast", min_value=1, max_value=365, value=30)
51
+ forecast = results.forecast(steps=forecast_steps)
52
+
53
+ st.subheader("ARIMA Forecast")
54
+ fig = px.line(x=df_temp.index, y=df_temp[value_column], title="Original Data with Forecast")
55
+ fig.add_scatter(x=forecast.index, y=forecast, mode='lines', name='Forecast')
56
+ st.plotly_chart(fig)
57
+
58
+ def perform_prophet_forecast(self, df, date_column, value_column):
59
+ df_prophet = df[[date_column, value_column]].rename(columns={date_column: 'ds', value_column: 'y'})
60
+ model = Prophet()
61
+ model.fit(df_prophet)
62
+
63
+ future_dates = st.slider("Select number of days to forecast", min_value=1, max_value=365, value=30)
64
+ future = model.make_future_dataframe(periods=future_dates)
65
+ forecast = model.predict(future)
66
+
67
+ st.subheader("Prophet Forecast")
68
+ fig = px.line(x=df_prophet['ds'], y=df_prophet['y'], title="Original Data with Forecast")
69
+ fig.add_scatter(x=forecast['ds'], y=forecast['yhat'], mode='lines', name='Forecast')
70
+ fig.add_scatter(x=forecast['ds'], y=forecast['yhat_lower'], mode='lines', name='Lower Bound')
71
+ fig.add_scatter(x=forecast['ds'], y=forecast['yhat_upper'], mode='lines', name='Upper Bound')
72
+ st.plotly_chart(fig)