55
66>>> import numpy as np
77>>> series = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
8- >>> model = ARIMAModel(p =2, d =1, q =0)
8+ >>> model = ARIMAModel(ar_order =2, diff_order =1, ma_order =0)
99>>> model.fit(series)
1010ARIMAModel(...)
1111>>> model.predict(series, n_periods=2)
1717
1818
1919class ARIMAModel :
20- def __init__ (self , p : int = 1 , d : int = 0 , q : int = 0 ) -> None :
20+ def __init__ (self , ar_order : int = 1 , diff_order : int = 0 , ma_order : int = 0 ) -> None :
2121 """Initialize ARIMA model.
2222 Args:
23- p: AR order
24- d : Differencing order
25- q: MA order (not used in this implementation)
23+ ar_order: Autoregressive order (p)
24+ diff_order : Differencing order (d)
25+ ma_order: Moving average order (q, not used in this implementation)
2626 """
27- self .p = p
28- self .d = d
29- self .q = q
27+ self .ar_order = ar_order
28+ self .diff_order = diff_order
29+ self .ma_order = ma_order
3030 self .coef_ : Optional [np .ndarray ] = None
3131 self .resid_ : Optional [np .ndarray ] = None
3232
33- def difference (self , series : np .ndarray , order : int ) -> np .ndarray :
33+ def difference (self , time_series : np .ndarray , order : int ) -> np .ndarray :
3434 """Apply differencing to make series stationary."""
3535 for _ in range (order ):
36- series = np .diff (series )
37- return series
36+ time_series = np .diff (time_series )
37+ return time_series
3838
3939 def fit (self , time_series : np .ndarray ) -> "ARIMAModel" :
4040 """Fit ARIMA model to the given time series.
@@ -44,18 +44,16 @@ def fit(self, time_series: np.ndarray) -> "ARIMAModel":
4444 self
4545 >>> import numpy as np
4646 >>> series = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
47- >>> model = ARIMAModel(p =2, d =1, q =0)
47+ >>> model = ARIMAModel(ar_order =2, diff_order =1, ma_order =0)
4848 >>> model.fit(series)
4949 ARIMAModel(...)
5050 """
5151 y = np .asarray (time_series )
52- y_diff = self .difference (y , self .d )
52+ y_diff = self .difference (y , self .diff_order )
5353 # Build lagged feature matrix
54- feature_matrix = np .column_stack (
55- [np .roll (y_diff , i ) for i in range (1 , self .p + 1 )]
56- )
57- feature_matrix = feature_matrix [self .p :]
58- target = y_diff [self .p :]
54+ feature_matrix = np .column_stack ([np .roll (y_diff , i ) for i in range (1 , self .ar_order + 1 )])
55+ feature_matrix = feature_matrix [self .ar_order :]
56+ target = y_diff [self .ar_order :]
5957 # Add intercept
6058 feature_matrix = np .hstack (
6159 [np .ones ((feature_matrix .shape [0 ], 1 )), feature_matrix ]
@@ -74,17 +72,17 @@ def predict(self, time_series: np.ndarray, n_periods: int = 1) -> np.ndarray:
7472 1D numpy array of forecasted values
7573 >>> import numpy as np
7674 >>> series = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
77- >>> model = ARIMAModel(p =2, d =1, q =0)
75+ >>> model = ARIMAModel(ar_order =2, diff_order =1, ma_order =0)
7876 >>> model.fit(series)
7977 ARIMAModel(...)
8078 >>> model.predict(series, n_periods=2)
8179 array([10.99999999, 12.00000001])
8280 """
8381 y = np .asarray (time_series )
84- y_pred = list (y [- self .p :])
82+ y_pred = list (y [- self .ar_order :])
8583 for _ in range (n_periods ):
8684 # Build feature vector for prediction
87- features = [1 ] + y_pred [- self .p :][::- 1 ]
85+ features = [1 ] + y_pred [- self .ar_order :][::- 1 ]
8886 next_val = np .dot (features , self .coef_ )
8987 y_pred .append (next_val )
90- return np .array (y_pred [self .p :])
88+ return np .array (y_pred [self .ar_order :])
0 commit comments