Ashar086 commited on
Commit
ed275c2
·
verified ·
1 Parent(s): 53c25fe

Rename time_series_analyzer.py to time_series_forecasting.py

Browse files
time_series_analyzer.py DELETED
@@ -1,72 +0,0 @@
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)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
time_series_forecasting.py ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pandas as pd
2
+ import numpy as np
3
+ from statsmodels.tsa.arima.model import ARIMA
4
+ from statsmodels.tsa.seasonal import seasonal_decompose
5
+ from prophet import Prophet
6
+
7
+ class TimeSeriesForecaster:
8
+ def __init__(self):
9
+ self.model = None
10
+
11
+ def forecast(self, data, date_column, value_column, periods=30, method='auto'):
12
+ # Ensure data is sorted by date
13
+ data = data.sort_values(date_column)
14
+ data = data.set_index(date_column)
15
+
16
+ if method == 'auto':
17
+ # Automatically choose between ARIMA and Prophet based on data characteristics
18
+ if self._has_seasonality(data[value_column]):
19
+ method = 'prophet'
20
+ else:
21
+ method = 'arima'
22
+
23
+ if method == 'arima':
24
+ return self._forecast_arima(data[value_column], periods)
25
+ elif method == 'prophet':
26
+ return self._forecast_prophet(data.reset_index(), date_column, value_column, periods)
27
+ else:
28
+ raise ValueError("Invalid method. Choose 'arima', 'prophet', or 'auto'.")
29
+
30
+ def _has_seasonality(self, series, threshold=0.1):
31
+ result = seasonal_decompose(series, model='additive', extrapolate_trend='freq')
32
+ return np.abs(result.seasonal).mean() > threshold * np.abs(result.trend).mean()
33
+
34
+ def _forecast_arima(self, series, periods):
35
+ model = ARIMA(series, order=(1, 1, 1))
36
+ self.model = model.fit()
37
+ forecast = self.model.forecast(steps=periods)
38
+ return pd.DataFrame({'date': forecast.index, 'forecast': forecast.values})
39
+
40
+ def _forecast_prophet(self, df, date_column, value_column, periods):
41
+ df = df.rename(columns={date_column: 'ds', value_column: 'y'})
42
+ model = Prophet()
43
+ self.model = model.fit(df)
44
+ future = model.make_future_dataframe(periods=periods)
45
+ forecast = model.predict(future)
46
+ return forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']]
47
+
48
+ def plot_forecast(self, original_data, forecast_data):
49
+ import matplotlib.pyplot as plt
50
+
51
+ plt.figure(figsize=(12, 6))
52
+ plt.plot(original_data.index, original_data, label='Original Data')
53
+ plt.plot(forecast_data['date'], forecast_data['forecast'], label='Forecast', color='red')
54
+ plt.fill_between(forecast_data['date'],
55
+ forecast_data['forecast'] - forecast_data['forecast'].std(),
56
+ forecast_data['forecast'] + forecast_data['forecast'].std(),
57
+ color='red', alpha=0.2)
58
+ plt.legend()
59
+ plt.title('Time Series Forecast')
60
+ plt.xlabel('Date')
61
+ plt.ylabel('Value')
62
+ return plt