python-pour-finance/08-Analyse-Time-Series/.ipynb_checkpoints/4-ARIMA-et-ARIMA-Saisonnier...

2463 lines
710 KiB
Plaintext
Raw Permalink Normal View History

2023-08-21 15:12:19 +00:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"___\n",
"\n",
"<a href='http://www.pieriandata.com'> <img src='../Pierian_Data_Logo.png' /></a>\n",
"___\n",
"<center>*Copyright Pierian Data 2017*</center>\n",
"<center>*For more information, visit us at www.pieriandata.com*</center>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Warning! This is a complicated topic! Remember that this is an optional notebook to go through and that to fully understand it you should read the supplemental links and watch the full explanatory walkthrough video. This notebook and the video lectures are not meant to be a full comprehensive overview of ARIMA, but instead a walkthrough of what you can use it for, so you can later understand why it may or may not be a good choice for Financial Stock Data.\n",
"____\n",
"\n",
"\n",
"# ARIMA and Seasonal ARIMA\n",
"\n",
"\n",
"## Autoregressive Integrated Moving Averages\n",
"\n",
"The general process for ARIMA models is the following:\n",
"* Visualize the Time Series Data\n",
"* Make the time series data stationary\n",
"* Plot the Correlation and AutoCorrelation Charts\n",
"* Construct the ARIMA Model\n",
"* Use the model to make predictions\n",
"\n",
"Let's go through these steps!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Step 1: Get the Data (and format it)\n",
"\n",
"We will be using some data about monthly milk production, full details on it can be found [here](https://datamarket.com/data/set/22ox/monthly-milk-production-pounds-per-cow-jan-62-dec-75#!ds=22ox&display=line).\n",
"\n",
"Its saved as a csv for you already, let's load it up:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\Marcial\\Anaconda3\\lib\\site-packages\\statsmodels\\compat\\pandas.py:56: FutureWarning: The pandas.core.datetools module is deprecated and will be removed in a future version. Please use the pandas.tseries module instead.\n",
" from pandas.core import datetools\n"
]
}
],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"import statsmodels.api as sm\n",
"\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"df = pd.read_csv('monthly-milk-production-pounds-p.csv')"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style>\n",
" .dataframe thead tr:only-child th {\n",
" text-align: right;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Month</th>\n",
" <th>Monthly milk production: pounds per cow. Jan 62 ? Dec 75</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1962-01</td>\n",
" <td>589.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1962-02</td>\n",
" <td>561.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1962-03</td>\n",
" <td>640.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1962-04</td>\n",
" <td>656.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1962-05</td>\n",
" <td>727.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Month Monthly milk production: pounds per cow. Jan 62 ? Dec 75\n",
"0 1962-01 589.0 \n",
"1 1962-02 561.0 \n",
"2 1962-03 640.0 \n",
"3 1962-04 656.0 \n",
"4 1962-05 727.0 "
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style>\n",
" .dataframe thead tr:only-child th {\n",
" text-align: right;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Month</th>\n",
" <th>Monthly milk production: pounds per cow. Jan 62 ? Dec 75</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>164</th>\n",
" <td>1975-09</td>\n",
" <td>817.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>165</th>\n",
" <td>1975-10</td>\n",
" <td>827.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>166</th>\n",
" <td>1975-11</td>\n",
" <td>797.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>167</th>\n",
" <td>1975-12</td>\n",
" <td>843.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>168</th>\n",
" <td>Monthly milk production: pounds per cow. Jan 6...</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Month \\\n",
"164 1975-09 \n",
"165 1975-10 \n",
"166 1975-11 \n",
"167 1975-12 \n",
"168 Monthly milk production: pounds per cow. Jan 6... \n",
"\n",
" Monthly milk production: pounds per cow. Jan 62 ? Dec 75 \n",
"164 817.0 \n",
"165 827.0 \n",
"166 797.0 \n",
"167 843.0 \n",
"168 NaN "
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.tail()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"** Clean Up**\n",
"\n",
"Let's clean this up just a little!"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style>\n",
" .dataframe thead tr:only-child th {\n",
" text-align: right;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Month</th>\n",
" <th>Milk in pounds per cow</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1962-01</td>\n",
" <td>589.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1962-02</td>\n",
" <td>561.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1962-03</td>\n",
" <td>640.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1962-04</td>\n",
" <td>656.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1962-05</td>\n",
" <td>727.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Month Milk in pounds per cow\n",
"0 1962-01 589.0\n",
"1 1962-02 561.0\n",
"2 1962-03 640.0\n",
"3 1962-04 656.0\n",
"4 1962-05 727.0"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.columns = ['Month','Milk in pounds per cow']\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Weird last value at bottom causing issues\n",
"df.drop(168,axis=0,inplace=True)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"df['Month'] = pd.to_datetime(df['Month'])"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style>\n",
" .dataframe thead tr:only-child th {\n",
" text-align: right;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Month</th>\n",
" <th>Milk in pounds per cow</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1962-01-01</td>\n",
" <td>589.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1962-02-01</td>\n",
" <td>561.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1962-03-01</td>\n",
" <td>640.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1962-04-01</td>\n",
" <td>656.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1962-05-01</td>\n",
" <td>727.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Month Milk in pounds per cow\n",
"0 1962-01-01 589.0\n",
"1 1962-02-01 561.0\n",
"2 1962-03-01 640.0\n",
"3 1962-04-01 656.0\n",
"4 1962-05-01 727.0"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"df.set_index('Month',inplace=True)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style>\n",
" .dataframe thead tr:only-child th {\n",
" text-align: right;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Milk in pounds per cow</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Month</th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1962-01-01</th>\n",
" <td>589.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1962-02-01</th>\n",
" <td>561.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1962-03-01</th>\n",
" <td>640.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1962-04-01</th>\n",
" <td>656.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1962-05-01</th>\n",
" <td>727.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Milk in pounds per cow\n",
"Month \n",
"1962-01-01 589.0\n",
"1962-02-01 561.0\n",
"1962-03-01 640.0\n",
"1962-04-01 656.0\n",
"1962-05-01 727.0"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style>\n",
" .dataframe thead tr:only-child th {\n",
" text-align: right;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>count</th>\n",
" <th>mean</th>\n",
" <th>std</th>\n",
" <th>min</th>\n",
" <th>25%</th>\n",
" <th>50%</th>\n",
" <th>75%</th>\n",
" <th>max</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Milk in pounds per cow</th>\n",
" <td>168.0</td>\n",
" <td>754.708333</td>\n",
" <td>102.204524</td>\n",
" <td>553.0</td>\n",
" <td>677.75</td>\n",
" <td>761.0</td>\n",
" <td>824.5</td>\n",
" <td>969.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" count mean std min 25% 50% \\\n",
"Milk in pounds per cow 168.0 754.708333 102.204524 553.0 677.75 761.0 \n",
"\n",
" 75% max \n",
"Milk in pounds per cow 824.5 969.0 "
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.describe().transpose()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Step 2: Visualize the Data\n",
"\n",
"Let's visualize this data with a few methods."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x1a11e1831d0>"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nVmlfIicg4HbgksEgAOD
"text/plain": [
"<matplotlib.figure.Figure at 0x1a11e169d68>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df.plot()"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"timeseries = df['Milk in pounds per cow']"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x1a11e5d8438>"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nv6WfBEPCnNfl6HMAV01
"text/plain": [
"<matplotlib.figure.Figure at 0x1a11e5d8b00>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"timeseries.rolling(12).mean().plot(label='12 Month Rolling Mean')\n",
"timeseries.rolling(12).std().plot(label='12 Month Rolling Std')\n",
"timeseries.plot()\n",
"plt.legend()"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x1a11e548978>"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n5MmTmTJlCq+88goAy5Y
"text/plain": [
"<matplotlib.figure.Figure at 0x1a11e5575c0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"timeseries.rolling(12).mean().plot(label='12 Month Rolling Mean')\n",
"timeseries.plot()\n",
"plt.legend()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Decomposition\n",
"\n",
"ETS decomposition allows us to see the individual parts!"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.figure.Figure at 0x1a11e63c898>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\nEAThFizZncDLf5/h8ZU
"text/plain": [
"<matplotlib.figure.Figure at 0x1a11e63cb70>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from statsmodels.tsa.seasonal import seasonal_decompose\n",
"decomposition = seasonal_decompose(df['Milk in pounds per cow'], freq=12) \n",
"fig = plt.figure() \n",
"fig = decomposition.plot() \n",
"fig.set_size_inches(15, 8)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Testing for Stationarity\n",
"\n",
"We can use the Augmented [Dickey-Fuller](https://en.wikipedia.org/wiki/Augmented_Dickey%E2%80%93Fuller_test) [unit root test](https://en.wikipedia.org/wiki/Unit_root_test).\n",
"\n",
"In statistics and econometrics, an augmented DickeyFuller test (ADF) tests the null hypothesis that a unit root is present in a time series sample. The alternative hypothesis is different depending on which version of the test is used, but is usually stationarity or trend-stationarity.\n",
"\n",
"Basically, we are trying to whether to accept the Null Hypothesis **H0** (that the time series has a unit root, indicating it is non-stationary) or reject **H0** and go with the Alternative Hypothesis (that the time series has no unit root and is stationary).\n",
"\n",
"We end up deciding this based on the p-value return.\n",
"\n",
"* A small p-value (typically ≤ 0.05) indicates strong evidence against the null hypothesis, so you reject the null hypothesis.\n",
"\n",
"* A large p-value (> 0.05) indicates weak evidence against the null hypothesis, so you fail to reject the null hypothesis.\n",
"\n",
"Let's run the Augmented Dickey-Fuller test on our data:"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style>\n",
" .dataframe thead tr:only-child th {\n",
" text-align: right;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Milk in pounds per cow</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Month</th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1962-01-01</th>\n",
" <td>589.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1962-02-01</th>\n",
" <td>561.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1962-03-01</th>\n",
" <td>640.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1962-04-01</th>\n",
" <td>656.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1962-05-01</th>\n",
" <td>727.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Milk in pounds per cow\n",
"Month \n",
"1962-01-01 589.0\n",
"1962-02-01 561.0\n",
"1962-03-01 640.0\n",
"1962-04-01 656.0\n",
"1962-05-01 727.0"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from statsmodels.tsa.stattools import adfuller"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"result = adfuller(df['Milk in pounds per cow'])"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Augmented Dickey-Fuller Test:\n",
"ADF Test Statistic : -1.30381158742\n",
"p-value : 0.627426708603\n",
"#Lags Used : 13\n",
"Number of Observations Used : 154\n",
"weak evidence against null hypothesis, time series has a unit root, indicating it is non-stationary \n"
]
}
],
"source": [
"print('Augmented Dickey-Fuller Test:')\n",
"labels = ['ADF Test Statistic','p-value','#Lags Used','Number of Observations Used']\n",
"\n",
"for value,label in zip(result,labels):\n",
" print(label+' : '+str(value) )\n",
" \n",
"if result[1] <= 0.05:\n",
" print(\"strong evidence against the null hypothesis, reject the null hypothesis. Data has no unit root and is stationary\")\n",
"else:\n",
" print(\"weak evidence against null hypothesis, time series has a unit root, indicating it is non-stationary \")"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Store in a function for later use!\n",
"def adf_check(time_series):\n",
" \"\"\"\n",
" Pass in a time series, returns ADF report\n",
" \"\"\"\n",
" result = adfuller(time_series)\n",
" print('Augmented Dickey-Fuller Test:')\n",
" labels = ['ADF Test Statistic','p-value','#Lags Used','Number of Observations Used']\n",
"\n",
" for value,label in zip(result,labels):\n",
" print(label+' : '+str(value) )\n",
" \n",
" if result[1] <= 0.05:\n",
" print(\"strong evidence against the null hypothesis, reject the null hypothesis. Data has no unit root and is stationary\")\n",
" else:\n",
" print(\"weak evidence against null hypothesis, time series has a unit root, indicating it is non-stationary \")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"___________\n",
"\n",
"## Important Note!\n",
"\n",
"** We have now realized that our data is seasonal (it is also pretty obvious from the plot itself). This means we need to use Seasonal ARIMA on our model. If our data was not seasonal, it means we could use just ARIMA on it. We will take this into account when differencing our data! Typically financial stock data won't be seasonal, but that is kind of the point of this section, to show you common methods, that won't work well on stock finance data!**\n",
"\n",
"_____"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Differencing\n",
"\n",
"The first difference of a time series is the series of changes from one period to the next. We can do this easily with pandas. You can continue to take the second difference, third difference, and so on until your data is stationary."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"** First Difference **"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"df['Milk First Difference'] = df['Milk in pounds per cow'] - df['Milk in pounds per cow'].shift(1)"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Augmented Dickey-Fuller Test:\n",
"ADF Test Statistic : -3.05499555865\n",
"p-value : 0.0300680040018\n",
"#Lags Used : 14\n",
"Number of Observations Used : 152\n",
"strong evidence against the null hypothesis, reject the null hypothesis. Data has no unit root and is stationary\n"
]
}
],
"source": [
"adf_check(df['Milk First Difference'].dropna())"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x1a11ea04160>"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nq6WUr5FS/i0pZacKmGJ
"text/plain": [
"<matplotlib.figure.Figure at 0x1a11ea87198>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df['Milk First Difference'].plot()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"** Second Difference **"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Sometimes it would be necessary to do a second difference \n",
"# This is just for show, we didn't need to do a second difference in our case\n",
"df['Milk Second Difference'] = df['Milk First Difference'] - df['Milk First Difference'].shift(1)"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Augmented Dickey-Fuller Test:\n",
"ADF Test Statistic : -14.3278736456\n",
"p-value : 1.11269893321e-26\n",
"#Lags Used : 11\n",
"Number of Observations Used : 154\n",
"strong evidence against the null hypothesis, reject the null hypothesis. Data has no unit root and is stationary\n"
]
}
],
"source": [
"adf_check(df['Milk Second Difference'].dropna())"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x1a11ea602b0>"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYMAAAEKCAYAAADw2zkCAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvWmUbclVHvjFGe7Nm/nGqldzlVSSKDQhS4hCiMkWiNGY\nFtjdIBCCHmjcNthuFgsv1HQbei3EtIxx27SwZQnQWtgIWUggIyG1VEJIaCqVhqqSVINqVA2v3vxy\nutMZon/E2RE74sS599zMG/nq1jt7rbfy5c3MfePGOWcP37f3DiGlRCeddNJJJ5e3RJd6AZ100kkn\nnVx66ZxBJ5100kknnTPopJNOOumkcwaddNJJJ52gcwaddNJJJ52gcwaddNJJJ52gcwaddNJJJ52g\ncwaddNJJJ52gcwaddNJJJ50ASC71AtrKiRMn5M0333ypl9FJJ510slLy2c9+9qyU8qp5v7cyzuDm\nm2/GHXfccamX0UknnXSyUiKEeLTN73UwUSeddNJJJ50z6KSTTjrppHMGnXTSSSedoHMGnXTSSSed\noHMGnXTSSSedoHMGnXTSSSedoHMGnXTSSSedoHMGnXTSSSdPK5nmJd5xx2M46COJO2fQSSeddLKA\nPHlxhH/5zjsxzcsg+j/+4Fn8y3fehS89uRVEf5N0zqCTTjrpZAH59MPn8I47HsdjF4ZB9JOTmRZh\nnE2TdM6gk046eUbJ5ijDX971ZDD9ZKPLMgyMQ3pD6W+Szhl00kknzyh5390n8XP/5fM4tzMJol8b\n60C2mvQesC/onEEnnXTyzJJJVgAAsiKMNS0qYrcIZK1D62+Szhl00kknzyghH1AEqsYpdGYQGCZa\nxWoiIcQfCCFOCyG+yF77VSHEE0KIL1T//j772RuEEA8IIe4TQnzvMtbQSSeddAKEx9zJSIcy1qGd\nTZMsKzP4IwDf53n9d6WUL6v+vQ8AhBAvAvBaAC+u/uZNQoh4SevopJNO9il/8YUn8KP/8ZOXehl7\nluKAjHUHE3lESvlRAOdb/vprALxdSjmRUj4M4AEAr1jGOjrppJP9y5dPbuGORy9c6mXsWYIb6wOC\niQ44MQjOGfwzIcRdFYx0vHrtBgCPsd95vHqtJkKInxFC3CGEuOPMmTOBl9pJJ50AyhgddFS6TAmN\nuZPaUFu00plBg/w+gOcCeBmAkwB+Z1EFUso3SylvlVLeetVVc4/w7KSTTpYgurRxRR2CgYnC6g9l\nrGnfQxHgTRLMGUgpT0kpCyllCeA/wUBBTwC4if3qjdVrnXTSydNAiktkjJYl5UHBRIH1P2NmEwkh\nrmPf/jAAqjR6D4DXCiH6QojnALgFwO2h1tFJJ50sJuUlgimWJQcVuYfLPKqvBzuNAskylAgh/gTA\nqwCcEEI8DuBXALxKCPEyABLAIwD+MQBIKb8khHgHgC8DyAH8rJSyWMY6OjkY2RxlSCKBjf5Sbp9O\nFpRxVmA0LXB8oxdEPzmDFU0MkAfmDLSzCcZJXJrS0qU8zVLKH/O8/NYZv/9GAG9cxnt3cvDyT//z\nZ3HDsQF++79/6aVeymUpb/rrB/CXd5/Eh3/hVUH0U0S66jBRsHERoZ3NJeoz6EK7ThaWs9tT9JNw\nrSF/8QVFIb3mZd4is8tezuxMcW5nGkx/aMw9tGhnFrgPIBhncIlgus4ZdLKwFDJs6eEff+pRCCFW\n1hmMpgWmeYmj62kQ/UVZBq30KQMbu9ASvkOYvq4mJ9Ek3WyiThaWspRBU9i8lCtriADgtz9wL37y\nD8PVRBRlWAgnNCYeWkJX+8jQpauBR2Q3SZcZdLKwhM4MylKudJhydmeKs9thxicDKuINvv9Y3cwg\ntDMLjelfKmfcOYNOFpYicIdqISVwwGV1y5QDyZyCZgb0dTWdgXFmYfQfXOlq5ww6eZpLaGNXlACi\n1TREAJCXZfDIPaj+wDBIaFn1EdOhCeomWeFkvJNLJaFhoqIsD7zhZplSlGErQYpSopThOlQ7mKid\n/vDOJoj6Rukyg04WFkVghtQvsco4USllUIglZ8YiFsvXH3rqZ2gJ7cwMwRtE/SXb/y4z6GRhKWXY\nap9Srq4hApSxPggYJxhmveKcgRnnsJqD5MwZyJ0z6ORpLsEJ5AoGWVUpA5fGhh63sPJ9BsFnB4Xd\nn9B9Ek3SwUSdLCzhCeTVNEIkRRkWJjqoqZyrmhnkFX4T3FkG6zOg6xtGf5N0zqCThSU8gbyaRojk\nIDInICRMsdqcwUF1CK8qQd0knTPoZGEJHfmuep/BQTnL4DDFil6D4OMoCNMP3WfQEcid7Fd2Jjkm\nebip4MEJ5MDOJrSELv0M3fR0qaZmLktWvs/gmXbSWSeXTl73lk/jX3/gvmD6DyIzWFXyEuDGKKz+\nYDDRqo+w1s4yjP7QpZ+hj+1sks4ZeOT3P/IgvvTk5qVexp7lzNYYpwPNxpFSRb0hIYTQzia0BDcW\ngcctrHo10UHNDgqeeXSD6i69/PYH7sX2+Hl48fVHL/VS9iR5KXX54bJF16B3BHKjhB+hfDAE5qpe\nh+CcSvDS1ep9Opjo0kpZSki5uikyUGHWgaPSUM6G3mNVDREQfo8OytiFegY2hxk+8eDZILoBBhOt\nqLMMvf9N0jkDR+gBLkLOWwgsIatZDqIhJvSI5tByUJhy6A7kUDDUf/3sY3j9W2/HOAtT5BC+2kp9\nDVYg0MFETw9Z9YYbQDmy4A1JoWGiFQ5TgneohoaJAusfTQsUAaFMA7MEUc+a/gLpv0QEcucMHKHu\nxVWOTPOABGxoQ0cE9SrPowhtTPPgkW/Y7C8PHFCseof2pWr6W+H4K4ys+sRGICzmflBRacg6/dAS\nOs0PzUmEriY6sGqrwAFRcJio4wwurYSOWg5CQnIGB4WHh3yP0HJQxnpVr3HwzOCASj/DPQPV+3TO\n4NLKQVTLhBRZOYJweGzoB63+XqsmoY11+Kml9DWUswkLxRpnE0R98MNzQnMSTdI5A0dC47GhJXzZ\nof0+yxb+gK3qbJzgxvqgMPFA+6+N9YqOiyD9oWKVQuvvMoOZUpQS95/axrmdMB22VFK6qplBHjiz\n4a3yIW5WXtK7qpnBQcEsoUc0B+eFQt+jK1rae6ma/lbOGUzyAt/zux/FOz/7eBD9q15NdFB4qXqP\n5et/JnAGBxWZBittDGysgwcswTMP+32Wrz/s+ptk5ZxBHKlDX4PfSCtqiPSDFqhpju9LiD3iOlcV\nqjuo7GxVI1PK/kIb09Clt6Gn0h50YrwUZyCE+AMhxGkhxBfZa1cIIT4ohPhK9fU4+9kbhBAPCCHu\nE0J87yLvlURqyaFT8FWFiehBC11WF+o9uM5VvQYdgTxbQlcThZ76GT7zWG2Y6I8AfJ/z2i8BuE1K\neQuA26rvIYR4EYDXAnhx9TdvEkLEbd+oSgwOIDNYTfaSbtBgZY2BMwO+7pWfpx8YxgkeWa9oNVER\neAR3aGcT2hk3yVKcgZTyowDOOy+/BsDbqv+/DcAPsdffLqWcSCkfBvAAgFe0fS8hBJJIBDPWxusH\nUR9cDoqcc/+/LAntbEKL7qBG+A7k8IPYgqg/uD6DFYWhnolNZ9dIKU9W/38KwDXV/28A8Bj7vcer\n11pLHIlgkW++4pnBQZFzQJiHITQnAQBv+dhD+M2/ujeI7tDrLwPvP9e7qrOPVn9Q4GrDRDNFKqZl\n4U8mhPgZIcQdQog7zpw5o19PIhFsquiqE8jhyTn2XiGcQWBOAgD+9oGz+Mh9p4PoDr3+g6i20jBF\n8IArNMwVRL1+BkJzEgdtgkI6g1NCiOsAoPpKT98TAG5iv3dj9VpNpJRvllLeKqW89aqrrtKvh80M\nVru0NHSH8EHCRMGu8QFMdaX3Cak/+OE5K1qxF/wZCM2pXKKT5kI6g/cA+Knq/z8F4C/Y668VQvSF\nEM8BcAuA2xdRnMRR8Bt1VStZCN46GJho+fotAjnQZ8iK8kCcQZDMwIKhlq5e6V3xqaUrDxNdoj6D\npYywFkL8CYBXATghhHg
"text/plain": [
"<matplotlib.figure.Figure at 0x1a11eabed30>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df['Milk Second Difference'].plot()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"** Seasonal Difference **"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x1a11ed76828>"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\npeNx2NqiLqFZqZ+lkzv
"text/plain": [
"<matplotlib.figure.Figure at 0x1a11ec03dd8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df['Seasonal Difference'] = df['Milk in pounds per cow'] - df['Milk in pounds per cow'].shift(12)\n",
"df['Seasonal Difference'].plot()"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Augmented Dickey-Fuller Test:\n",
"ADF Test Statistic : -2.33541931436\n",
"p-value : 0.160798805277\n",
"#Lags Used : 12\n",
"Number of Observations Used : 143\n",
"weak evidence against null hypothesis, time series has a unit root, indicating it is non-stationary \n"
]
}
],
"source": [
"# Seasonal Difference by itself was not enough!\n",
"adf_check(df['Seasonal Difference'].dropna())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"** Seasonal First Difference **"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x1a11eb66f28>"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAEKCAYAAAARnO4WAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvXl4HNd9JXpuVfXejYUgAIIkKEoitVJbTMtbbMWWF8lO\nLGVxbE8cOy+Lkjxne0mcsZ2ZcfJi53kmeZPkTV4SK8tE7yWfbSVepNiRbNmxvEWyFouUqJUUJRJc\nQGIHeu+quvNH1e/WrepqdDe6uoFm3/N9/Ag0gKrq6qpzT517fr/LOOdQUFBQULjwoW32ASgoKCgo\n9AaK8BUUFBQGBIrwFRQUFAYEivAVFBQUBgSK8BUUFBQGBIrwFRQUFAYEkRE+Y0xnjD3BGPuS+/02\nxtgDjLGj7v+jUe1LQUFBQaF9RKnwfx3As9L3Hwbwdc75fgBfd79XUFBQUNgkREL4jLHdAN4B4G+k\nl28DcJf79V0Abo9iXwoKCgoKG4MR0Xb+FMDvAMhJr01yzs+6X88CmGy2ke3bt/O9e/dGdEgKCgoK\ng4HHH398nnM+3uz3OiZ8xtgPAzjPOX+cMfZDYb/DOeeMsdAeDoyxOwDcAQB79uzBY4891ukhKSgo\nKAwUGGMnWvm9KCyd1wF4J2PsZQCfAfAmxtg/ADjHGJtyD2YKwPmwP+ac38k5P8g5Pzg+3nSAUlBQ\nUFDYIDomfM75RzjnuznnewG8B8C/cc7fB+BeAB9wf+0DAO7pdF8KCgoKChtHN3P4nwTwFsbYUQBv\ndr9XUFBQUNgkRDVpCwDgnD8I4EH36wUAN0e5fQUFBQWFjUNV2iooKCgMCBThKygoKAwIFOErKCgo\nDAgU4SsoDAi+c3QeJxYKm30YCpsIRfgKCgOC37z7EP7628c3+zAUNhGK8BUUBgQV00bVtDf7MBQ2\nEYrwFRQGBJbNYSm+H2gowldQGBCYtg3LVow/yFCEr6AwILBsDtMO7WGoMCBQhK+gMCAwbQ5LEf5A\nQxG+gsIAwLY5OIdS+AMORfgKCgMAInql8AcbivAVFAYARPRK4Q82FOErKAwATDedo1I6gw1F+AoK\nAwCh8C2l8AcZivAVFAYAysNXABThKygMBJSHrwAowldQGAgoha8AKMJXUBgIWJZS+AqK8BUUBgI1\nldJRgCJ8BYWBgPLwFQBF+AoKAwGKYyoPf7DRMeEzxpKMsUcYY4cZY08zxn7ffX0bY+wBxthR9//R\nzg9XQUFhI1A5fAUgGoVfAfAmzvl1AK4HcAtj7NUAPgzg65zz/QC+7n6voKCwCfAqbRXhDzI6Jnzu\nIO9+G3P/cQC3AbjLff0uALd3ui8FBYWNQXn4CkBEHj5jTGeMHQJwHsADnPPvAZjknJ91f2UWwGQU\n+1JQUGgfXg5fpXQGGZEQPufc4pxfD2A3gBsZYwcCP+dwVH8dGGN3MMYeY4w9Njc3F8XhKCgoBKAU\nvgIQcUqHc74M4BsAbgFwjjE2BQDu/+cb/M2dnPODnPOD4+PjUR6OgoKCCyJ6WxH+QCOKlM44Y2zE\n/ToF4C0AngNwL4APuL/2AQD3dLovBQWFjYGsHKXwBxtGBNuYAnAXY0yHM4DczTn/EmPsIQB3M8Z+\nDsAJAD8Zwb4UFBQ2AJXDVwAiIHzO+ZMAbgh5fQHAzZ1uX0FBoXPIHj7nHIyxTT4ihc2AqrRVUBgA\nyFaOEvmDC0X4CgoDANnKMVU0c2ChCF9BYQAgK3zl4w8uFOErKAwA5IIrldQZXCjCV1AYAPgUvmqg\nNrBQhK+gMACQu2QqhT+4UISvoDAAUB6+AqAIX0FhIOD38FVKZ1ChCF9BYQCgFL4CoAhf4QLEN1+Y\nw1q5ttmHsaVgKQ9fAYrwFS4wrBRr+Jn/+QjuOXRmsw9lS0EpfAVAEb7CBYayaYFzoFyzNvtQthR8\nlbYqljmwUIQfMWyb4/ETi5t9GAOLqqnWbg2DUvgKgCL8yPHtY/P48b98CMfO55v/skLkMNXKTqFQ\nKR0FQBF+5JhfqwAA8hVzk49kMGFa7kIfyrbwQSl8BUARfuQgoleLRW8OqhZZOur8y/B3y1SEP6hQ\nhB8xiPCVwtwc0HlXpOaHUvgKgCL8yLFWJoWvbqrNAPnT6vz7oXL4CoAi/MiRrzgFP+qm2hxUTaXw\nw+Bb8Uqdm4GFIvyIkVcKf1OhFH44VD98BUARfuTIV5yCH3VTbQ5qlNJRk7Y++D18dW4GFYrwIwZZ\nOuqm2hzUXK9aKXw/LJuDMedrJUYGFx0TPmNsmjH2DcbYM4yxpxljv+6+vo0x9gBj7Kj7/2jnh7v1\nIVI66qbaFIiUjkpJ+VCzOJKGDqD7g+H7/+4RfPK+57q6D4WNIQqFbwL4Lc75VQBeDeCDjLGrAHwY\nwNc55/sBfN39/oKH8vA3FzVLefhhsGwbiZhzu3d7MDyxUMCJhUJX96GwMXRM+Jzzs5zz77tfrwF4\nFsAuALcBuMv9tbsA3N7pvvoBpPBrSmFuCjwPX51/GabNkTCc273bg6Flc3X9b1FE6uEzxvYCuAHA\n9wBMcs7Puj+aBTAZ5b62KrwcvvLwNwNE9Erh+2HZHAnX0un2YGjZXE2ab1FERviMsSyAzwH4Dc75\nqvwzzjkHEHqVMcbuYIw9xhh7bG5uLqrD2RTULBsVUynMzYRK6YTDtDniQuF399xYNldzKFsUkRA+\nYywGh+z/kXP+efflc4yxKffnUwDOh/0t5/xOzvlBzvnB8fHxKA5n01CQGqYphbk5UCmdcFiSpdML\nhU8Dr8LWQhQpHQbgbwE8yzn/79KP7gXwAffrDwC4p9N9bXWQnQOolMhmwVQefih66uFz3pMB94+/\n8jz+8sEXu76fCwlRKPzXAfhpAG9ijB1y/70dwCcBvIUxdhTAm93vL2jklcLfdKiUTjgs2+6dh29x\n1Hpw/r91dA7ffCHUOFBoAKPTDXDOvwOANfjxzZ1uv58gE75SmJuDmsrhh8K0uIhl9kLhmz2wdGoW\nR7GqlrJsB6rSNkLky7LC7y8PM18x8fN3PYqzK6XNPpSOoHrphMPn4Xd5MOzVpK1l2755M4XmUIQf\nIdb6WOEfPbeGrz17Hodnljf7UDqCUPh9NuB2G5bNEdN7l9Kp9eD8mzZHSSn8tqAIP0L0c0qHiJJi\npf0K5eGHw3QJ39BY9z183iuFz1FQhN8WFOFHCNnS6fZNla+Y+I///CRWy7VItld1ib56gRC+qvT0\nw7I5dI1B11hXB0Pb5uAcPfHwTYujWFWWTjtQhB8hyNJJGFrXFeZTp1bw2cdmcOhkNBZM1bLc//ub\n8E2Vww+FadswNNZ1hW9xZ9u9SOlQC4d+Fym9hCL8CJEvm8gmDMR1rScTY0B0ipxWiur3m0d5+OGw\nbA5D777Cp233ROG7+1Iqv3Uowo8Q+UoN2YQBXWddnxgjQovKcydl3/+E3zsP/2+/8xKOz+W7vp8o\nYNochqbB0LWuDoaC8Htw/ul9KB+/dSjCjxD5iols0ujNxJhNk6zRXOwXiodPJNDt81+zbPzBl57B\nFw+d6ep+ooJl9cbDN4XC74Gl4+6jqKKZLUMRfoRYcy2dbt9UgHdjRaXwSRn3u4ffq146RGiVWn+o\ny5rk4Xd70hbojaVG94BS+K1DEX6EKFRM5JIGDE3rncKPiHAuFIXfq374RGilPiF8OaXTzXND265Z\nHJz35h5QHn7rUIQfIfIVE5l4fyp8Qfh9rvB7ldKh7fdL4Y/j4fdA4Usk3/17wLlWi5X++Ay2AhTh\nR4h8uZcevpq0DYNQ+F0euOjz7QeFT9l4XdN6pvCDX0cN2+agzReUwm8ZivAjxFpF9vC7Xb7u/N+t\nSVvOOf7l8Jm+GwB6ldKhJ4lyHxA+Ea+hMxiaJiY7uwFbOu/d7IkvDyaqgVrrUIQfETjnyLsevq6x\nHuTwXYVf686k7fPn1vCrn34C//bcuUi23yuIlEiP7IRyROe/m6DBr5cePtDdpI48oKsGaq1DEX5E\nKFYtcA5kEwZievcnbbv
"text/plain": [
"<matplotlib.figure.Figure at 0x1a11ecaa9e8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# You can also do seasonal first difference\n",
"df['Seasonal First Difference'] = df['Milk First Difference'] - df['Milk First Difference'].shift(12)\n",
"df['Seasonal First Difference'].plot()"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Augmented Dickey-Fuller Test:\n",
"ADF Test Statistic : -5.03800227492\n",
"p-value : 1.86542343188e-05\n",
"#Lags Used : 11\n",
"Number of Observations Used : 143\n",
"strong evidence against the null hypothesis, reject the null hypothesis. Data has no unit root and is stationary\n"
]
}
],
"source": [
"adf_check(df['Seasonal First Difference'].dropna())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Autocorrelation and Partial Autocorrelation Plots\n",
"\n",
"An autocorrelation plot (also known as a [Correlogram](https://en.wikipedia.org/wiki/Correlogram) ) shows the correlation of the series with itself, lagged by x time units. So the y axis is the correlation and the x axis is the number of time units of lag.\n",
"\n",
"So imagine taking your time series of length T, copying it, and deleting the first observation of copy #1 and the last observation of copy #2. Now you have two series of length T1 for which you calculate a correlation coefficient. This is the value of of the vertical axis at x=1x=1 in your plots. It represents the correlation of the series lagged by one time unit. You go on and do this for all possible time lags x and this defines the plot.\n",
"\n",
"You will run these plots on your differenced/stationary data. There is a lot of great information for identifying and interpreting ACF and PACF [here](http://people.duke.edu/~rnau/arimrule.htm) and [here](https://people.duke.edu/~rnau/411arim3.htm).\n",
"\n",
"### Autocorrelation Interpretation\n",
"\n",
"The actual interpretation and how it relates to ARIMA models can get a bit complicated, but there are some basic common methods we can use for the ARIMA model. Our main priority here is to try to figure out whether we will use the AR or MA components for the ARIMA model (or both!) as well as how many lags we should use. In general you would use either AR or MA, using both is less common.\n",
"\n",
"* If the autocorrelation plot shows positive autocorrelation at the first lag (lag-1), then it suggests to use the AR terms in relation to the lag\n",
"\n",
"* If the autocorrelation plot shows negative autocorrelation at the first lag, then it suggests using MA terms."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"_____\n",
"### <font color='red'> Important Note! </font> \n",
"\n",
"Here we will be showing running the ACF and PACF on multiple differenced data sets that have been made stationary in different ways, typically you would just choose a single stationary data set and continue all the way through with that.\n",
"\n",
"The reason we use two here is to show you the two typical types of behaviour you would see when using ACF.\n",
"_____"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from statsmodels.graphics.tsaplots import plot_acf,plot_pacf"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\nXOB+VX260msbRj5qlV+
"text/plain": [
"<matplotlib.figure.Figure at 0x1a11ebfee48>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Duplicate plots\n",
"# Check out: https://stackoverflow.com/questions/21788593/statsmodels-duplicate-charts\n",
"# https://github.com/statsmodels/statsmodels/issues/1265\n",
"fig_first = plot_acf(df[\"Milk First Difference\"].dropna())"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\nDrwzvIKqLg/+FpGvAI9
"text/plain": [
"<matplotlib.figure.Figure at 0x1a11eb052b0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig_seasonal_first = plot_acf(df[\"Seasonal First Difference\"].dropna())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Pandas also has this functionality built in, but only for ACF, not PACF. So I recommend using statsmodels, as ACF and PACF is more core to its functionality than it is to pandas' functionality."
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x1a121adf390>"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\ny37+ur+mwJgRpdcLG0U
"text/plain": [
"<matplotlib.figure.Figure at 0x1a121af3390>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from pandas.plotting import autocorrelation_plot\n",
"autocorrelation_plot(df['Seasonal First Difference'].dropna())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Partial Autocorrelation\n",
"\n",
"In general, a partial correlation is a conditional correlation.\n",
"\n",
"It is the correlation between two variables under the assumption that we know and take into account the values of some other set of variables.\n",
"\n",
"For instance, consider a regression context in which y = response variable and x1, x2, and x3 are predictor variables. The partial correlation between y and x3 is the correlation between the variables determined taking into account how both y and x3 are related to x1 and x2.\n",
"\n",
"Formally, this is relationship is defined as:\n",
"\n",
"## $\\frac{\\text{Covariance}(y, x_3|x_1, x_2)}{\\sqrt{\\text{Variance}(y|x_1, x_2)\\text{Variance}(x_3| x_1, x_2)}}$\n",
"\n",
"Check out this [link](http://www.itl.nist.gov/div898/handbook/pmc/section4/pmc4463.htm) for full details on this."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can then plot this relationship:"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\nN7nv36Oqm0TkSeBlIAX
"text/plain": [
"<matplotlib.figure.Figure at 0x1a121b44cc0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"result = plot_pacf(df[\"Seasonal First Difference\"].dropna())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Interpretation\n",
"\n",
"Typically a sharp drop after lag \"k\" suggests an AR-k model should be used. If there is a gradual decline, it suggests an MA model."
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"### Final Thoughts on Autocorrelation and Partial Autocorrelation\n",
"\n",
"* Identification of an AR model is often best done with the PACF.\n",
" * For an AR model, the theoretical PACF “shuts off” past the order of the model. The phrase “shuts off” means that in theory the partial autocorrelations are equal to 0 beyond that point. Put another way, the number of non-zero partial autocorrelations gives the order of the AR model. By the “order of the model” we mean the most extreme lag of x that is used as a predictor.\n",
" \n",
" \n",
"* Identification of an MA model is often best done with the ACF rather than the PACF.\n",
" * For an MA model, the theoretical PACF does not shut off, but instead tapers toward 0 in some manner. A clearer pattern for an MA model is in the ACF. The ACF will have non-zero autocorrelations only at lags involved in the model."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"_____\n",
"### Final ACF and PACF Plots\n",
"\n",
"We've run quite a few plots, so let's just quickly get our \"final\" ACF and PACF plots. These are the ones we will be referencing in the rest of the notebook below.\n",
"_____"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\nJElqu3adHPi7wLWZOTJ
"text/plain": [
"<matplotlib.figure.Figure at 0x1a11fc60048>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig = plt.figure(figsize=(12,8))\n",
"ax1 = fig.add_subplot(211)\n",
"fig = sm.graphics.tsa.plot_acf(df['Seasonal First Difference'].iloc[13:], lags=40, ax=ax1)\n",
"ax2 = fig.add_subplot(212)\n",
"fig = sm.graphics.tsa.plot_pacf(df['Seasonal First Difference'].iloc[13:], lags=40, ax=ax2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Using the Seasonal ARIMA model\n",
"\n",
"Finally we can use our ARIMA model now that we have an understanding of our data!"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# For non-seasonal data\n",
"from statsmodels.tsa.arima_model import ARIMA"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Help on class ARIMA in module statsmodels.tsa.arima_model:\n",
"\n",
"class ARIMA(ARMA)\n",
" | Autoregressive Integrated Moving Average ARIMA(p,d,q) Model\n",
" | \n",
" | Parameters\n",
" | ----------\n",
" | endog : array-like\n",
" | The endogenous variable.\n",
" | order : iterable\n",
" | The (p,d,q) order of the model for the number of AR parameters,\n",
" | differences, and MA parameters to use.\n",
" | exog : array-like, optional\n",
" | An optional array of exogenous variables. This should *not* include a\n",
" | constant or trend. You can specify this in the `fit` method.\n",
" | dates : array-like of datetime, optional\n",
" | An array-like object of datetime objects. If a pandas object is given\n",
" | for endog or exog, it is assumed to have a DateIndex.\n",
" | freq : str, optional\n",
" | The frequency of the time-series. A Pandas offset or 'B', 'D', 'W',\n",
" | 'M', 'A', or 'Q'. This is optional if dates are given.\n",
" | \n",
" | \n",
" | Notes\n",
" | -----\n",
" | If exogenous variables are given, then the model that is fit is\n",
" | \n",
" | .. math::\n",
" | \n",
" | \\phi(L)(y_t - X_t\\beta) = \\theta(L)\\epsilon_t\n",
" | \n",
" | where :math:`\\phi` and :math:`\\theta` are polynomials in the lag\n",
" | operator, :math:`L`. This is the regression model with ARMA errors,\n",
" | or ARMAX model. This specification is used, whether or not the model\n",
" | is fit using conditional sum of square or maximum-likelihood, using\n",
" | the `method` argument in\n",
" | :meth:`statsmodels.tsa.arima_model.ARIMA.fit`. Therefore, for\n",
" | now, `css` and `mle` refer to estimation methods only. This may\n",
" | change for the case of the `css` model in future versions.\n",
" | \n",
" | Method resolution order:\n",
" | ARIMA\n",
" | ARMA\n",
" | statsmodels.tsa.base.tsa_model.TimeSeriesModel\n",
" | statsmodels.base.model.LikelihoodModel\n",
" | statsmodels.base.model.Model\n",
" | builtins.object\n",
" | \n",
" | Methods defined here:\n",
" | \n",
" | __getnewargs__(self)\n",
" | \n",
" | __init__(self, endog, order, exog=None, dates=None, freq=None, missing='none')\n",
" | Initialize self. See help(type(self)) for accurate signature.\n",
" | \n",
" | fit(self, start_params=None, trend='c', method='css-mle', transparams=True, solver='lbfgs', maxiter=50, full_output=1, disp=5, callback=None, start_ar_lags=None, **kwargs)\n",
" | Fits ARIMA(p,d,q) model by exact maximum likelihood via Kalman filter.\n",
" | \n",
" | Parameters\n",
" | ----------\n",
" | start_params : array-like, optional\n",
" | Starting parameters for ARMA(p,q). If None, the default is given\n",
" | by ARMA._fit_start_params. See there for more information.\n",
" | transparams : bool, optional\n",
" | Whehter or not to transform the parameters to ensure stationarity.\n",
" | Uses the transformation suggested in Jones (1980). If False,\n",
" | no checking for stationarity or invertibility is done.\n",
" | method : str {'css-mle','mle','css'}\n",
" | This is the loglikelihood to maximize. If \"css-mle\", the\n",
" | conditional sum of squares likelihood is maximized and its values\n",
" | are used as starting values for the computation of the exact\n",
" | likelihood via the Kalman filter. If \"mle\", the exact likelihood\n",
" | is maximized via the Kalman Filter. If \"css\" the conditional sum\n",
" | of squares likelihood is maximized. All three methods use\n",
" | `start_params` as starting parameters. See above for more\n",
" | information.\n",
" | trend : str {'c','nc'}\n",
" | Whether to include a constant or not. 'c' includes constant,\n",
" | 'nc' no constant.\n",
" | solver : str or None, optional\n",
" | Solver to be used. The default is 'lbfgs' (limited memory\n",
" | Broyden-Fletcher-Goldfarb-Shanno). Other choices are 'bfgs',\n",
" | 'newton' (Newton-Raphson), 'nm' (Nelder-Mead), 'cg' -\n",
" | (conjugate gradient), 'ncg' (non-conjugate gradient), and\n",
" | 'powell'. By default, the limited memory BFGS uses m=12 to\n",
" | approximate the Hessian, projected gradient tolerance of 1e-8 and\n",
" | factr = 1e2. You can change these by using kwargs.\n",
" | maxiter : int, optional\n",
" | The maximum number of function evaluations. Default is 50.\n",
" | tol : float\n",
" | The convergence tolerance. Default is 1e-08.\n",
" | full_output : bool, optional\n",
" | If True, all output from solver will be available in\n",
" | the Results object's mle_retvals attribute. Output is dependent\n",
" | on the solver. See Notes for more information.\n",
" | disp : int, optional\n",
" | If True, convergence information is printed. For the default\n",
" | l_bfgs_b solver, disp controls the frequency of the output during\n",
" | the iterations. disp < 0 means no output in this case.\n",
" | callback : function, optional\n",
" | Called after each iteration as callback(xk) where xk is the current\n",
" | parameter vector.\n",
" | start_ar_lags : int, optional\n",
" | Parameter for fitting start_params. When fitting start_params,\n",
" | residuals are obtained from an AR fit, then an ARMA(p,q) model is\n",
" | fit via OLS using these residuals. If start_ar_lags is None, fit\n",
" | an AR process according to best BIC. If start_ar_lags is not None,\n",
" | fits an AR process with a lag length equal to start_ar_lags.\n",
" | See ARMA._fit_start_params_hr for more information.\n",
" | kwargs\n",
" | See Notes for keyword arguments that can be passed to fit.\n",
" | \n",
" | Returns\n",
" | -------\n",
" | `statsmodels.tsa.arima.ARIMAResults` class\n",
" | \n",
" | See also\n",
" | --------\n",
" | statsmodels.base.model.LikelihoodModel.fit : for more information\n",
" | on using the solvers.\n",
" | ARIMAResults : results class returned by fit\n",
" | \n",
" | Notes\n",
" | ------\n",
" | If fit by 'mle', it is assumed for the Kalman Filter that the initial\n",
" | unkown state is zero, and that the inital variance is\n",
" | P = dot(inv(identity(m**2)-kron(T,T)),dot(R,R.T).ravel('F')).reshape(r,\n",
" | r, order = 'F')\n",
" | \n",
" | predict(self, params, start=None, end=None, exog=None, typ='linear', dynamic=False)\n",
" | ARIMA model in-sample and out-of-sample prediction\n",
" | \n",
" | Parameters\n",
" | ----------\n",
" | params : array-like\n",
" | The fitted parameters of the model.\n",
" | start : int, str, or datetime\n",
" | Zero-indexed observation number at which to start forecasting, ie.,\n",
" | the first forecast is start. Can also be a date string to\n",
" | parse or a datetime type.\n",
" | end : int, str, or datetime\n",
" | Zero-indexed observation number at which to end forecasting, ie.,\n",
" | the first forecast is start. Can also be a date string to\n",
" | parse or a datetime type. However, if the dates index does not\n",
" | have a fixed frequency, end must be an integer index if you\n",
" | want out of sample prediction.\n",
" | exog : array-like, optional\n",
" | If the model is an ARMAX and out-of-sample forecasting is\n",
" | requested, exog must be given. Note that you'll need to pass\n",
" | `k_ar` additional lags for any exogenous variables. E.g., if you\n",
" | fit an ARMAX(2, q) model and want to predict 5 steps, you need 7\n",
" | observations to do this.\n",
" | dynamic : bool, optional\n",
" | The `dynamic` keyword affects in-sample prediction. If dynamic\n",
" | is False, then the in-sample lagged values are used for\n",
" | prediction. If `dynamic` is True, then in-sample forecasts are\n",
" | used in place of lagged dependent variables. The first forecasted\n",
" | value is `start`.\n",
" | typ : str {'linear', 'levels'}\n",
" | \n",
" | - 'linear' : Linear prediction in terms of the differenced\n",
" | endogenous variables.\n",
" | - 'levels' : Predict the levels of the original endogenous\n",
" | variables.\n",
" | \n",
" | \n",
" | Returns\n",
" | -------\n",
" | predict : array\n",
" | The predicted values.\n",
" | \n",
" | \n",
" | \n",
" | Notes\n",
" | -----\n",
" | Use the results predict method instead.\n",
" | \n",
" | ----------------------------------------------------------------------\n",
" | Static methods defined here:\n",
" | \n",
" | __new__(cls, endog, order, exog=None, dates=None, freq=None, missing='none')\n",
" | Create and return a new object. See help(type) for accurate signature.\n",
" | \n",
" | ----------------------------------------------------------------------\n",
" | Methods inherited from ARMA:\n",
" | \n",
" | geterrors(self, params)\n",
" | Get the errors of the ARMA process.\n",
" | \n",
" | Parameters\n",
" | ----------\n",
" | params : array-like\n",
" | The fitted ARMA parameters\n",
" | order : array-like\n",
" | 3 item iterable, with the number of AR, MA, and exogenous\n",
" | parameters, including the trend\n",
" | \n",
" | hessian(self, params)\n",
" | Compute the Hessian at params,\n",
" | \n",
" | Notes\n",
" | -----\n",
" | This is a numerical approximation.\n",
" | \n",
" | loglike(self, params, set_sigma2=True)\n",
" | Compute the log-likelihood for ARMA(p,q) model\n",
" | \n",
" | Notes\n",
" | -----\n",
" | Likelihood used depends on the method set in fit\n",
" | \n",
" | loglike_css(self, params, set_sigma2=True)\n",
" | Conditional Sum of Squares likelihood function.\n",
" | \n",
" | loglike_kalman(self, params, set_sigma2=True)\n",
" | Compute exact loglikelihood for ARMA(p,q) model by the Kalman Filter.\n",
" | \n",
" | score(self, params)\n",
" | Compute the score function at params.\n",
" | \n",
" | Notes\n",
" | -----\n",
" | This is a numerical approximation.\n",
" | \n",
" | ----------------------------------------------------------------------\n",
" | Data descriptors inherited from statsmodels.tsa.base.tsa_model.TimeSeriesModel:\n",
" | \n",
" | exog_names\n",
" | \n",
" | ----------------------------------------------------------------------\n",
" | Methods inherited from statsmodels.base.model.LikelihoodModel:\n",
" | \n",
" | information(self, params)\n",
" | Fisher information matrix of model\n",
" | \n",
" | Returns -Hessian of loglike evaluated at params.\n",
" | \n",
" | initialize(self)\n",
" | Initialize (possibly re-initialize) a Model instance. For\n",
" | instance, the design matrix of a linear model may change\n",
" | and some things must be recomputed.\n",
" | \n",
" | ----------------------------------------------------------------------\n",
" | Class methods inherited from statsmodels.base.model.Model:\n",
" | \n",
" | from_formula(formula, data, subset=None, drop_cols=None, *args, **kwargs) from builtins.type\n",
" | Create a Model from a formula and dataframe.\n",
" | \n",
" | Parameters\n",
" | ----------\n",
" | formula : str or generic Formula object\n",
" | The formula specifying the model\n",
" | data : array-like\n",
" | The data for the model. See Notes.\n",
" | subset : array-like\n",
" | An array-like object of booleans, integers, or index values that\n",
" | indicate the subset of df to use in the model. Assumes df is a\n",
" | `pandas.DataFrame`\n",
" | drop_cols : array-like\n",
" | Columns to drop from the design matrix. Cannot be used to\n",
" | drop terms involving categoricals.\n",
" | args : extra arguments\n",
" | These are passed to the model\n",
" | kwargs : extra keyword arguments\n",
" | These are passed to the model with one exception. The\n",
" | ``eval_env`` keyword is passed to patsy. It can be either a\n",
" | :class:`patsy:patsy.EvalEnvironment` object or an integer\n",
" | indicating the depth of the namespace to use. For example, the\n",
" | default ``eval_env=0`` uses the calling namespace. If you wish\n",
" | to use a \"clean\" environment set ``eval_env=-1``.\n",
" | \n",
" | Returns\n",
" | -------\n",
" | model : Model instance\n",
" | \n",
" | Notes\n",
" | ------\n",
" | data must define __getitem__ with the keys in the formula terms\n",
" | args and kwargs are passed on to the model instantiation. E.g.,\n",
" | a numpy structured or rec array, a dictionary, or a pandas DataFrame.\n",
" | \n",
" | ----------------------------------------------------------------------\n",
" | Data descriptors inherited from statsmodels.base.model.Model:\n",
" | \n",
" | __dict__\n",
" | dictionary for instance variables (if defined)\n",
" | \n",
" | __weakref__\n",
" | list of weak references to the object (if defined)\n",
" | \n",
" | endog_names\n",
" | Names of endogenous variables\n",
"\n"
]
}
],
"source": [
"# I recommend you glance over this!\n",
"\n",
"# \n",
"help(ARIMA)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### p,d,q parameters\n",
"\n",
"* p: The number of lag observations included in the model.\n",
"* d: The number of times that the raw observations are differenced, also called the degree of differencing.\n",
"* q: The size of the moving average window, also called the order of moving average."
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" Statespace Model Results \n",
"==========================================================================================\n",
"Dep. Variable: Milk in pounds per cow No. Observations: 168\n",
"Model: SARIMAX(0, 1, 0)x(1, 1, 1, 12) Log Likelihood -534.065\n",
"Date: Thu, 13 Jul 2017 AIC 1074.131\n",
"Time: 00:16:10 BIC 1083.503\n",
"Sample: 01-01-1962 HQIC 1077.934\n",
" - 12-01-1975 \n",
"Covariance Type: opg \n",
"==============================================================================\n",
" coef std err z P>|z| [0.025 0.975]\n",
"------------------------------------------------------------------------------\n",
"ar.S.L12 -0.0449 0.106 -0.422 0.673 -0.253 0.163\n",
"ma.S.L12 -0.5860 0.102 -5.761 0.000 -0.785 -0.387\n",
"sigma2 55.5118 5.356 10.365 0.000 45.015 66.009\n",
"===================================================================================\n",
"Ljung-Box (Q): 33.48 Jarque-Bera (JB): 32.04\n",
"Prob(Q): 0.76 Prob(JB): 0.00\n",
"Heteroskedasticity (H): 0.69 Skew: 0.77\n",
"Prob(H) (two-sided): 0.18 Kurtosis: 4.60\n",
"===================================================================================\n",
"\n",
"Warnings:\n",
"[1] Covariance matrix calculated using the outer product of gradients (complex-step).\n"
]
}
],
"source": [
"# We have seasonal data!\n",
"model = sm.tsa.statespace.SARIMAX(df['Milk in pounds per cow'],order=(0,1,0), seasonal_order=(1,1,1,12))\n",
"results = model.fit()\n",
"print(results.summary())"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x1a11fc47fd0>"
]
},
"execution_count": 41,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nLYNdtS2D4GHWbJmK6iC
"text/plain": [
"<matplotlib.figure.Figure at 0x1a11ff65b70>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"results.resid.plot()"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x1a11fd9da20>"
]
},
"execution_count": 42,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nGLMWnGDM6hjvwdSZ5K+
"text/plain": [
"<matplotlib.figure.Figure at 0x1a11fcca160>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"results.resid.plot(kind='kde')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Prediction of Future Values\n",
"\n",
"Firts we can get an idea of how well our model performs by just predicting for values that we actually already know:"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x1a11ea87588>"
]
},
"execution_count": 43,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAtAAAAHjCAYAAAAKUSgCAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XmcY3Wd//vXyb4ntS+9A81Os4iAICA4CqI/HL0Oyrgh\n6jhzHZ15zG9w9KojMjpXZ/j9MaPXBUfFFfeHuKGiLIIi2GCDTQO901vtVUlV5WQ5Sc7945yTSlWn\nqpLKSXLSfp6Ph4+uTiWp012F/c4nn+/no+i6jhBCCCGEEKI2rnZfgBBCCCGEEJ1EArQQQgghhBB1\nkAAthBBCCCFEHSRACyGEEEIIUQcJ0EIIIYQQQtRBArQQQgghhBB1kAAthBBCCCFEHSRACyGEEEII\nUQcJ0EIIIYQQQtTB0+4LWE1vb6++efPmdl+GEEIIIYQ4gT3++OOTuq731XJfxwfozZs3s3379nZf\nhhBCCCGEOIEpivJ8rfeVFg4hhBBCCCHqIAFaCCGEEEKIOkiAFkIIIYQQog6O74GuRtM0jhw5Qjab\nbfeliBNEIBBg/fr1eL3edl+KEEIIIRyuIwP0kSNHiEajbN68GUVR2n05osPpus7U1BRHjhxhy5Yt\n7b4cIYQQQjjcqi0ciqJ8SVGUcUVRdlbc1q0oyr2Kouwxf+2q+NwHFEXZqyjKc4qiXFNx+wsURfmT\n+bn/VhpIvtlslp6eHgnPwhaKotDT0yPvaAghhBCiJrX0QN8JXLvktvcDv9Z1fSvwa/P3KIpyJvAG\n4CzzMZ9RFMVtPuazwDuBreb/lj5nXSQ8CzvJz5MQQggharVqgNZ1/TfA9JKbXw18xfz4K8BfVtz+\nLV3Xc7quHwD2AhcpijIExHRd/72u6zrw1YrHCCGEEEII0THWOoVjQNf1EfPjUWDA/HgdcLjifkfM\n29aZHy+9vSpFUf5GUZTtiqJsn5iYWOMlNpeiKLzpTW8q/75QKNDX18erXvUqAH70ox/xiU98AoBb\nb72V22+/HYCXvOQlqy6Gecc73sGuXbuadOX22Lx5M5OTk+2+DCGEEEKIlmv4EKGu67qiKLodF1Px\nnHcAdwBceOGFtj63XcLhMDt37iSTyRAMBrn33ntZt27hNcH111/P9ddfv6bn/p//+R+7LrPjFQoF\nPJ6OPOsqhBBCiBPUWpPJmKIoQ7quj5jtGePm7UeBDRX3W2/edtT8eOntDfvoj59m17FZO56q7Mzh\nGB/5X2eter/rrruOn/70p7zuda/jrrvu4sYbb+Shhx4C4M4772T79u18+tOfrvrYUqnEzTffzPr1\n6/nYxz626HMveclLuP3227nwwguJRCL8wz/8Az/5yU8IBoPcfffdDAwMLLr/rbfeyr59+9i7dy+T\nk5O8733v453vfCe6rvO+972Pe+65B0VR+NCHPsTrX/96HnjgAW6//XZ+8pOfAPD3f//3XHjhhdx0\n001s3ryZt771rfz4xz9G0zS++93vcvrppzM1NcWNN97I0aNHedGLXoTRiQPpdJobbriBI0eOUCwW\n+fCHP8zrX//64/485557Lg8++CCFQoEvfelLXHTRRaTTad7znvewc+dONE3j1ltv5dWvfjV33nkn\nP/jBD5ifn6dYLPLggw8uer6vfvWr3H777SiKwrZt2/ja177GwYMHufnmm5mcnKSvr48vf/nLrFu3\njlNOOYX9+/eTSqXo6enh/vvv54orruCKK67gi1/8Ilu3bl31+yyEEEIIUWmtLRw/At5qfvxW4O6K\n29+gKIpfUZQtGIcFHzPbPWYVRbnEnL7xlorHdKw3vOENfOtb3yKbzfLUU09x8cUX1/S4QqHAG9/4\nRrZu3XpceF4qnU5zySWX8OSTT3LFFVfwhS98oer9nnrqKe677z4eeeQRbrvtNo4dO8YPfvADduzY\nwZNPPsmvfvUrbrnlFkZGRqo+vlJvby9PPPEEf/d3f1duPfnoRz/Ki1/8Yp5++mle85rXcOjQIQB+\n/vOfMzw8zJNPPsnOnTu59trqZ0NVVWXHjh185jOf4eabbwbg4x//OFdffTWPPfYY999/P7fccgvp\ndBqAJ554gu9973vHheenn36aj33sY9x33308+eST/Nd//RcA73nPe3jrW9/KU089xRvf+Ebe+973\n4na7Oe2009i1axcPP/wwF1xwAQ899BC5XI7Dhw9LeBZCCCHEmqxagVYU5S7gJUCvoihHgI8AnwC+\noyjK24HngRsAdF1/WlGU7wC7gALwbl3Xi+ZT/d8YEz2CwD3m/xpWS6W4WbZt28bBgwe56667uO66\n62p+3Lve9S5uuOEGPvjBD656X5/PV+6rfsELXsC9995b9X6vfvWrCQaDBINBrrrqKh577DEefvhh\nbrzxRtxuNwMDA1x55ZX84Q9/IBaLrfg1X/va15a/3g9+8AMAfvOb35Q/fuUrX0lXlzG58JxzzuF/\n/+//zb/8y7/wqle9issvv7zqc954440AXHHFFczOzpJMJvnlL3/Jj370o3JIz2az5WD+spe9jO7u\n7uOe57777uOv/uqv6O3tBSjf55FHHilf35vf/Gbe9773AXD55Zfzm9/8hgMHDvCBD3yAL3zhC1x5\n5ZW88IUvXPHvQAghhBBiObVM4bhR1/UhXde9uq6v13X9i7quT+m6/lJd17fquv4Xuq5PV9z/47qu\nn6zr+mm6rt9Tcft2XdfPNj/397rVA9Dhrr/+ev75n/+5HBBrcemll3L//ffXNHfY6/WWR6y53W4K\nhULV+y0dw7bSWDaPx0OpVCr/ful1+P3+Vb+e5dRTT+WJJ57gnHPO4UMf+hC33XZbzden6zrf//73\n2bFjBzt27ODQoUOcccYZgNFjbocrrriChx56iMcee4zrrruOZDLJAw88sGzQF0IIIYRYzVpbOITp\n5ptv5iMf+QjnnHNOzY95+9vfznXXXccNN9ywakCt1d133002m2VqaooHHniAF77whVx++eV8+9vf\nplgsMjExwW9+8xsuuugiNm3axK5du8jlciSTSX7961+v+vxXXHEF3/zmNwG45557mJmZAeDYsWOE\nQiHe9KY3ccstt/DEE09Uffy3v/1tAB5++GHi8TjxeJxrrrmGT33qU+V+6j/+8Y+rXsfVV1/Nd7/7\nXaampgCYnjZeu1166aV861vfAuAb3/hGOSBfdNFF/O53v8PlchEIBDjvvPP4/Oc/zxVXXLHq1xJC\nCCGEqEbGGzRo/fr1vPe97637cf/0T/9EKpXizW9+M9/4xjdwuRp7LbNt2zauuuoqJicn+fCHP8zw\n8DCvec1reOSRRzj33HNRFIX/+I//YHBwEIAbbriBs88+my1btnD++eev+vwf+chHuPHGGznrrLO4\n9NJL2bhxIwB/+tOfuOWWW3C5XHi9Xj772c9WfXwgEOD8889H0zS+9KUvAfDhD3+Yf/zHf2Tbtm2U\nSiW2bNlSPti4nLPOOosPfvCDXHnllbjdbs4//3zuvPNOPvWpT/G2t72N//zP/ywfIgSjmr5hwwYu\nueQSwGjpuOuuu+p6wSOEEEIIUUlxeifFhRdeqC+dm/zMM8+U3+oXxhSOSCTCP//zP7f7UqqqnCri\nZPJzJYQQQvz5UhTlcV3Xawor0sIhhBBCCCGc5fE74b8vgIozW04iLRwngFtvvbXdl7CiBx54oN2X\nIIQQQohOMroTpvdB6hB0bW731RxHKtBCCCGEEMJZMsawAiaea+91LEMCtBBCCCGEcBYrQI8/097r\nWIYEaCGEEEII4SxSgRZCCCGEEKIO5QAtFegTyn//939zxhln8MY3vrHdl8KOHTv42c9+1u7LEEII\nIYSwRzlA73bkJA4J0Gv0mc98hnvvvZdvfOMbq97Xrm2Dy5EALYQQQogTRqkI2RREBkBLQ+pwu6/o\nOJ0/xu6e98Pon+x9zsFz4BWfWPbTf/u3f8v+/ft5xStewU033cRDDz3E/v37CYVC3HHHHWzbto1b\nb72Vffv2sX//fjZu3Mj
"text/plain": [
"<matplotlib.figure.Figure at 0x1a11e9f2160>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df['forecast'] = results.predict(start = 150, end= 168, dynamic= True) \n",
"df[['Milk in pounds per cow','forecast']].plot(figsize=(12,8))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Forecasting\n",
"This requires more time periods, so let's create them with pandas onto our original dataframe!"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style>\n",
" .dataframe thead tr:only-child th {\n",
" text-align: right;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Milk in pounds per cow</th>\n",
" <th>Milk First Difference</th>\n",
" <th>Milk Second Difference</th>\n",
" <th>Seasonal Difference</th>\n",
" <th>Seasonal First Difference</th>\n",
" <th>forecast</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Month</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1975-08-01</th>\n",
" <td>858.0</td>\n",
" <td>-38.0</td>\n",
" <td>3.0</td>\n",
" <td>-9.0</td>\n",
" <td>3.0</td>\n",
" <td>879.668789</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1975-09-01</th>\n",
" <td>817.0</td>\n",
" <td>-41.0</td>\n",
" <td>-3.0</td>\n",
" <td>2.0</td>\n",
" <td>11.0</td>\n",
" <td>832.328247</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1975-10-01</th>\n",
" <td>827.0</td>\n",
" <td>10.0</td>\n",
" <td>51.0</td>\n",
" <td>15.0</td>\n",
" <td>13.0</td>\n",
" <td>837.721945</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1975-11-01</th>\n",
" <td>797.0</td>\n",
" <td>-30.0</td>\n",
" <td>-40.0</td>\n",
" <td>24.0</td>\n",
" <td>9.0</td>\n",
" <td>802.452364</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1975-12-01</th>\n",
" <td>843.0</td>\n",
" <td>46.0</td>\n",
" <td>76.0</td>\n",
" <td>30.0</td>\n",
" <td>6.0</td>\n",
" <td>842.499524</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Milk in pounds per cow Milk First Difference \\\n",
"Month \n",
"1975-08-01 858.0 -38.0 \n",
"1975-09-01 817.0 -41.0 \n",
"1975-10-01 827.0 10.0 \n",
"1975-11-01 797.0 -30.0 \n",
"1975-12-01 843.0 46.0 \n",
"\n",
" Milk Second Difference Seasonal Difference \\\n",
"Month \n",
"1975-08-01 3.0 -9.0 \n",
"1975-09-01 -3.0 2.0 \n",
"1975-10-01 51.0 15.0 \n",
"1975-11-01 -40.0 24.0 \n",
"1975-12-01 76.0 30.0 \n",
"\n",
" Seasonal First Difference forecast \n",
"Month \n",
"1975-08-01 3.0 879.668789 \n",
"1975-09-01 11.0 832.328247 \n",
"1975-10-01 13.0 837.721945 \n",
"1975-11-01 9.0 802.452364 \n",
"1975-12-01 6.0 842.499524 "
]
},
"execution_count": 44,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.tail()"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# https://pandas.pydata.org/pandas-docs/stable/timeseries.html\n",
"# Alternatives \n",
"# pd.date_range(df.index[-1],periods=12,freq='M')"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from pandas.tseries.offsets import DateOffset"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"future_dates = [df.index[-1] + DateOffset(months=x) for x in range(0,24) ]"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[Timestamp('1975-12-01 00:00:00'),\n",
" Timestamp('1976-01-01 00:00:00'),\n",
" Timestamp('1976-02-01 00:00:00'),\n",
" Timestamp('1976-03-01 00:00:00'),\n",
" Timestamp('1976-04-01 00:00:00'),\n",
" Timestamp('1976-05-01 00:00:00'),\n",
" Timestamp('1976-06-01 00:00:00'),\n",
" Timestamp('1976-07-01 00:00:00'),\n",
" Timestamp('1976-08-01 00:00:00'),\n",
" Timestamp('1976-09-01 00:00:00'),\n",
" Timestamp('1976-10-01 00:00:00'),\n",
" Timestamp('1976-11-01 00:00:00'),\n",
" Timestamp('1976-12-01 00:00:00'),\n",
" Timestamp('1977-01-01 00:00:00'),\n",
" Timestamp('1977-02-01 00:00:00'),\n",
" Timestamp('1977-03-01 00:00:00'),\n",
" Timestamp('1977-04-01 00:00:00'),\n",
" Timestamp('1977-05-01 00:00:00'),\n",
" Timestamp('1977-06-01 00:00:00'),\n",
" Timestamp('1977-07-01 00:00:00'),\n",
" Timestamp('1977-08-01 00:00:00'),\n",
" Timestamp('1977-09-01 00:00:00'),\n",
" Timestamp('1977-10-01 00:00:00'),\n",
" Timestamp('1977-11-01 00:00:00')]"
]
},
"execution_count": 48,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"future_dates"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"future_dates_df = pd.DataFrame(index=future_dates[1:],columns=df.columns)"
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"future_df = pd.concat([df,future_dates_df])"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style>\n",
" .dataframe thead tr:only-child th {\n",
" text-align: right;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Milk in pounds per cow</th>\n",
" <th>Milk First Difference</th>\n",
" <th>Milk Second Difference</th>\n",
" <th>Seasonal Difference</th>\n",
" <th>Seasonal First Difference</th>\n",
" <th>forecast</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1962-01-01</th>\n",
" <td>589.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1962-02-01</th>\n",
" <td>561.0</td>\n",
" <td>-28.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1962-03-01</th>\n",
" <td>640.0</td>\n",
" <td>79.0</td>\n",
" <td>107.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1962-04-01</th>\n",
" <td>656.0</td>\n",
" <td>16.0</td>\n",
" <td>-63.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1962-05-01</th>\n",
" <td>727.0</td>\n",
" <td>71.0</td>\n",
" <td>55.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Milk in pounds per cow Milk First Difference \\\n",
"1962-01-01 589.0 NaN \n",
"1962-02-01 561.0 -28.0 \n",
"1962-03-01 640.0 79.0 \n",
"1962-04-01 656.0 16.0 \n",
"1962-05-01 727.0 71.0 \n",
"\n",
" Milk Second Difference Seasonal Difference \\\n",
"1962-01-01 NaN NaN \n",
"1962-02-01 NaN NaN \n",
"1962-03-01 107.0 NaN \n",
"1962-04-01 -63.0 NaN \n",
"1962-05-01 55.0 NaN \n",
"\n",
" Seasonal First Difference forecast \n",
"1962-01-01 NaN NaN \n",
"1962-02-01 NaN NaN \n",
"1962-03-01 NaN NaN \n",
"1962-04-01 NaN NaN \n",
"1962-05-01 NaN NaN "
]
},
"execution_count": 51,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"future_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style>\n",
" .dataframe thead tr:only-child th {\n",
" text-align: right;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Milk in pounds per cow</th>\n",
" <th>Milk First Difference</th>\n",
" <th>Milk Second Difference</th>\n",
" <th>Seasonal Difference</th>\n",
" <th>Seasonal First Difference</th>\n",
" <th>forecast</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1977-07-01</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1977-08-01</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1977-09-01</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1977-10-01</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1977-11-01</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Milk in pounds per cow Milk First Difference \\\n",
"1977-07-01 NaN NaN \n",
"1977-08-01 NaN NaN \n",
"1977-09-01 NaN NaN \n",
"1977-10-01 NaN NaN \n",
"1977-11-01 NaN NaN \n",
"\n",
" Milk Second Difference Seasonal Difference \\\n",
"1977-07-01 NaN NaN \n",
"1977-08-01 NaN NaN \n",
"1977-09-01 NaN NaN \n",
"1977-10-01 NaN NaN \n",
"1977-11-01 NaN NaN \n",
"\n",
" Seasonal First Difference forecast \n",
"1977-07-01 NaN NaN \n",
"1977-08-01 NaN NaN \n",
"1977-09-01 NaN NaN \n",
"1977-10-01 NaN NaN \n",
"1977-11-01 NaN NaN "
]
},
"execution_count": 52,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"future_df.tail()"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x1a11ed43fd0>"
]
},
"execution_count": 53,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAtAAAAHVCAYAAADYcsyyAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvXmYZHV99v05te+9b7MPDLIPICMoyihuKDG4vAnK5U40\nJo9R80bx0VeMSPR6TMKT5030csGouAUNyiuIERXZI4IDzsDMoDAzMPvSa1V313aq6rx/nHOqq7ur\nqqurztbM93NdXNVTU1Xzm+pi+q677u/9VTRNQxAEQRAEQRCE1vC5fQBBEARBEARBWEmIgBYEQRAE\nQRCEZSACWhAEQRAEQRCWgQhoQRAEQRAEQVgGIqAFQRAEQRAEYRmIgBYEQRAEQRCEZSACWhAEQRAE\nQRCWgQhoQRAEQRAEQVgGIqAFQRAEQRAEYRkE3D7AUvT392sbNmxw+xiCIAiCIAjC85jHHntsTNO0\ngVZu63kBvWHDBrZt2+b2MQRBEARBEITnMYqi7G/1thLhEARBEARBEIRlIAJaEARBEARBEJaBCGhB\nEARBEARBWAaez0DXQ1VVDh06RD6fd/sowvOESCTCmjVrCAaDbh9FEARBEASPsyIF9KFDh0gmk2zY\nsAFFUdw+jrDC0TSN8fFxDh06xMaNG90+jiAIgiAIHmdFRjjy+Tx9fX0ingVLUBSFvr4++URDEARB\nEISWWJECGhDxLFiKvJ4EQRAEQWiVFSugBUEQBEEQBMENREC3iaIovOMd76j+ulQqMTAwwBve8AYA\n7rjjDr7whS8AcP3113PjjTcC8IpXvGLJxTDve9/72L17t00nt4YNGzYwNjbm9jEEQRAEQRAcZ0UO\nEXqBeDzOzp07yeVyRKNRfvWrX7F69erq71955ZVceeWVbT32v//7v1t1zBVPqVQiEJCXqSAIgiAI\n3mHFK5PP/nQXu49kLH3Ms1al+Myfnr3k7a644gp+9rOf8Wd/9mfccsstXH311Tz44IMA3HzzzWzb\nto0vfelLde9bqVS45pprWLNmDZ/73Ofm/d4rXvEKbrzxRrZs2UIikeAjH/kId955J9FolNtvv52h\noaF5t7/++uvZu3cve/bsYWxsjI9//OO8//3vR9M0Pv7xj/Pzn/8cRVG47rrreOtb38p9993HjTfe\nyJ133gnA3/zN37Blyxbe8573sGHDBt797nfz05/+FFVVufXWWznjjDMYHx/n6quv5vDhw7zkJS9B\n0zQAZmdnueqqqzh06BDlcplPf/rTvPWtb1309znvvPO4//77KZVKfPOb3+Siiy5idnaWD33oQ+zc\nuRNVVbn++ut54xvfyM0338xtt93GzMwM5XKZ+++/f97jfec73+HGG29EURQ2b97Md7/7XZ577jmu\nueYaxsbGGBgY4Fvf+harV69m06ZN7Nu3j3Q6TV9fH/feey9bt25l69atfOMb3+C0005b8vssCIIg\nCIJQi0Q4OuBtb3sbP/jBD8jn8zzxxBNcfPHFLd2vVCrx9re/ndNOO22ReF7I7OwsL37xi9mxYwdb\nt27l61//et3bPfHEE9xzzz08/PDD3HDDDRw5coTbbruN7du3s2PHDu6++26uvfZajh49uuT5+vv7\nefzxx/nrv/7ravTks5/9LC972cvYtWsXb37zmzlw4AAAd911F6tWrWLHjh3s3LmT173udXUfM5vN\nsn37dr785S9zzTXXAPD5z3+eV77ylTz66KPce++9XHvttczOzgLw+OOP86Mf/WiReN61axef+9zn\nuOeee9ixYwf/+q//CsCHPvQh3v3ud/PEE0/w9re/nQ9/+MP4/X5OP/10du/ezUMPPcQLX/hCHnzw\nQQqFAgcPHhTxLAiCIAhCW6x4B7oVp9guNm/ezHPPPcctt9zCFVdc0fL9PvCBD3DVVVfxqU99asnb\nhkKhaq76wgsv5Fe/+lXd273xjW8kGo0SjUa57LLLePTRR3nooYe4+uqr8fv9DA0N8fKXv5zf/e53\npFKppn/mW97yluqfd9tttwHwwAMPVL/+kz/5E3p6egA499xz+ehHP8r//J//kze84Q1ceumldR/z\n6quvBmDr1q1kMhmmpqb45S9/yR133FEV6fl8virMX/Oa19Db27voce655x7+/M//nP7+foDqbR5+\n+OHq+d75znfy8Y9/HIBLL72UBx54gGeffZZPfvKTfP3rX+flL385L3rRi5o+B4IgCIIgCI0QB7pD\nrrzySj72sY9VBWIrXHLJJdx7770t9Q4Hg8FqxZrf76dUKtW93cIatma1bIFAgEqlUv31wnOEw+El\n/zyTF7zgBTz++OOce+65XHfdddxwww0tn0/TNH784x+zfft2tm/fzoEDBzjzzDMBPWNuBVu3buXB\nBx/k0Ucf5YorrmBqaor77ruvodAXBEEQBEFYChHQHXLNNdfwmc98hnPPPbfl+/zFX/wFV1xxBVdd\nddWSArVVbr/9dvL5POPj49x333286EUv4tJLL+WHP/wh5XKZ0dFRHnjgAS666CLWr1/P7t27KRQK\nTE1N8etf/3rJx9+6dSv/8R//AcDPf/5zJicnAThy5AixWIx3vOMdXHvttTz++ON17//DH/4QgIce\neoiuri66urq4/PLL+eIXv1jNU//+979f8hyvfOUrufXWWxkfHwdgYmIC0N+U/OAHPwDg+9//flUg\nX3TRRfzmN7/B5/MRiUQ4//zz+drXvsbWrVuX/LMEQRAEQRDqseIjHG6zZs0aPvzhDy/7fn/3d39H\nOp3mne98J9///vfx+Tp7L7N582Yuu+wyxsbG+PSnP82qVat485vfzMMPP8x5552Hoij80z/9E8PD\nwwBcddVVnHPOOWzcuJELLrhgycf/zGc+w9VXX83ZZ5/NJZdcwrp16wB48sknufbaa/H5fASDQb7y\nla/UvX8kEuGCCy5AVVW++c1vAvDpT3+av/3bv2Xz5s1UKhU2btxYHWxsxNlnn82nPvUpXv7yl+P3\n+7ngggu4+eab+eIXv8h73/te/vmf/7k6RAi6m7527Vpe/OIXA3qk45ZbblnWGx5BEARBEIRaFNP9\n8ypbtmzRFvYmP/XUU9WP+gW9hSORSPCxj33M7aPUpbZVxMvI60oQBEEQTl4URXlM07SWxIpEOARB\nEARBEISVw4P/Av/+alePIBGO5wHXX3+920doyn333ef2EQRBEARBeL5wfCcc+h0UZyFkTenAchEH\nWhAEQRAEQVg55Kb0y/G9rh1BBLQgCIIgCIKwcsibAvoZ144gAloQBEEQBEFYOZgO9Nge144gAloQ\nBEEQBEFYOYgDvXL5t3/7N84880ze/va3u30Utm/fzn/913+5fQxBEARBEAR70bQaB9o9AS0tHG3y\n5S9/mbvvvps1a9YsedtSqUQgYN9TvX37drZt28YVV1xh258hCIIgCILgOsUZ0Mqg+PUhQk0DRXH8\nGCtfQP/8E3DsSWsfc/hceP0XGv72X/3VX7Fv3z5e//rX8573vIcHH3yQffv2EYvFuOmmm9i8eTPX\nX389e/fuZd++faxbt47vfe97fOITn+C+++6jUCjwwQ9+kA984AMA/OM//iPf+9738Pl8vP71r+cL\nX/gCX//617npppsoFots2rSJ7373u8RiMW699VY++9nP4vf76erq4u677+bv//7vyeVyPPTQQ3zy\nk5/krW99q7XPhyAIgiAIghcw3eehs3T9N3McksOOH2PlC2gX+OpXv8pdd93Fvffey2c/+1kuuOAC\nfvKTn3DPPffwrne9i+3btwOwe/duHnroIaLRKDfddBNdXV387ne/o1Ao8NKXvpTXvva1/OEPf+D2\n22/nkUceIRaLMTExAcBb3vIW3v/+9wNw3XXX8Y1vfIMPfehD3HDDDfziF79g9erVTE1NEQqFuOGG\nG9i2bRtf+tKXXHtOBEEQBEEQbCef1i/XvEgX0GPPiIBuiyZOsRM89NBD/PjHPwbgla98JePj42Qy\nGQCuvPJKotEoAL/85S9
"text/plain": [
"<matplotlib.figure.Figure at 0x1a11eace390>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"future_df['forecast'] = results.predict(start = 168, end = 188, dynamic= True) \n",
"future_df[['Milk in pounds per cow', 'forecast']].plot(figsize=(12, 8)) "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Not bad! Pretty cool in fact! I hope this helped you see the potential for ARIMA models, unfortunately a lot of financial data won't follow this sort of behaviour, in fact it will often follow something indicating brownian motion, what is that you ask? Well head on over to the next video section and we'll find out!\n",
"\n",
"# Great Job!"
]
}
],
"metadata": {
"anaconda-cloud": {},
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.1"
}
},
"nbformat": 4,
"nbformat_minor": 1
}