5
5
6
6
>>> import numpy as np
7
7
>>> 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)
9
9
>>> model.fit(series)
10
10
ARIMAModel(...)
11
11
>>> model.predict(series, n_periods=2)
17
17
18
18
19
19
class 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 :
21
21
"""Initialize ARIMA model.
22
22
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)
26
26
"""
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
30
30
self .coef_ : Optional [np .ndarray ] = None
31
31
self .resid_ : Optional [np .ndarray ] = None
32
32
33
- def difference (self , series : np .ndarray , order : int ) -> np .ndarray :
33
+ def difference (self , time_series : np .ndarray , order : int ) -> np .ndarray :
34
34
"""Apply differencing to make series stationary."""
35
35
for _ in range (order ):
36
- series = np .diff (series )
37
- return series
36
+ time_series = np .diff (time_series )
37
+ return time_series
38
38
39
39
def fit (self , time_series : np .ndarray ) -> "ARIMAModel" :
40
40
"""Fit ARIMA model to the given time series.
@@ -44,18 +44,16 @@ def fit(self, time_series: np.ndarray) -> "ARIMAModel":
44
44
self
45
45
>>> import numpy as np
46
46
>>> 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)
48
48
>>> model.fit(series)
49
49
ARIMAModel(...)
50
50
"""
51
51
y = np .asarray (time_series )
52
- y_diff = self .difference (y , self .d )
52
+ y_diff = self .difference (y , self .diff_order )
53
53
# 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 :]
59
57
# Add intercept
60
58
feature_matrix = np .hstack (
61
59
[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:
74
72
1D numpy array of forecasted values
75
73
>>> import numpy as np
76
74
>>> 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)
78
76
>>> model.fit(series)
79
77
ARIMAModel(...)
80
78
>>> model.predict(series, n_periods=2)
81
79
array([10.99999999, 12.00000001])
82
80
"""
83
81
y = np .asarray (time_series )
84
- y_pred = list (y [- self .p :])
82
+ y_pred = list (y [- self .ar_order :])
85
83
for _ in range (n_periods ):
86
84
# Build feature vector for prediction
87
- features = [1 ] + y_pred [- self .p :][::- 1 ]
85
+ features = [1 ] + y_pred [- self .ar_order :][::- 1 ]
88
86
next_val = np .dot (features , self .coef_ )
89
87
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