Skip to content

Commit a130bf8

Browse files
committed
Update ARIMA time series Model
1 parent 6820d51 commit a130bf8

File tree

1 file changed

+20
-22
lines changed

1 file changed

+20
-22
lines changed

machine_learning/arima.py

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
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)
1010
ARIMAModel(...)
1111
>>> model.predict(series, n_periods=2)
@@ -17,24 +17,24 @@
1717

1818

1919
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:
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

Comments
 (0)