12
12
array([10.99999999, 12.00000001])
13
13
"""
14
14
15
-
16
15
import numpy as np
17
16
18
17
19
18
class ARIMAModel :
20
- def __init__ (self , ar_order : int = 1 , diff_order : int = 0 , ma_order : int = 0 ) -> None :
19
+ def __init__ (
20
+ self ,
21
+ ar_order : int = 1 ,
22
+ diff_order : int = 0 ,
23
+ ma_order : int = 0 ,
24
+ ) -> None :
21
25
"""Initialize ARIMA model.
22
26
Args:
23
27
ar_order: Autoregressive order (p)
@@ -50,14 +54,18 @@ def fit(self, time_series: np.ndarray) -> "ARIMAModel":
50
54
"""
51
55
y = np .asarray (time_series )
52
56
y_diff = self .difference (y , self .diff_order )
57
+
53
58
# Build lagged feature matrix
54
- feature_matrix = np .column_stack ([np .roll (y_diff , i ) for i in range (1 , self .ar_order + 1 )])
59
+ feature_matrix = np .column_stack (
60
+ [np .roll (y_diff , i ) for i in range (1 , self .ar_order + 1 )]
61
+ )
55
62
feature_matrix = feature_matrix [self .ar_order :]
56
63
target = y_diff [self .ar_order :]
64
+
57
65
# Add intercept
58
- feature_matrix = np .hstack (
59
- [ np .ones (( feature_matrix . shape [ 0 ], 1 )), feature_matrix ]
60
- )
66
+ intercept = np .ones (( feature_matrix . shape [ 0 ], 1 ))
67
+ feature_matrix = np .hstack ([ intercept , feature_matrix ])
68
+
61
69
# Solve least squares for AR coefficients
62
70
self .coef_ = np .linalg .lstsq (feature_matrix , target , rcond = None )[0 ]
63
71
self .resid_ = target - feature_matrix @ self .coef_
@@ -82,7 +90,7 @@ def predict(self, time_series: np.ndarray, n_periods: int = 1) -> np.ndarray:
82
90
y_pred = list (y [- self .ar_order :])
83
91
for _ in range (n_periods ):
84
92
# Build feature vector for prediction
85
- features = [1 ] + y_pred [- self .ar_order :][::- 1 ]
93
+ features = [1 , * y_pred [- self .ar_order :][::- 1 ] ]
86
94
next_val = np .dot (features , self .coef_ )
87
95
y_pred .append (next_val )
88
96
return np .array (y_pred [self .ar_order :])
0 commit comments