# Time Series Forecasting - FBProphet in Python¶

## Denmark Inflation - Consumer Price Annual Percentage Forecasting¶

In [3]:
# ignore warnings
import pandas as pd
import warnings
warnings.filterwarnings("ignore")


In [4]:
# load dataset
from pandas import datetime
from matplotlib import pyplot
from pandas.plotting import autocorrelation_plot

filename = 'Denmark_Inflation_ConsumerPriceData_Annual_percentages.csv'

df = df.set_index('Year')

df.plot(figsize = (8,6))

fig = pyplot.figure(figsize = (8,6))
autocorrelation_plot(df)
pyplot.show()


      Inflation_ConsumerPrice_Annual_Percentage
Year
1960                                   1.255230
1961                                   3.451629
1962                                   7.377820
1963                                   6.105033
1964                                   3.092784


## Autocorrelation and Partial Autocorrelation in Python¶

In [5]:
from statsmodels.graphics.tsaplots import plot_acf
import matplotlib.pyplot as plt

plt.rcParams.update({'figure.figsize':(6,4), 'figure.dpi':120})

plot_acf(df)
pyplot.show()

In [6]:
from statsmodels.graphics.tsaplots import plot_pacf

plot_pacf(df)
pyplot.show()


In [7]:
from statsmodels.tsa.stattools import adfuller

print();  print(f'n_lags: {result[1]}')
print();  print(f'p-value: {result[1]}')

print(); print('Critial Values:')
for key, value in result[4].items():
print(f'   {key}, {value}')


ADF Statistic: -1.0187820813695128

n_lags: 0.7463524795436033

p-value: 0.7463524795436033

Critial Values:
1%, -3.568485864
5%, -2.92135992
10%, -2.5986616


## KPSS Test¶

In [8]:
from statsmodels.tsa.stattools import kpss

def kpss_test(series, **kw):

statistic, p_value, n_lags, critical_values = kpss(series, **kw)

# Format Output
print(); print(f'KPSS Statistic: {statistic}')
print(); print(f'p-value: {p_value}')
print(); print(f'num lags: {n_lags}')
print(); print('Critial Values:')
for key, value in critical_values.items():
print(f'   {key} : {value}')

kpss_test(df["Inflation_ConsumerPrice_Annual_Percentage"])

KPSS Statistic: 0.4078646728725161

p-value: 0.07376522721012238

num lags: 11

Critial Values:
10% : 0.347
5% : 0.463
2.5% : 0.574
1% : 0.739


## How to find the order of differencing (d) in ARIMA model¶

In [9]:
import numpy as np, pandas as pd
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
import matplotlib.pyplot as plt
plt.rcParams.update({'figure.figsize':(12,14), 'figure.dpi':120})

# Import data
df.reset_index(drop=True, inplace=True)

# Original Series
fig, axes = plt.subplots(5, 2, sharex=True)
axes[0, 0].plot(df.values); axes[0, 0].set_title('Original Series')
plot_acf(df.values, ax=axes[0, 1])

# 1st Differencing
df1 = df["Inflation_ConsumerPrice_Annual_Percentage"].diff()
axes[1, 0].plot(df1); axes[1, 0].set_title('1st Order Differencing')
plot_acf(df1.dropna(), ax=axes[1, 1])

# 2nd Differencing
df2 = df["Inflation_ConsumerPrice_Annual_Percentage"].diff().diff()
axes[2, 0].plot(df2); axes[2, 0].set_title('2nd Order Differencing')
plot_acf(df2.dropna(), ax=axes[2, 1])

# 3rd Differencing
df3 = df["Inflation_ConsumerPrice_Annual_Percentage"].diff().diff().diff()
axes[3, 0].plot(df3); axes[3, 0].set_title('3rd Order Differencing')
plot_acf(df3.dropna(), ax=axes[3, 1])

# 3rd Differencing
df4 = df["Inflation_ConsumerPrice_Annual_Percentage"].diff().diff().diff().diff()
axes[4, 0].plot(df4); axes[4, 0].set_title('4th Order Differencing')
plot_acf(df4.dropna(), ax=axes[4, 1])

plt.show()


In [10]:
warnings.filterwarnings("ignore")

print("---------------------------------------------")
print("First Diffencing: ")
print("---------------------------------------------")
df1 = df["Inflation_ConsumerPrice_Annual_Percentage"].diff()
print(); print("---------------------------------------------")
print(); print("---------------------------------------------")
kpss_test(df1.dropna())
print(); print("---------------------------------------------")

print(); print("---------------------------------------------")
print("2nd Diffencing: ")
print("---------------------------------------------")
df2 = df["Inflation_ConsumerPrice_Annual_Percentage"].diff().diff()
print(); print("---------------------------------------------")
print(); print("---------------------------------------------")
kpss_test(df2.dropna())
print(); print("---------------------------------------------")

print(); print("---------------------------------------------")
print("3rd Diffencing: ")
print("---------------------------------------------")
df3 = df["Inflation_ConsumerPrice_Annual_Percentage"].diff().diff().diff()
print(); print("---------------------------------------------")
print(); print("---------------------------------------------")
kpss_test(df3.dropna())
print(); print("---------------------------------------------")

print(); print("---------------------------------------------")
print("4th Diffencing: ")
print("---------------------------------------------")
df4 = df["Inflation_ConsumerPrice_Annual_Percentage"].diff().diff().diff().diff()
print(); print("---------------------------------------------")
print(); print("---------------------------------------------")
kpss_test(df4.dropna())
print(); print("---------------------------------------------")

---------------------------------------------
First Diffencing:
---------------------------------------------

---------------------------------------------

