Time Series Forecasting Arima Prophet
# Time Series Forecasting: ARIMA & Prophet
## Introduction & Motivation
Time Series Forecasting: predict future values. ARIMA: autoregressive integrated moving average. Facebook Prophet: seasonal decomposition. Applications: sales forecasting, stock prediction, demand planning.
Motivation: Sequential temporal dependencies; forecast uncertainty.
Applications: Business forecasting, analytics.
---
## Core Concepts & Theory
### Autoregressive (AR)
Past values as features.
### Integrated (I)
Differencing for stationarity.
### Moving Average (MA)
Lag residuals in model.
---
## Mathematical Formulation
ARIMA(p,d,q):
$$\Delta^d y_t = c + \phi_1 \Delta^d y_{t-1} + \ldots + \phi_p \Delta^d y_{t-p} + \epsilon_t + heta_1 \epsilon_{t-1} + \ldots + heta_q \epsilon_{t-q}$$
Prophet model:
$$y_t = g(t) + s(t) + h(t) + \epsilon_t$$
where g=trend, s=seasonality, h=holidays.
---
## Advanced Theory & Extensions
### Seasonal ARIMA (SARIMA)
Seasonal patterns; multiplicative/additive.
### ARIMAX
Exogenous variables; external features.
### Auto ARIMA
Automatic parameter selection.
---
## Computational Considerations
ARIMA: O(N·p²) via Yule-Walker equations.
Prophet: O(N) sampling; Bayesian inference.
Forecasting: O(forecast_horizon).
---
## Practical Implementation Strategies
### Stationarity Testing
ADF test; differencing for I(d).
### ACF/PACF Analysis
Identify p and q parameters.
### Seasonality Detection
Seasonal decomposition.
---
## Benchmark Datasets & Evaluation
M4 Dataset: Forecasting competition.
Stock Prices: Financial forecasting.
Energy Consumption: Utility forecasting.
---
## Key Challenges & Limitations
### Non-stationarity
Differencing required.
### Structural Breaks
Regime changes; model instability.
### Uncertainty Intervals
Confidence quantification.
---
## Hyperparameter Tuning
p (AR order): 0-5; typically.
d (Integration): 0-2; differencing.
q (MA order): 0-5; lag residuals.
---
## Real-World Applications & Case Studies
Sales Forecasting: Retail demand.
Energy Consumption: Utility planning.
Stock Prices: Financial markets.
---
## Integration with Other Methods
ARIMA + Regression → exogenous features.
Prophet + Ensemble → combined forecasts.
---
## Summary & Key Takeaways
Time Series Forecasting via ARIMA and Prophet enables sequential prediction through autoregressive modeling and seasonal decomposition.
Principles:
1. Stationarity: differencing integration.
2. Autocorrelation: AR and MA components.
3. Seasonality: periodic patterns.
4. Trend: long-term direction.
5. Uncertainty: prediction intervals.
---
---
## Appendix: Practical Labs
### Lab 1: Differencing
import numpy as np
def difference(series, order=1):
"""Apply differencing to make series stationary"""
diff_series = series.copy()
for _ in range(order):
diff_series = np.diff(diff_series)
return diff_series
# Test
np.random.seed(42)
# Create non-stationary series (random walk)
series = np.cumsum(np.random.randn(100))
diff_series = difference(series, order=1)
assert len(diff_series) == len(series) - 1, "Differencing reduces length"
print("✓ Differencing working")
if __name__ == "__main__":
print("Lab 1: Differencing - PASSED")### Lab 2: Autocorrelation Function (ACF)
import numpy as np
def acf(series, nlags=20):
"""Compute autocorrelation function"""
series = series - series.mean()
c0 = np.dot(series, series) / len(series)
acf_vals = [1.0] # ACF at lag 0
for lag in range(1, nlags + 1):
c_lag = np.dot(series[:-lag], series[lag:]) / len(series)
acf_vals.append(c_lag / c0)
return np.array(acf_vals)
# Test
np.random.seed(42)
series = np.random.randn(100)
acf_vals = acf(series, nlags=20)
assert len(acf_vals) == 21, "ACF length"
assert np.isclose(acf_vals[0], 1.0), "ACF[0] = 1"
print("✓ ACF working")
if __name__ == "__main__":
print("Lab 2: ACF - PASSED")### Lab 3: Seasonal Decomposition
import numpy as np
def seasonal_decompose_simple(series, period=12):
"""Simple seasonal decomposition"""
# Trend: centered moving average
trend = np.convolve(series, np.ones(period)/period, mode='same')
# Detrended
detrended = series - trend
# Seasonal: average for each season
seasonal = np.zeros_like(series)
for i in range(period):
seasonal[i::period] = np.mean(detrended[i::period])
# Residual
residual = series - trend - seasonal
return trend, seasonal, residual
# Test
np.random.seed(42)
t = np.arange(120)
series = 10 + t*0.1 + 5*np.sin(2*np.pi*t/12) + np.random.randn(120)*0.5
trend, seasonal, residual = seasonal_decompose_simple(series, period=12)
assert trend.shape == series.shape, "Trend shape"
assert seasonal.shape == series.shape, "Seasonal shape"
assert residual.shape == series.shape, "Residual shape"
print("✓ Seasonal decomposition working")
if __name__ == "__main__":
print("Lab 3: SeasonalDecomposition - PASSED")### Lab 4: AR Model Fitting
import numpy as np
def fit_ar_model(series, order=2):
"""Fit simple AR model using Yule-Walker equations"""
# Autocorrelations
mean = series.mean()
series_centered = series - mean
c0 = np.dot(series_centered, series_centered) / len(series)
# Build Toeplitz autocorrelation matrix
acf_vals = []
for lag in range(order + 1):
c = np.dot(series_centered[:-lag if lag > 0 else len(series_centered)],
series_centered[lag:]) / len(series)
acf_vals.append(c / c0)
# Solve Yule-Walker
R = np.array([[acf_vals[abs(i-j)] for j in range(order)] for i in range(order)])
r = np.array(acf_vals[1:order+1])
if np.linalg.cond(R) < 1e10:
coeffs = np.linalg.solve(R, r)
else:
coeffs = np.zeros(order)
return coeffs, mean
# Test
np.random.seed(42)
# Create AR(1) series
series = np.zeros(100)
series[0] = np.random.randn()
for t in range(1, 100):
series[t] = 0.7 * series[t-1] + np.random.randn()
coeffs, mean = fit_ar_model(series, order=2)
assert len(coeffs) == 2, "Coefficients shape"
assert np.isfinite(coeffs).all(), "Finite coefficients"
print("✓ AR fitting working")
if __name__ == "__main__":
print("Lab 4: ARFitting - PASSED")