Seasonal time series
A RIMA MODELS IN P YTH ON
James Fulton
Climate informatics researcher
Seasonal data
Has predictable and repeated patterns
Repeats after any amount of time
ARIMA MODELS IN PYTHON
Seasonal decomposition
ARIMA MODELS IN PYTHON
Seasonal decomposition
time series = trend + seasonal + residual
ARIMA MODELS IN PYTHON
Seasonal decomposition using statsmodels
# Import
from statsmodels.tsa.seasonal import seasonal_decompose
# Decompose data
decomp_results = seasonal_decompose(df['IPG3113N'], freq=12)
type(decomp_results)
statsmodels.tsa.seasonal.DecomposeResult
ARIMA MODELS IN PYTHON
Seasonal decomposition using statsmodels
# Plot decomposed data
decomp_results.plot()
plt.show()
ARIMA MODELS IN PYTHON
Finding seasonal period using ACF
ARIMA MODELS IN PYTHON
Identifying seasonal data using ACF
ARIMA MODELS IN PYTHON
Detrending time series
# Subtract long rolling average over N steps
df = df - df.rolling(N).mean()
# Drop NaN values
df = df.dropna()
ARIMA MODELS IN PYTHON
Identifying seasonal data using ACF
# Create figure
fig, ax = plt.subplots(1,1, figsize=(8,4))
# Plot ACF
plot_acf(df.dropna(), ax=ax, lags=25, zero=False)
plt.show()
ARIMA MODELS IN PYTHON
ARIMA models and seasonal data
ARIMA MODELS IN PYTHON
Let's practice!
A RIMA MODELS IN P YTH ON
SARIMA models
A RIMA MODELS IN P YTH ON
James Fulton
Climate informatics researcher
The SARIMA model
Seasonal ARIMA = SARIMA SARIMA(p,d,q)(P,D,Q)S
Non-seasonal orders Seasonal Orders
p: autoregressive order P: seasonal autoregressive order
d: differencing order D: seasonal differencing order
q: moving average order Q: seasonal moving average order
S: number of time steps per cycle
ARIMA MODELS IN PYTHON
The SARIMA model
ARIMA(2,0,1) model :
yt = a1 yt−1 + a2 yt−2 + m1 ϵt−1 + ϵt
SARIMA(0,0,0)(2,0,1)7 model:
yt = a7 yt−7 + a14 yt−14 + m7 ϵt−7 + ϵt
ARIMA MODELS IN PYTHON
Fitting a SARIMA model
# Imports
from statsmodels.tsa.statespace.sarimax import SARIMAX
# Instantiate model
model = SARIMAX(df, order=(p,d,q), seasonal_order=(P,D,Q,S))
# Fit model
results = model.fit()
ARIMA MODELS IN PYTHON
Seasonal differencing
Subtract the time series value of one season ago
Δyt = yt − yt−S
# Take the seasonal difference
df_diff = df.diff(S)
ARIMA MODELS IN PYTHON
Differencing for SARIMA models
Time series
ARIMA MODELS IN PYTHON
Differencing for SARIMA models
First difference of time series
ARIMA MODELS IN PYTHON
Differencing for SARIMA models
First difference and rst seasonal difference of ime series
ARIMA MODELS IN PYTHON
Finding p and q
ARIMA MODELS IN PYTHON
Finding P and Q
ARIMA MODELS IN PYTHON
Plotting seasonal ACF and PACF
# Create figure
fig, (ax1, ax2) = plt.subplots(2,1)
# Plot seasonal ACF
plot_acf(df_diff, lags=[12,24,36,48,60,72], ax=ax1)
# Plot seasonal PACF
plot_pacf(df_diff, lags=[12,24,36,48,60,72], ax=ax2)
plt.show()
ARIMA MODELS IN PYTHON
Let's practice!
A RIMA MODELS IN P YTH ON
Automation and
saving
A RIMA MODELS IN P YTH ON
James Fulton
Climate informatics researcher
Searching over model orders
import pmdarima as pm
results = pm.auto_arima(df)
Fit ARIMA: order=(2, 0, 2) seasonal_order=(1, 1, 1, 12); AIC=nan, BIC=nan, Fit time=nan seconds
Fit ARIMA: order=(0, 0, 0) seasonal_order=(0, 1, 0, 12); AIC=2648.467, BIC=2656.490, Fit time=0.062 s
Fit ARIMA: order=(1, 0, 0) seasonal_order=(1, 1, 0, 12); AIC=2279.986, BIC=2296.031, Fit time=1.171 s
...
Fit ARIMA: order=(3, 0, 3) seasonal_order=(1, 1, 1, 12); AIC=2173.508, BIC=2213.621, Fit time=12.487
Fit ARIMA: order=(3, 0, 3) seasonal_order=(0, 1, 0, 12); AIC=2297.305, BIC=2329.395, Fit time=2.087 s
Total fit time: 245.812 seconds
ARIMA MODELS IN PYTHON
pymarima results
print(results.summary()) results.plot_diagnostics()
ARIMA MODELS IN PYTHON
Non-seasonal search parameters
ARIMA MODELS IN PYTHON
Non-seasonal search parameters
results = pm.auto_arima( df, # data
d=0, # non-seasonal difference order
start_p=1, # initial guess for p
start_q=1, # initial guess for q
max_p=3, # max value of p to test
max_q=3, # max value of q to test
)
1 https://www.alkaline 2 ml.com/pmdarima/modules/generated/pmdarima.arima.auto_arima.html
ARIMA MODELS IN PYTHON
Seasonal search parameters
results = pm.auto_arima( df, # data
... , # non-seasonal arguments
seasonal=True, # is the time series seasonal
m=7, # the seasonal period
D=1, # seasonal difference order
start_P=1, # initial guess for P
start_Q=1, # initial guess for Q
max_P=2, # max value of P to test
max_Q=2, # max value of Q to test
)
ARIMA MODELS IN PYTHON
Other parameters
results = pm.auto_arima( df, # data
... , # model order parameters
information_criterion='aic', # used to select best model
trace=True, # print results whilst training
error_action='ignore', # ignore orders that don't work
stepwise=True, # apply intelligent order search
)
ARIMA MODELS IN PYTHON
Saving model objects
# Import
import joblib
# Select a filepath
filepath ='localpath/great_model.pkl'
# Save model to filepath
joblib.dump(model_results_object, filepath)
ARIMA MODELS IN PYTHON
Saving model objects
# Select a filepath
filepath ='localpath/great_model.pkl'
# Load model object from filepath
model_results_object = joblib.load(filepath)
ARIMA MODELS IN PYTHON
Updating model
# Add new observations and update parameters
model_results_object.update(df_new)
ARIMA MODELS IN PYTHON
Update comparison
ARIMA MODELS IN PYTHON
Let's practice!
A RIMA MODELS IN P YTH ON
SARIMA and Box-
Jenkins
A RIMA MODELS IN P YTH ON
James Fulton
Climate informatics researcher
Box-Jenkins
ARIMA MODELS IN PYTHON
Box-Jenkins with seasonal data
Determine if time series is seasonal
Find seasonal period
Find transforms to make data stationary
Seasonal and non-seasonal differencing
Other transforms
ARIMA MODELS IN PYTHON
Mixed differencing
D should be 0 or 1
d + D should be 0-2
ARIMA MODELS IN PYTHON
Weak vs strong seasonality
Weak seasonal pattern Strong seasonal pattern
Use seasonal differencing if necessary Always use seasonal differencing
ARIMA MODELS IN PYTHON
Additive vs multiplicative seasonality
Additive series = trend + season multiplicative series = trend x season
Proceed as usual with differencing Apply log transform rst - np.log
ARIMA MODELS IN PYTHON
Multiplicative to additive seasonality
ARIMA MODELS IN PYTHON
Let's practice!
A RIMA MODELS IN P YTH ON
Congratulations!
A RIMA MODELS IN P YTH ON
James Fulton
Climate informatics researcher
The SARIMAX model
ARIMA MODELS IN PYTHON
Time series modeling framework
Test for stationarity and seasonality
Find promising model orders
Fit models and narrow selection with AIC/BIC
Perform model diagnostics tests
Make forecasts
Save and update models
ARIMA MODELS IN PYTHON
Further steps
Fit data created using arma_generate_sample()
Tackle real world data! Either your own or examples from statsmodels
ARIMA MODELS IN PYTHON
Further steps
Fit data created using arma_generate_sample()
Tackle real world data! Either your own or examples from statsmodels
More time series courses here
1 https://www.statsmodels.org/stable/datasets/index.html
ARIMA MODELS IN PYTHON
Good luck!
A RIMA MODELS IN P YTH ON