n_lags: 0.18207613690808988

p-value: 0.18207613690808988

Critial Values:
1%, -3.5745892596209488
5%, -2.9239543084490744
10%, -2.6000391840277777

---------------------------------------------

KPSS Statistic: 0.22624094470506997

p-value: 0.1

num lags: 11

Critial Values:
10% : 0.347
5% : 0.463
2.5% : 0.574
1% : 0.739

---------------------------------------------

---------------------------------------------
2nd Diffencing:
---------------------------------------------

---------------------------------------------

n_lags: 0.011498180158395955

p-value: 0.011498180158395955

Critial Values:
1%, -3.5745892596209488
5%, -2.9239543084490744
10%, -2.6000391840277777

---------------------------------------------

KPSS Statistic: 0.147282900624081

p-value: 0.1

num lags: 11

Critial Values:
10% : 0.347
5% : 0.463
2.5% : 0.574
1% : 0.739

---------------------------------------------

---------------------------------------------
3rd Diffencing:
---------------------------------------------

---------------------------------------------

n_lags: 1.630192005413037e-06

p-value: 1.630192005413037e-06

Critial Values:
1%, -3.5812576580093696
5%, -2.9267849124681518
10%, -2.6015409829867675

---------------------------------------------

KPSS Statistic: 0.13524505664159994

p-value: 0.1

num lags: 11

Critial Values:
10% : 0.347
5% : 0.463
2.5% : 0.574
1% : 0.739

---------------------------------------------

---------------------------------------------
4th Diffencing:
---------------------------------------------

---------------------------------------------

n_lags: 7.2560053615966295e-09

p-value: 7.2560053615966295e-09

Critial Values:
1%, -3.584828853223594
5%, -2.9282991495198907
10%, -2.6023438271604937

---------------------------------------------

KPSS Statistic: 0.17912950785953932

p-value: 0.1

num lags: 11

Critial Values:
10% : 0.347
5% : 0.463
2.5% : 0.574
1% : 0.739

---------------------------------------------

In [ ]:



## How to find the order of the AR term (p)¶

In [11]:
from statsmodels.graphics.tsaplots import plot_pacf

# PACF plot
plt.rcParams.update({'figure.figsize':(9,3), 'figure.dpi':120})
fig, axes = plt.subplots(1, 2, sharex=True)

df2 = df["Inflation_ConsumerPrice_Annual_Percentage"].diff().diff() #.diff() #.diff()

axes[0].plot(df2); axes[0].set_title('2nd Differencing')
axes[1].set(ylim=(-3,3))
plot_pacf(df2.dropna(), ax=axes[1]) #PACF

plt.show()


## How to find the order of the MA term (q)¶

In [12]:
from statsmodels.graphics.tsaplots import plot_acf
import matplotlib.pyplot as plt

plt.rcParams.update({'figure.figsize':(9,3), 'figure.dpi':120})
fig, axes = plt.subplots(1, 2, sharex=True)

df2 = df["Inflation_ConsumerPrice_Annual_Percentage"].diff().diff() #.diff() #.diff()
axes[0].plot(df2); axes[0].set_title('2nd Differencing')
#axes[1].set(ylim=(0,1.2))
plot_acf(df2.dropna(), ax=axes[1]) # ACF

plt.show()

In [13]:
## ADF test

ADF Statistic: -3.384516067347987

n_lags: 0.011498180158395955

p-value: 0.011498180158395955

Critial Values:
1%, -3.5745892596209488
5%, -2.9239543084490744
10%, -2.6000391840277777


## Build the ARIMA(p,d,q) Model¶

In [14]:
from statsmodels.tsa.arima_model import ARIMA

plt.rcParams.update({'figure.figsize':(16,6), 'figure.dpi':220})

df = df.set_index('Year')

# ARIMA Model
model = ARIMA(df["Inflation_ConsumerPrice_Annual_Percentage"], order=(2,2,0))
model_fit = model.fit(disp=0)
print(model_fit.summary())

# Plot residual errors
residuals = pd.DataFrame(model_fit.resid)
fig, ax = plt.subplots(1,2)
residuals.plot(title="Residuals", ax=ax[0])
residuals.plot(kind='kde', title='Density', ax=ax[1])
plt.show()

# Actual vs Fitted
model_fit.plot_predict(dynamic=False)
plt.show()

                                          ARIMA Model Results
========================================================================================================
Dep. Variable:     D2.Inflation_ConsumerPrice_Annual_Percentage   No. Observations:                   59
Model:                                           ARIMA(2, 2, 0)   Log Likelihood                -128.440
Method:                                                 css-mle   S.D. of innovations              2.121
Date:                                          Mon, 02 Aug 2021   AIC                            264.880
Time:                                                  17:08:57   BIC                            273.191
Sample:                                                       2   HQIC                           268.124

======================================================================================================================
coef    std err          z      P>|z|      [0.025      0.975]
----------------------------------------------------------------------------------------------------------------------
const                                                 -0.0384      0.131     -0.293      0.770      -0.295       0.218
ar.L1.D2.Inflation_ConsumerPrice_Annual_Percentage    -0.6607      0.114     -5.813      0.000      -0.884      -0.438
ar.L2.D2.Inflation_ConsumerPrice_Annual_Percentage    -0.4752      0.115     -4.129      0.000      -0.701      -0.250
Roots
=============================================================================
Real          Imaginary           Modulus         Frequency
-----------------------------------------------------------------------------
AR.1           -0.6952           -1.2732j            1.4507           -0.3295
AR.2           -0.6952           +1.2732j            1.4507            0.3295
-----------------------------------------------------------------------------