j1-template 2022.1.3 → 2022.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/_layouts/default.html +2 -1
  3. data/_layouts/notebook.html +68 -0
  4. data/assets/data/jupyter/notebooks/climate-change-forecast.html +797 -0
  5. data/assets/data/jupyter/notebooks/climate-change-forecast.ipynb +709 -0
  6. data/assets/data/jupyter/notebooks/interactive.html +268 -0
  7. data/assets/data/jupyter/notebooks/interactive.ipynb +212 -0
  8. data/assets/data/jupyter/notebooks/odes-in-python.html +557 -0
  9. data/assets/data/jupyter/notebooks/odes-in-python.ipynb +14825 -0
  10. data/assets/data/jupyter/notebooks/odes-selected.html +122 -0
  11. data/assets/data/jupyter/notebooks/odes-selected.ipynb +14427 -0
  12. data/assets/themes/j1/adapter/js/nbinteract.js +442 -0
  13. data/assets/themes/j1/adapter/js/scroller.js +0 -2
  14. data/assets/themes/j1/core/css/nbinteract-tutorial/styles.css +1711 -0
  15. data/assets/themes/j1/core/css/nbinteract-tutorial/styles.min.css +1 -0
  16. data/assets/themes/j1/core/css/themes/bootstrap/bootstrap.min.css +1 -1
  17. data/assets/themes/j1/core/css/themes/theme_vapor/bootstrap.min.css +1 -1
  18. data/assets/themes/j1/core/css/themes/unodark/bootstrap.min.css +1 -1
  19. data/assets/themes/j1/core/css/themes/unolight/bootstrap.min.css +1 -1
  20. data/assets/themes/j1/modules/nbInteract/css/nbinteract/nbinteract-core.css +179 -0
  21. data/assets/themes/j1/modules/nbInteract/css/nbinteract/nbinteract-core.min.css +15 -0
  22. data/assets/themes/j1/modules/nbInteract/js/mathjax/latest.js +19 -0
  23. data/assets/themes/j1/modules/nbInteract/js/mathjax/tex-chtml-full.js +34 -0
  24. data/assets/themes/j1/modules/nbInteract/js/mathjax/tex-chtml.js +1 -0
  25. data/assets/themes/j1/modules/nbInteract/js/mathjax/tex-mml-chtml.js +1 -0
  26. data/assets/themes/j1/modules/nbInteract/js/nbinteract/_new/nbinteract-core.js +108 -0
  27. data/assets/themes/j1/modules/nbInteract/js/nbinteract/_new/nbinteract-core.js.map +1 -0
  28. data/assets/themes/j1/modules/nbInteract/js/nbinteract/_new/nbinteract-core.min.js +108 -0
  29. data/assets/themes/j1/modules/nbInteract/js/nbinteract/_old/index.bundle.js.map +1 -0
  30. data/assets/themes/j1/modules/nbInteract/js/nbinteract/_old/nbinteract-core.js +92 -0
  31. data/assets/themes/j1/modules/nbInteract/js/nbinteract/nbinteract-core.js +94 -0
  32. data/assets/themes/j1/modules/nbInteract/js/nbinteract/nbinteract-core.js.map +1 -0
  33. data/assets/themes/j1/modules/spinner/css/spin.css +57 -0
  34. data/assets/themes/j1/modules/spinner/css/spin.min.css +19 -0
  35. data/assets/themes/j1/modules/spinner/js/spin.js +220 -0
  36. data/assets/themes/j1/modules/spinner/js/spin.min.js +19 -0
  37. data/lib/j1/version.rb +1 -1
  38. data/lib/starter_web/Gemfile +1 -1
  39. data/lib/starter_web/_config.yml +1 -1
  40. data/lib/starter_web/_data/modules/defaults/notebooks.yml +41 -0
  41. data/lib/starter_web/_data/modules/notebooks.yml +130 -0
  42. data/lib/starter_web/_data/resources.yml +29 -1
  43. data/lib/starter_web/_includes/attributes.asciidoc +4 -0
  44. data/lib/starter_web/_includes/tables/jekyll_variables.asciidoc +1 -1
  45. data/lib/starter_web/_includes/tables/template_variables.asciidoc +3 -3
  46. data/lib/starter_web/_plugins/asciidoctor-extensions/nodebook-block.rb +44 -0
  47. data/lib/starter_web/_plugins/filters.rb +4 -1
  48. data/lib/starter_web/_plugins/lunr_index.rb +1 -1
  49. data/lib/starter_web/_plugins/prettify.rb +0 -1
  50. data/lib/starter_web/assets/images/badges/docsBinder.png +0 -0
  51. data/lib/starter_web/assets/images/badges/myBinder.png +0 -0
  52. data/lib/starter_web/assets/images/badges/scaleable/binder.svg +2 -0
  53. data/lib/starter_web/assets/images/badges/scaleable/docsBinder.svg +138 -0
  54. data/lib/starter_web/assets/images/badges/scaleable/myBinder.svg +147 -0
  55. data/lib/starter_web/assets/images/pages/nbinteract/binderhub-architecture.jpg +0 -0
  56. data/lib/starter_web/assets/images/pages/nbinteract/binderhub-architecture.png +0 -0
  57. data/lib/starter_web/assets/images/pages/nbinteract/jupyterlab-architecture.jpg +0 -0
  58. data/lib/starter_web/package.json +1 -1
  59. data/lib/starter_web/pages/public/jupyter/binderhub-api.adoc +522 -0
  60. data/lib/starter_web/pages/public/jupyter/climate-change.adoc +90 -0
  61. data/lib/starter_web/pages/public/jupyter/interactive.adoc +96 -0
  62. data/lib/starter_web/pages/public/jupyter/jupyterlab-services.adoc +224 -0
  63. data/lib/starter_web/pages/public/jupyter/nbinteract.adoc +170 -0
  64. data/lib/starter_web/pages/public/jupyter/odes-selected.adoc +90 -0
  65. data/lib/starter_web/pages/public/jupyter/tutorial_interact.adoc +90 -0
  66. data/lib/starter_web/utilsrv/_defaults/package.json +2 -2
  67. data/lib/starter_web/utilsrv/package.json +2 -2
  68. metadata +49 -2
@@ -0,0 +1,797 @@
1
+ <div class="cell text_cell">
2
+ <button class="js-nbinteract-widget">
3
+ Loading widgets...
4
+ </button>
5
+ </div>
6
+
7
+
8
+
9
+ <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
10
+ <div class="text_cell_render border-box-sizing rendered_html">
11
+ <h1 id="Time-Series-Modeling">Time Series Modeling<a class="anchor-link" href="#Time-Series-Modeling">&#182;</a></h1><p>There are several things that are time dependent, I mean, today's values can have an effective relationship to values that have occurred in the past.</p>
12
+ <p>Some examples related to the subject are demand of products during a certain period, harvest of commodities, stock prices and of course what we will try to predict, the climate change in Rio De Janeiro.</p>
13
+ <p>Currently there are several types of time series forecast models, in this notebook I will try to use <a href="https://en.wikipedia.org/wiki/Autoregressive_integrated_moving_average">Seasonal ARIMA Models</a></p>
14
+ <p>First we need to import the essential libraries:</p>
15
+
16
+ </div>
17
+ </div>
18
+ </div>
19
+
20
+
21
+
22
+ <div class="
23
+ cell border-box-sizing code_cell rendered">
24
+ <div class="input">
25
+
26
+ <div class="inner_cell">
27
+ <div class="input_area">
28
+ <div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
29
+ <span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span>
30
+ <span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span>
31
+ <span class="kn">import</span> <span class="nn">seaborn</span> <span class="k">as</span> <span class="nn">sns</span>
32
+ <span class="kn">import</span> <span class="nn">statsmodels.api</span> <span class="k">as</span> <span class="nn">sm</span>
33
+ <span class="kn">from</span> <span class="nn">statsmodels.tsa.stattools</span> <span class="kn">import</span> <span class="n">adfuller</span>
34
+ <span class="kn">from</span> <span class="nn">statsmodels.graphics.tsaplots</span> <span class="kn">import</span> <span class="n">plot_acf</span><span class="p">,</span> <span class="n">plot_pacf</span>
35
+ <span class="c1"># from sklearn.metrics import mean_squared_error</span>
36
+ <span class="kn">from</span> <span class="nn">math</span> <span class="kn">import</span> <span class="n">sqrt</span>
37
+ <span class="kn">import</span> <span class="nn">warnings</span>
38
+ <span class="n">warnings</span><span class="o">.</span><span class="n">filterwarnings</span><span class="p">(</span><span class="s1">&#39;ignore&#39;</span><span class="p">)</span>
39
+ <span class="o">%</span><span class="k">matplotlib</span> inline
40
+ </pre></div>
41
+
42
+ </div>
43
+ </div>
44
+ </div>
45
+
46
+ </div>
47
+
48
+
49
+
50
+ <div class="
51
+ cell border-box-sizing code_cell rendered">
52
+ <div class="input">
53
+
54
+ <div class="inner_cell">
55
+ <div class="input_area">
56
+ <div class=" highlight hl-ipython3"><pre><span></span><span class="c1"># Reading and transforming the data file</span>
57
+ <span class="n">url</span><span class="o">=</span><span class="s2">&quot;https://github.com/jekyll-one/nbinteract-notebooks/raw/main/data/GlobalLandTemperaturesByMajorCity.csv.zip&quot;</span>
58
+ <span class="n">cities</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_csv</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
59
+ <span class="c1">#cities = pd.read_csv(&#39;../input/earth-surface-temperature-data/GlobalLandTemperaturesByCity.csv.zip&#39;)</span>
60
+ <span class="n">rio</span> <span class="o">=</span> <span class="n">cities</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="n">cities</span><span class="p">[</span><span class="s1">&#39;City&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;Rio De Janeiro&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;dt&#39;</span><span class="p">,</span><span class="s1">&#39;AverageTemperature&#39;</span><span class="p">]]</span>
61
+ <span class="n">rio</span><span class="o">.</span><span class="n">columns</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;Date&#39;</span><span class="p">,</span><span class="s1">&#39;Temp&#39;</span><span class="p">]</span>
62
+ <span class="n">rio</span><span class="p">[</span><span class="s1">&#39;Date&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">to_datetime</span><span class="p">(</span><span class="n">rio</span><span class="p">[</span><span class="s1">&#39;Date&#39;</span><span class="p">])</span>
63
+ <span class="n">rio</span><span class="o">.</span><span class="n">reset_index</span><span class="p">(</span><span class="n">drop</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">inplace</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
64
+ <span class="n">rio</span><span class="o">.</span><span class="n">set_index</span><span class="p">(</span><span class="s1">&#39;Date&#39;</span><span class="p">,</span> <span class="n">inplace</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
65
+
66
+ <span class="c1">#I&#39;m going to consider the temperature just from 1900 until the end of 2012</span>
67
+ <span class="n">rio</span> <span class="o">=</span> <span class="n">rio</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="s1">&#39;1900&#39;</span><span class="p">:</span><span class="s1">&#39;2013-01-01&#39;</span><span class="p">]</span>
68
+ <span class="n">rio</span> <span class="o">=</span> <span class="n">rio</span><span class="o">.</span><span class="n">asfreq</span><span class="p">(</span><span class="s1">&#39;M&#39;</span><span class="p">,</span> <span class="n">method</span><span class="o">=</span><span class="s1">&#39;bfill&#39;</span><span class="p">)</span>
69
+ <span class="n">rio</span><span class="o">.</span><span class="n">head</span><span class="p">()</span>
70
+ </pre></div>
71
+
72
+ </div>
73
+ </div>
74
+ </div>
75
+
76
+ </div>
77
+ <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
78
+ <div class="text_cell_render border-box-sizing rendered_html">
79
+ <p>Below I'll try to make a brief explanation about ARIMA models:</p>
80
+ <h1><font color=green>SARIMA Model (p, d, q)(P, D, Q, S)</font>:</h1>
81
+ <p>SARIMA stands for Seasonal Auto Regressive Integrated Moving Average, The name scares, but this is not as scary as it seems.</p>
82
+ <h2><font color=green>Non seasonal ARIMA</font>:</h2>
83
+ <p>We can split the Arima term into three terms, AR, I, MA:</p>
84
+ <ul>
85
+ <li><p><strong>AR(p)</strong> stands for <em>autoregressive model</em>, the <code>p</code> parameter is an integer that confirms how many lagged series are going to be used to forecast periods ahead, example:</p>
86
+ <ul>
87
+ <li>The average temperature of yesterday has a high correlation with the temperature of today, so we will use AR(1) parameter to forecast future temperatures.</li>
88
+ <li>The formula for the AR(p) model is: $\hat{y}_{t} = \mu + \theta_{1}Y_{t-1} + ... + \theta_{p}Y_{t-p}$ Where $\mu$ is the constant term, the <strong>p</strong> is the periods to be used in the regression and $\theta$ is the parameter fitted to the data.</li>
89
+ </ul>
90
+ </li>
91
+ <li><p><strong>I(d)</strong> is the differencing part, the <code>d</code> parameter tells how many differencing orders are going to be used, it tries to make the series stationary, example:</p>
92
+ <ul>
93
+ <li>Yesterday I sold 10 items of a product, today I sold 14, the "I" in this case is just the first difference, which is +4, if you are using logarithm base this difference is equivalent to percentual difference. </li>
94
+ <li>If d = 1: $y_{t} = Y_{t} - Y_{t-1}$ where $y_{t}$ is the differenced series and $Y_{t-period}$ is the original series</li>
95
+ <li>If d = 2: $y_{t} = (Y_{t} - Y_{t-1}) - (Y_{t-1} - Y_{t-2}) = Y_{t} - 2Y_{t-1} + Y_{t-2}$</li>
96
+ <li>Note that the second difference is a change-in-change, which is a measure of the local "acceleration" rather than trend.</li>
97
+ </ul>
98
+ </li>
99
+ </ul>
100
+ <ul>
101
+ <li><strong>MA(q)</strong> stands for <em>moving average model</em>, the <code>q</code> is the number of lagged forecast errors terms in the prediction equation, example:<ul>
102
+ <li>It's strange, but this MA term takes a percentage of the errors between the predicted value against the real. It assumes that the past errors are going to be similar in future events.</li>
103
+ <li>The formula for the MA(p) model is: $\hat{y}_{t} = \mu - \Theta_{1}e_{t-1} + ... + \Theta_{q}e_{t-q}$ Where $\mu$ is the constant term, <strong>q</strong> is the period to be used on the $e$ term and $\Theta$ is the parameter fitted to the errors</li>
104
+ <li>The error equation is $ e_{t} = Y_{t-1} - \hat{y}_{t-1}$</li>
105
+ </ul>
106
+ </li>
107
+ </ul>
108
+ <h2><font color=green>Seasonal ARIMA</font>:</h2>
109
+ <p>The <strong>p, d, q</strong> parameters are capitalized to differ from the non seasonal parameters.</p>
110
+ <ul>
111
+ <li><p><strong>SAR(P)</strong> is the seasonal autoregression of the series.</p>
112
+ <ul>
113
+ <li>The formula for the SAR(P) model is: $\hat{y}_{t} = \mu + \theta_{1}Y_{t-s}$ Where P is quantity of autoregression terms to be added, usually no more than 1 term, <strong>s</strong> is how many periods ago to be used as base and $\theta$ is the parameter fitted to the data.</li>
114
+ <li>Usually when the subject is weather forecasting, 12 months ago have some information to contribute to the current period.</li>
115
+ <li>Setting P=1 (i.e., SAR(1)) adds a multiple of $Y_{t-s}$ to the forecast for $y_{t}$</li>
116
+ </ul>
117
+ </li>
118
+ <li><p><strong>I(D)</strong> the seasonal difference MUST be used when you have an strong and stable pattern.</p>
119
+ <ul>
120
+ <li>If d = 0 and D = 1: $y_{t} = Y_{t} - Y_{t-s}$ where $y_{t}$ is the differenced series and $Y_{t-s}$ is the original seasonal lag.</li>
121
+ <li>If d =1 and D = 1: $y_{t} = (Y_{t} - Y_{t-1}) - (Y_{t-s} - Y_{t-s-1}) = Y_{t} - Y_{t-1} -Y_{t-s} + Y_{t-s-1}$</li>
122
+ <li>D should never be more than 1, and d+D should never be more than 2. Also, if d+D =2, the constant term should be suppressed.</li>
123
+ </ul>
124
+ </li>
125
+ <li><p><strong>SMA(Q)</strong></p>
126
+ <ul>
127
+ <li>Setting Q=1 (i.e., SMA(1)) adds a multiple of error $e_{t-s}$ to the forecast for $y_{t}$</li>
128
+ </ul>
129
+ </li>
130
+ </ul>
131
+ <ul>
132
+ <li><p><strong>S</strong> It's the seasonal period where you are going to calculate the the P, D, Q terms. If there is a 52 week seasonal correlation this is the number to be used on the 'S' parameter</p>
133
+ <p>## <font color=green>Trend</font>:</p>
134
+ </li>
135
+ </ul>
136
+ <p>We will use <a href="https://www.statsmodels.org/dev/generated/statsmodels.tsa.statespace.sarimax.SARIMAX.html">SARIMAX</a> to create a forecast, the following terms are a definition to the trend:</p>
137
+ <ul>
138
+ <li>'n' when there is no trend to be used (default).</li>
139
+ <li>‘c’ indicates a constant (i.e. a degree zero component of the trend polynomial)</li>
140
+ <li>‘t’ indicates a linear trend with time</li>
141
+ <li>‘ct’ is both trend and constant. </li>
142
+ <li>Can also be specified as an iterable defining the polynomial as in numpy.poly1d, where [1,1,0,1] would denote a+bt+ct3</li>
143
+ </ul>
144
+
145
+ </div>
146
+ </div>
147
+ </div>
148
+ <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
149
+ <div class="text_cell_render border-box-sizing rendered_html">
150
+ <p>Now, let's plot the series and check how it behaves</p>
151
+
152
+ </div>
153
+ </div>
154
+ </div>
155
+
156
+
157
+
158
+ <div class="
159
+ cell border-box-sizing code_cell rendered">
160
+ <div class="input">
161
+
162
+ <div class="inner_cell">
163
+ <div class="input_area">
164
+ <div class=" highlight hl-ipython3"><pre><span></span><span class="n">plt</span><span class="o">.</span><span class="n">figure</span><span class="p">(</span><span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">22</span><span class="p">,</span><span class="mi">6</span><span class="p">))</span>
165
+ <span class="n">sns</span><span class="o">.</span><span class="n">lineplot</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="n">rio</span><span class="o">.</span><span class="n">index</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="n">rio</span><span class="p">[</span><span class="s1">&#39;Temp&#39;</span><span class="p">])</span>
166
+ <span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s1">&#39;Temperature Variation in Rio De Janeiro from 1900 until 2012&#39;</span><span class="p">)</span>
167
+ <span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
168
+ </pre></div>
169
+
170
+ </div>
171
+ </div>
172
+ </div>
173
+
174
+ </div>
175
+
176
+
177
+
178
+ <div class="
179
+ cell border-box-sizing code_cell rendered">
180
+ <div class="input">
181
+
182
+ <div class="inner_cell">
183
+ <div class="input_area">
184
+ <div class=" highlight hl-ipython3"><pre><span></span><span class="c1"># i&#39;m going to create a pivot table to plot the monthly temperatures through the years</span>
185
+ <span class="n">rio</span><span class="p">[</span><span class="s1">&#39;month&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">rio</span><span class="o">.</span><span class="n">index</span><span class="o">.</span><span class="n">month</span>
186
+ <span class="n">rio</span><span class="p">[</span><span class="s1">&#39;year&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">rio</span><span class="o">.</span><span class="n">index</span><span class="o">.</span><span class="n">year</span>
187
+ <span class="n">pivot</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">pivot_table</span><span class="p">(</span><span class="n">rio</span><span class="p">,</span> <span class="n">values</span><span class="o">=</span><span class="s1">&#39;Temp&#39;</span><span class="p">,</span> <span class="n">index</span><span class="o">=</span><span class="s1">&#39;month&#39;</span><span class="p">,</span> <span class="n">columns</span><span class="o">=</span><span class="s1">&#39;year&#39;</span><span class="p">,</span> <span class="n">aggfunc</span><span class="o">=</span><span class="s1">&#39;mean&#39;</span><span class="p">)</span>
188
+ <span class="n">pivot</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span><span class="mi">6</span><span class="p">))</span>
189
+ <span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s1">&#39;Yearly Rio temperatures&#39;</span><span class="p">)</span>
190
+ <span class="n">plt</span><span class="o">.</span><span class="n">xlabel</span><span class="p">(</span><span class="s1">&#39;Months&#39;</span><span class="p">)</span>
191
+ <span class="n">plt</span><span class="o">.</span><span class="n">ylabel</span><span class="p">(</span><span class="s1">&#39;Temperatures&#39;</span><span class="p">)</span>
192
+ <span class="n">plt</span><span class="o">.</span><span class="n">xticks</span><span class="p">([</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">13</span><span class="p">)])</span>
193
+ <span class="n">plt</span><span class="o">.</span><span class="n">legend</span><span class="p">()</span><span class="o">.</span><span class="n">remove</span><span class="p">()</span>
194
+ <span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
195
+ </pre></div>
196
+
197
+ </div>
198
+ </div>
199
+ </div>
200
+
201
+ </div>
202
+ <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
203
+ <div class="text_cell_render border-box-sizing rendered_html">
204
+ <p>The series clearly has some seasonality, the higher temperatures are around November and February and the lower are between July and September. Just to make the things clear, I'll merge these lines into just one line, averaging the monthly levels:</p>
205
+
206
+ </div>
207
+ </div>
208
+ </div>
209
+
210
+
211
+
212
+ <div class="
213
+ cell border-box-sizing code_cell rendered">
214
+ <div class="input">
215
+
216
+ <div class="inner_cell">
217
+ <div class="input_area">
218
+ <div class=" highlight hl-ipython3"><pre><span></span><span class="n">monthly_seasonality</span> <span class="o">=</span> <span class="n">pivot</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
219
+ <span class="n">monthly_seasonality</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span><span class="mi">6</span><span class="p">))</span>
220
+ <span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s1">&#39;Monthly Temperatures in Rio De Janeiro&#39;</span><span class="p">)</span>
221
+ <span class="n">plt</span><span class="o">.</span><span class="n">xlabel</span><span class="p">(</span><span class="s1">&#39;Months&#39;</span><span class="p">)</span>
222
+ <span class="n">plt</span><span class="o">.</span><span class="n">ylabel</span><span class="p">(</span><span class="s1">&#39;Temperature&#39;</span><span class="p">)</span>
223
+ <span class="n">plt</span><span class="o">.</span><span class="n">xticks</span><span class="p">([</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">13</span><span class="p">)])</span>
224
+ <span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
225
+ </pre></div>
226
+
227
+ </div>
228
+ </div>
229
+ </div>
230
+
231
+ </div>
232
+ <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
233
+ <div class="text_cell_render border-box-sizing rendered_html">
234
+ <p>Now i'm going to check if there is some trend through the years in this Series:</p>
235
+
236
+ </div>
237
+ </div>
238
+ </div>
239
+
240
+
241
+
242
+ <div class="
243
+ cell border-box-sizing code_cell rendered">
244
+ <div class="input">
245
+
246
+ <div class="inner_cell">
247
+ <div class="input_area">
248
+ <div class=" highlight hl-ipython3"><pre><span></span><span class="n">year_avg</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">pivot_table</span><span class="p">(</span><span class="n">rio</span><span class="p">,</span> <span class="n">values</span><span class="o">=</span><span class="s1">&#39;Temp&#39;</span><span class="p">,</span> <span class="n">index</span><span class="o">=</span><span class="s1">&#39;year&#39;</span><span class="p">,</span> <span class="n">aggfunc</span><span class="o">=</span><span class="s1">&#39;mean&#39;</span><span class="p">)</span>
249
+ <span class="n">year_avg</span><span class="p">[</span><span class="s1">&#39;10 Years MA&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">year_avg</span><span class="p">[</span><span class="s1">&#39;Temp&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">rolling</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span><span class="o">.</span><span class="n">mean</span><span class="p">()</span>
250
+ <span class="n">year_avg</span><span class="p">[[</span><span class="s1">&#39;Temp&#39;</span><span class="p">,</span><span class="s1">&#39;10 Years MA&#39;</span><span class="p">]]</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span><span class="mi">6</span><span class="p">))</span>
251
+ <span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s1">&#39;Yearly AVG Temperatures in Rio De Janeiro&#39;</span><span class="p">)</span>
252
+ <span class="n">plt</span><span class="o">.</span><span class="n">xlabel</span><span class="p">(</span><span class="s1">&#39;Months&#39;</span><span class="p">)</span>
253
+ <span class="n">plt</span><span class="o">.</span><span class="n">ylabel</span><span class="p">(</span><span class="s1">&#39;Temperature&#39;</span><span class="p">)</span>
254
+ <span class="n">plt</span><span class="o">.</span><span class="n">xticks</span><span class="p">([</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1900</span><span class="p">,</span><span class="mi">2012</span><span class="p">,</span><span class="mi">3</span><span class="p">)])</span>
255
+ <span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
256
+ </pre></div>
257
+
258
+ </div>
259
+ </div>
260
+ </div>
261
+
262
+ </div>
263
+ <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
264
+ <div class="text_cell_render border-box-sizing rendered_html">
265
+ <p>We can confirm that there is a constant increasing trend and that the average temperature increased from 23.5º to 24.5º, that's 4.25% in over100 years.</p>
266
+ <p>Before we go on, i'm going to split the data in training, validation and test set. After training the model, I will use the last 5 years to do the data validation and test, being 48 months to do a month by month validation (walk forward) and 12 months to make an extrapolation for the future and compare to the test set:</p>
267
+
268
+ </div>
269
+ </div>
270
+ </div>
271
+
272
+
273
+
274
+ <div class="
275
+ cell border-box-sizing code_cell rendered">
276
+ <div class="input">
277
+
278
+ <div class="inner_cell">
279
+ <div class="input_area">
280
+ <div class=" highlight hl-ipython3"><pre><span></span><span class="n">train</span> <span class="o">=</span> <span class="n">rio</span><span class="p">[:</span><span class="o">-</span><span class="mi">60</span><span class="p">]</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
281
+ <span class="n">val</span> <span class="o">=</span> <span class="n">rio</span><span class="p">[</span><span class="o">-</span><span class="mi">60</span><span class="p">:</span><span class="o">-</span><span class="mi">12</span><span class="p">]</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
282
+ <span class="n">test</span> <span class="o">=</span> <span class="n">rio</span><span class="p">[</span><span class="o">-</span><span class="mi">12</span><span class="p">:]</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
283
+ </pre></div>
284
+
285
+ </div>
286
+ </div>
287
+ </div>
288
+
289
+ </div>
290
+ <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
291
+ <div class="text_cell_render border-box-sizing rendered_html">
292
+ <p>And before creating the forecasts we will create a baseline forecast in the validation set, in our simulation we will try to have a smaller error compared to this one.</p>
293
+ <p>it will consider the previous month as a base forecast to the next month:</p>
294
+
295
+ </div>
296
+ </div>
297
+ </div>
298
+
299
+
300
+
301
+ <div class="
302
+ cell border-box-sizing code_cell rendered">
303
+ <div class="input">
304
+
305
+ <div class="inner_cell">
306
+ <div class="input_area">
307
+ <div class=" highlight hl-ipython3"><pre><span></span><span class="c1"># Excluding the first line, as it has NaN values</span>
308
+ <span class="n">baseline</span> <span class="o">=</span> <span class="n">val</span><span class="p">[</span><span class="s1">&#39;Temp&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">shift</span><span class="p">()</span>
309
+ <span class="n">baseline</span><span class="o">.</span><span class="n">dropna</span><span class="p">(</span><span class="n">inplace</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
310
+ <span class="n">baseline</span><span class="o">.</span><span class="n">head</span><span class="p">()</span>
311
+ </pre></div>
312
+
313
+ </div>
314
+ </div>
315
+ </div>
316
+
317
+ </div>
318
+ <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
319
+ <div class="text_cell_render border-box-sizing rendered_html">
320
+ <p>Also I'm going to create a function to use the <a href="https://en.wikipedia.org/wiki/Root-mean-square_deviation">RMSE</a> as a base to calculate the error, but you are free to use another parameter:</p>
321
+
322
+ </div>
323
+ </div>
324
+ </div>
325
+
326
+
327
+
328
+ <div class="
329
+ cell border-box-sizing code_cell rendered">
330
+ <div class="input">
331
+
332
+ <div class="inner_cell">
333
+ <div class="input_area">
334
+ <div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">measure_rmse</span><span class="p">(</span><span class="n">y_true</span><span class="p">,</span> <span class="n">y_pred</span><span class="p">):</span>
335
+ <span class="c1"># return sqrt(mean_squared_error(y_true,y_pred))</span>
336
+ <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">square</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">subtract</span><span class="p">(</span><span class="n">y_true</span><span class="p">,</span> <span class="n">y_pred</span><span class="p">))</span><span class="o">.</span><span class="n">mean</span><span class="p">()</span>
337
+
338
+ <span class="c1"># Using the function with the baseline values</span>
339
+ <span class="n">rmse_base</span> <span class="o">=</span> <span class="n">measure_rmse</span><span class="p">(</span><span class="n">val</span><span class="o">.</span><span class="n">iloc</span><span class="p">[</span><span class="mi">1</span><span class="p">:,</span><span class="mi">0</span><span class="p">],</span><span class="n">baseline</span><span class="p">)</span>
340
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;The RMSE of the baseline that we will try to diminish is </span><span class="si">{</span><span class="nb">round</span><span class="p">(</span><span class="n">rmse_base</span><span class="p">,</span><span class="mi">4</span><span class="p">)</span><span class="si">}</span><span class="s1"> celsius degrees&#39;</span><span class="p">)</span>
341
+ </pre></div>
342
+
343
+ </div>
344
+ </div>
345
+ </div>
346
+
347
+ </div>
348
+ <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
349
+ <div class="text_cell_render border-box-sizing rendered_html">
350
+ <p>As we can see, the series has a small uptrend and it appears that there is some seasonality with higher temperatures at the begining and end of the year and lower temperatures around the middle of the year.</p>
351
+ <p>To create a time series forecast, the series must be stationary (constant mean, variance and autocorrelation).</p>
352
+ <p>One way to check if the series is stationary is using the <strong>adfuller function</strong>, if the P-Value is lower than 5% (usual number used for this kind of study) the series is stationary and you can start creating your model.</p>
353
+ <p>If the series isn't stationary you can do some data transformation like using natural logarithm, deflation, differencing, etc.</p>
354
+ <p>Below is the function that I used to check the stationarity, it plots:</p>
355
+ <ul>
356
+ <li>The series itself;</li>
357
+ <li>The autocorrelation function <strong>(ACF)</strong>:<ul>
358
+ <li>It shows the correlation between the current temperatures versus the lagged versions of itself.</li>
359
+ </ul>
360
+ </li>
361
+ <li>The partial autocorrelation <strong>(PACF)</strong>:<ul>
362
+ <li>It shows the correlation between the current temperatures versus the lagged version excluding the effects of earlier lags, for example, it show the effective influence of the lag 3 in the current temperatures excluding the effects of the lags 1 and 2.</li>
363
+ </ul>
364
+ </li>
365
+ </ul>
366
+ <p>For more interesting sources you can read the materials on this amazing website made by Mr. Robert Nau: <a href="http://people.duke.edu/~rnau/411home.htm"> Duke University</a>, also you can check <a href="machinelearningmastery.com">Jason Brownlee's</a> website, which have a lot of time series content.</p>
367
+
368
+ </div>
369
+ </div>
370
+ </div>
371
+
372
+
373
+
374
+ <div class="
375
+ cell border-box-sizing code_cell rendered">
376
+ <div class="input">
377
+
378
+ <div class="inner_cell">
379
+ <div class="input_area">
380
+ <div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">check_stationarity</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">lags_plots</span><span class="o">=</span><span class="mi">48</span><span class="p">,</span> <span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">22</span><span class="p">,</span><span class="mi">8</span><span class="p">)):</span>
381
+ <span class="s2">&quot;Use Series as parameter&quot;</span>
382
+
383
+ <span class="c1"># Creating plots of the DF</span>
384
+ <span class="n">y</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">Series</span><span class="p">(</span><span class="n">y</span><span class="p">)</span>
385
+ <span class="n">fig</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">figure</span><span class="p">()</span>
386
+
387
+ <span class="n">ax1</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplot2grid</span><span class="p">((</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="n">colspan</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
388
+ <span class="n">ax2</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplot2grid</span><span class="p">((</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">))</span>
389
+ <span class="n">ax3</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplot2grid</span><span class="p">((</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span>
390
+ <span class="n">ax4</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplot2grid</span><span class="p">((</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="n">colspan</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
391
+
392
+ <span class="n">y</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">ax</span><span class="o">=</span><span class="n">ax1</span><span class="p">,</span> <span class="n">figsize</span><span class="o">=</span><span class="n">figsize</span><span class="p">)</span>
393
+ <span class="n">ax1</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="s1">&#39;Rio De Janeiro Temperature Variation&#39;</span><span class="p">)</span>
394
+ <span class="n">plot_acf</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">lags</span><span class="o">=</span><span class="n">lags_plots</span><span class="p">,</span> <span class="n">zero</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">ax</span><span class="o">=</span><span class="n">ax2</span><span class="p">);</span>
395
+ <span class="n">plot_pacf</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">lags</span><span class="o">=</span><span class="n">lags_plots</span><span class="p">,</span> <span class="n">zero</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">ax</span><span class="o">=</span><span class="n">ax3</span><span class="p">);</span>
396
+ <span class="n">sns</span><span class="o">.</span><span class="n">distplot</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">bins</span><span class="o">=</span><span class="nb">int</span><span class="p">(</span><span class="n">sqrt</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">y</span><span class="p">))),</span> <span class="n">ax</span><span class="o">=</span><span class="n">ax4</span><span class="p">)</span>
397
+ <span class="n">ax4</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="s1">&#39;Distribution Chart&#39;</span><span class="p">)</span>
398
+
399
+ <span class="n">plt</span><span class="o">.</span><span class="n">tight_layout</span><span class="p">()</span>
400
+
401
+ <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Results of Dickey-Fuller Test:&#39;</span><span class="p">)</span>
402
+ <span class="n">adfinput</span> <span class="o">=</span> <span class="n">adfuller</span><span class="p">(</span><span class="n">y</span><span class="p">)</span>
403
+ <span class="n">adftest</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">Series</span><span class="p">(</span><span class="n">adfinput</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">4</span><span class="p">],</span> <span class="n">index</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;Test Statistic&#39;</span><span class="p">,</span><span class="s1">&#39;p-value&#39;</span><span class="p">,</span><span class="s1">&#39;Lags Used&#39;</span><span class="p">,</span><span class="s1">&#39;Number of Observations Used&#39;</span><span class="p">])</span>
404
+ <span class="n">adftest</span> <span class="o">=</span> <span class="nb">round</span><span class="p">(</span><span class="n">adftest</span><span class="p">,</span><span class="mi">4</span><span class="p">)</span>
405
+
406
+ <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">adfinput</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
407
+ <span class="n">adftest</span><span class="p">[</span><span class="s2">&quot;Critical Value (</span><span class="si">%s</span><span class="s2">)&quot;</span><span class="o">%</span><span class="k">key</span>] = value.round(4)
408
+
409
+ <span class="nb">print</span><span class="p">(</span><span class="n">adftest</span><span class="p">)</span>
410
+
411
+ <span class="k">if</span> <span class="n">adftest</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">round</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="o">&lt;</span> <span class="n">adftest</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span><span class="o">.</span><span class="n">round</span><span class="p">(</span><span class="mi">2</span><span class="p">):</span>
412
+ <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">The Test Statistics is lower than the Critical Value of 5%.</span><span class="se">\n</span><span class="s1">The serie seems to be stationary&#39;</span><span class="p">)</span>
413
+ <span class="k">else</span><span class="p">:</span>
414
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">The Test Statistics is higher than the Critical Value of 5%.</span><span class="se">\n</span><span class="s2">The serie isn&#39;t stationary&quot;</span><span class="p">)</span>
415
+ </pre></div>
416
+
417
+ </div>
418
+ </div>
419
+ </div>
420
+
421
+ </div>
422
+
423
+
424
+
425
+ <div class="
426
+ cell border-box-sizing code_cell rendered">
427
+ <div class="input">
428
+
429
+ <div class="inner_cell">
430
+ <div class="input_area">
431
+ <div class=" highlight hl-ipython3"><pre><span></span><span class="c1"># The first approach is to check the series without any transformation</span>
432
+ <span class="n">check_stationarity</span><span class="p">(</span><span class="n">train</span><span class="p">[</span><span class="s1">&#39;Temp&#39;</span><span class="p">])</span>
433
+ </pre></div>
434
+
435
+ </div>
436
+ </div>
437
+ </div>
438
+
439
+ </div>
440
+ <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
441
+ <div class="text_cell_render border-box-sizing rendered_html">
442
+ <p>The series has an interesting behavior, there is a sequential significative negative autocorrelation starting at lag 6 and repeating each 12 months, it's because of the difference in the seasons, if today is winter with cold temperatures in 6 months we will have higher temperatures in the summer, that's why the negative autocorrelation occurs. These temperatures usually walk in opposite directions.</p>
443
+ <p>Also, from lag 12 and sequentially from every 12 lags there is a significant positive autocorrelation. The <strong>PACF</strong> shows a positive spike in the first lag and a drop to negative <strong>PACF</strong> in the following lags.</p>
444
+ <p>This behavior between the <strong>ACF</strong> and <strong>PACF</strong> plots suggests an AR(1) model and also a first seasonal difference ($Y_{t} - Y_{t-12}$). I'll plot the stationarity function again with the first seasonal difference to see if we will need some SAR(P) or SMA(Q) parameter:</p>
445
+
446
+ </div>
447
+ </div>
448
+ </div>
449
+
450
+
451
+
452
+ <div class="
453
+ cell border-box-sizing code_cell rendered">
454
+ <div class="input">
455
+
456
+ <div class="inner_cell">
457
+ <div class="input_area">
458
+ <div class=" highlight hl-ipython3"><pre><span></span><span class="n">check_stationarity</span><span class="p">(</span><span class="n">train</span><span class="p">[</span><span class="s1">&#39;Temp&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">diff</span><span class="p">(</span><span class="mi">12</span><span class="p">)</span><span class="o">.</span><span class="n">dropna</span><span class="p">())</span>
459
+ </pre></div>
460
+
461
+ </div>
462
+ </div>
463
+ </div>
464
+
465
+ </div>
466
+ <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
467
+ <div class="text_cell_render border-box-sizing rendered_html">
468
+ <p>As the plots above showed, the first <strong>ACF</strong> lags have a gradual decay, while the <strong>PACF</strong> drops under the confidence interval after the third lag, this is an <strong>AR</strong> signature with a parameter of 3, so this is an <strong>AR(3)</strong> model.</p>
469
+ <p>As we used a first seasonal difference, the <strong>ACF</strong> and <strong>PACF</strong> showed a significative drop in the 12th lag, it means an <strong>SMA</strong> signature with a parameter of 1 lag, resuming this is an <strong>SAR(1) with a first difference</strong>.</p>
470
+ <p>Initially i'm going to work with the following (p,d,q) orders: (3, 0, 0), and with the following seasonal (P, D, Q, S) orders (0,1,1,12) and as the series has a clear uptrend i'm going to use it in the model ('c').</p>
471
+ <p>To start forecasting the validation set, I'm going to create a function to use one-step-forecast in the whole validation set and measure the error:</p>
472
+
473
+ </div>
474
+ </div>
475
+ </div>
476
+
477
+
478
+
479
+ <div class="
480
+ cell border-box-sizing code_cell rendered">
481
+ <div class="input">
482
+
483
+ <div class="inner_cell">
484
+ <div class="input_area">
485
+ <div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">walk_forward</span><span class="p">(</span><span class="n">training_set</span><span class="p">,</span> <span class="n">validation_set</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
486
+ <span class="sd">&#39;&#39;&#39;</span>
487
+ <span class="sd"> Params: it&#39;s a tuple where you put together the following SARIMA parameters: ((pdq), (PDQS), trend)</span>
488
+ <span class="sd"> &#39;&#39;&#39;</span>
489
+ <span class="n">history</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">training_set</span><span class="o">.</span><span class="n">values</span><span class="p">]</span>
490
+ <span class="n">prediction</span> <span class="o">=</span> <span class="nb">list</span><span class="p">()</span>
491
+
492
+ <span class="c1"># Using the SARIMA parameters and fitting the data</span>
493
+ <span class="n">pdq</span><span class="p">,</span> <span class="n">PDQS</span><span class="p">,</span> <span class="n">trend</span> <span class="o">=</span> <span class="n">params</span>
494
+
495
+ <span class="c1">#Forecasting one period ahead in the validation set</span>
496
+ <span class="k">for</span> <span class="n">week</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">validation_set</span><span class="p">)):</span>
497
+ <span class="n">model</span> <span class="o">=</span> <span class="n">sm</span><span class="o">.</span><span class="n">tsa</span><span class="o">.</span><span class="n">statespace</span><span class="o">.</span><span class="n">SARIMAX</span><span class="p">(</span><span class="n">history</span><span class="p">,</span> <span class="n">order</span><span class="o">=</span><span class="n">pdq</span><span class="p">,</span> <span class="n">seasonal_order</span><span class="o">=</span><span class="n">PDQS</span><span class="p">,</span> <span class="n">trend</span><span class="o">=</span><span class="n">trend</span><span class="p">)</span>
498
+ <span class="n">result</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">fit</span><span class="p">(</span><span class="n">disp</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
499
+ <span class="n">yhat</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">predict</span><span class="p">(</span><span class="n">start</span><span class="o">=</span><span class="nb">len</span><span class="p">(</span><span class="n">history</span><span class="p">),</span> <span class="n">end</span><span class="o">=</span><span class="nb">len</span><span class="p">(</span><span class="n">history</span><span class="p">))</span>
500
+ <span class="n">prediction</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">yhat</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
501
+ <span class="n">history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">validation_set</span><span class="p">[</span><span class="n">week</span><span class="p">])</span>
502
+
503
+ <span class="k">return</span> <span class="n">prediction</span>
504
+ </pre></div>
505
+
506
+ </div>
507
+ </div>
508
+ </div>
509
+
510
+ </div>
511
+
512
+
513
+
514
+ <div class="
515
+ cell border-box-sizing code_cell rendered">
516
+ <div class="input">
517
+
518
+ <div class="inner_cell">
519
+ <div class="input_area">
520
+ <div class=" highlight hl-ipython3"><pre><span></span><span class="c1"># Let&#39;s test it in the validation set</span>
521
+ <span class="n">train</span> <span class="o">=</span> <span class="n">rio</span><span class="p">[:</span><span class="o">-</span><span class="mi">60</span><span class="p">]</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
522
+ <span class="n">val</span><span class="p">[</span><span class="s1">&#39;Pred&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">walk_forward</span><span class="p">(</span><span class="n">train</span><span class="p">[</span><span class="s1">&#39;Temp&#39;</span><span class="p">],</span> <span class="n">val</span><span class="p">[</span><span class="s1">&#39;Temp&#39;</span><span class="p">],</span> <span class="p">((</span><span class="mi">3</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">),(</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">12</span><span class="p">),</span><span class="s1">&#39;c&#39;</span><span class="p">))</span>
523
+ </pre></div>
524
+
525
+ </div>
526
+ </div>
527
+ </div>
528
+
529
+ </div>
530
+
531
+
532
+
533
+ <div class="
534
+ cell border-box-sizing code_cell rendered">
535
+ <div class="input">
536
+
537
+ <div class="inner_cell">
538
+ <div class="input_area">
539
+ <div class=" highlight hl-ipython3"><pre><span></span><span class="c1"># Measuring the error of the prediction</span>
540
+ <span class="n">rmse_pred</span> <span class="o">=</span> <span class="n">measure_rmse</span><span class="p">(</span><span class="n">val</span><span class="p">[</span><span class="s1">&#39;Temp&#39;</span><span class="p">],</span> <span class="n">val</span><span class="p">[</span><span class="s1">&#39;Pred&#39;</span><span class="p">])</span>
541
+
542
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;The RMSE of the SARIMA(3,0,0),(0,1,1,12),&#39;c&#39; model was </span><span class="si">{</span><span class="nb">round</span><span class="p">(</span><span class="n">rmse_pred</span><span class="p">,</span><span class="mi">4</span><span class="p">)</span><span class="si">}</span><span class="s2"> celsius degrees&quot;</span><span class="p">)</span>
543
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;It&#39;s a decrease of </span><span class="si">{</span><span class="nb">round</span><span class="p">((</span><span class="n">rmse_pred</span><span class="o">/</span><span class="n">rmse_base</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">*</span><span class="mi">100</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span><span class="si">}</span><span class="s2">% in the RMSE&quot;</span><span class="p">)</span>
544
+ </pre></div>
545
+
546
+ </div>
547
+ </div>
548
+ </div>
549
+
550
+ </div>
551
+
552
+
553
+
554
+ <div class="
555
+ cell border-box-sizing code_cell rendered">
556
+ <div class="input">
557
+
558
+ <div class="inner_cell">
559
+ <div class="input_area">
560
+ <div class=" highlight hl-ipython3"><pre><span></span><span class="c1"># Creating the error column</span>
561
+ <span class="n">val</span><span class="p">[</span><span class="s1">&#39;Error&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">val</span><span class="p">[</span><span class="s1">&#39;Temp&#39;</span><span class="p">]</span> <span class="o">-</span> <span class="n">val</span><span class="p">[</span><span class="s1">&#39;Pred&#39;</span><span class="p">]</span>
562
+ </pre></div>
563
+
564
+ </div>
565
+ </div>
566
+ </div>
567
+
568
+ </div>
569
+ <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
570
+ <div class="text_cell_render border-box-sizing rendered_html">
571
+ <p>It's always important to check the residuals, I'm going to create a function to plot some important charts to help us visualize the residuals.</p>
572
+ <p>I'm going to plot the following charts:</p>
573
+ <ul>
574
+ <li>Current and Predicted values through the time.</li>
575
+ <li>Residuals vs Predicted values in an scatterplot.</li>
576
+ <li>QQ Plot showing the distribution of errors and its ideal distribution</li>
577
+ <li>Autocorrelation plot of the Residuals to see if there is some correlation left.</li>
578
+ </ul>
579
+
580
+ </div>
581
+ </div>
582
+ </div>
583
+
584
+
585
+
586
+ <div class="
587
+ cell border-box-sizing code_cell rendered">
588
+ <div class="input">
589
+
590
+ <div class="inner_cell">
591
+ <div class="input_area">
592
+ <div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">plot_error</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span><span class="mi">8</span><span class="p">)):</span>
593
+ <span class="sd">&#39;&#39;&#39;</span>
594
+ <span class="sd"> There must have 3 columns following this order: Temperature, Prediction, Error</span>
595
+ <span class="sd"> &#39;&#39;&#39;</span>
596
+ <span class="n">plt</span><span class="o">.</span><span class="n">figure</span><span class="p">(</span><span class="n">figsize</span><span class="o">=</span><span class="n">figsize</span><span class="p">)</span>
597
+ <span class="n">ax1</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplot2grid</span><span class="p">((</span><span class="mi">2</span><span class="p">,</span><span class="mi">2</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">))</span>
598
+ <span class="n">ax2</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplot2grid</span><span class="p">((</span><span class="mi">2</span><span class="p">,</span><span class="mi">2</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">))</span>
599
+ <span class="n">ax3</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplot2grid</span><span class="p">((</span><span class="mi">2</span><span class="p">,</span><span class="mi">2</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">))</span>
600
+ <span class="n">ax4</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplot2grid</span><span class="p">((</span><span class="mi">2</span><span class="p">,</span><span class="mi">2</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">))</span>
601
+
602
+ <span class="c1">#Plotting the Current and Predicted values</span>
603
+ <span class="n">ax1</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">iloc</span><span class="p">[:,</span><span class="mi">0</span><span class="p">:</span><span class="mi">2</span><span class="p">])</span>
604
+ <span class="n">ax1</span><span class="o">.</span><span class="n">legend</span><span class="p">([</span><span class="s1">&#39;Real&#39;</span><span class="p">,</span><span class="s1">&#39;Pred&#39;</span><span class="p">])</span>
605
+ <span class="n">ax1</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="s1">&#39;Current and Predicted Values&#39;</span><span class="p">)</span>
606
+
607
+ <span class="c1"># Residual vs Predicted values</span>
608
+ <span class="n">ax2</span><span class="o">.</span><span class="n">scatter</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">iloc</span><span class="p">[:,</span><span class="mi">1</span><span class="p">],</span> <span class="n">data</span><span class="o">.</span><span class="n">iloc</span><span class="p">[:,</span><span class="mi">2</span><span class="p">])</span>
609
+ <span class="n">ax2</span><span class="o">.</span><span class="n">set_xlabel</span><span class="p">(</span><span class="s1">&#39;Predicted Values&#39;</span><span class="p">)</span>
610
+ <span class="n">ax2</span><span class="o">.</span><span class="n">set_ylabel</span><span class="p">(</span><span class="s1">&#39;Errors&#39;</span><span class="p">)</span>
611
+ <span class="n">ax2</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="s1">&#39;Errors versus Predicted Values&#39;</span><span class="p">)</span>
612
+
613
+ <span class="c1">## QQ Plot of the residual</span>
614
+ <span class="n">sm</span><span class="o">.</span><span class="n">graphics</span><span class="o">.</span><span class="n">qqplot</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">iloc</span><span class="p">[:,</span><span class="mi">2</span><span class="p">],</span> <span class="n">line</span><span class="o">=</span><span class="s1">&#39;r&#39;</span><span class="p">,</span> <span class="n">ax</span><span class="o">=</span><span class="n">ax3</span><span class="p">)</span>
615
+
616
+ <span class="c1"># Autocorrelation plot of the residual</span>
617
+ <span class="n">plot_acf</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">iloc</span><span class="p">[:,</span><span class="mi">2</span><span class="p">],</span> <span class="n">lags</span><span class="o">=</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">iloc</span><span class="p">[:,</span><span class="mi">2</span><span class="p">])</span><span class="o">-</span><span class="mi">1</span><span class="p">),</span><span class="n">zero</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">ax</span><span class="o">=</span><span class="n">ax4</span><span class="p">)</span>
618
+ <span class="n">plt</span><span class="o">.</span><span class="n">tight_layout</span><span class="p">()</span>
619
+ <span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
620
+ </pre></div>
621
+
622
+ </div>
623
+ </div>
624
+ </div>
625
+
626
+ </div>
627
+
628
+
629
+
630
+ <div class="
631
+ cell border-box-sizing code_cell rendered">
632
+ <div class="input">
633
+
634
+ <div class="inner_cell">
635
+ <div class="input_area">
636
+ <div class=" highlight hl-ipython3"><pre><span></span><span class="c1"># We need to remove some columns to plot the charts</span>
637
+ <span class="n">val</span><span class="o">.</span><span class="n">drop</span><span class="p">([</span><span class="s1">&#39;month&#39;</span><span class="p">,</span><span class="s1">&#39;year&#39;</span><span class="p">],</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">inplace</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
638
+ <span class="n">val</span><span class="o">.</span><span class="n">head</span><span class="p">()</span>
639
+ </pre></div>
640
+
641
+ </div>
642
+ </div>
643
+ </div>
644
+
645
+ </div>
646
+
647
+
648
+
649
+ <div class="
650
+ cell border-box-sizing code_cell rendered">
651
+ <div class="input">
652
+
653
+ <div class="inner_cell">
654
+ <div class="input_area">
655
+ <div class=" highlight hl-ipython3"><pre><span></span><span class="n">plot_error</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>
656
+ </pre></div>
657
+
658
+ </div>
659
+ </div>
660
+ </div>
661
+
662
+ </div>
663
+ <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
664
+ <div class="text_cell_render border-box-sizing rendered_html">
665
+ <p>Analyzing the plots above we can see that the predictions fit very well on the current values.</p>
666
+ <p>The <strong>Error vs Predicted values</strong> has a linear distribution (the errors are between -1.5 and +1.5 while the temperature increases).</p>
667
+ <p>The QQ Plot shows a normal pattern with some little outliers and,</p>
668
+ <p>The autocorrelation plot shows a positive spike over the confidence interval just above the second lag, but I believe that there is no need for more changes.</p>
669
+ <p>Finally it's time to extrapolate the prediction in the <strong>test set</strong> for the last 12 months</p>
670
+
671
+ </div>
672
+ </div>
673
+ </div>
674
+
675
+
676
+
677
+ <div class="
678
+ cell border-box-sizing code_cell rendered">
679
+ <div class="input">
680
+
681
+ <div class="inner_cell">
682
+ <div class="input_area">
683
+ <div class=" highlight hl-ipython3"><pre><span></span><span class="c1">#Creating the new concatenating the training and validation set:</span>
684
+ <span class="n">future</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">concat</span><span class="p">([</span><span class="n">train</span><span class="p">[</span><span class="s1">&#39;Temp&#39;</span><span class="p">],</span> <span class="n">val</span><span class="p">[</span><span class="s1">&#39;Temp&#39;</span><span class="p">]])</span>
685
+ <span class="n">future</span><span class="o">.</span><span class="n">head</span><span class="p">()</span>
686
+ </pre></div>
687
+
688
+ </div>
689
+ </div>
690
+ </div>
691
+
692
+ </div>
693
+
694
+
695
+
696
+ <div class="
697
+ cell border-box-sizing code_cell rendered">
698
+ <div class="input">
699
+
700
+ <div class="inner_cell">
701
+ <div class="input_area">
702
+ <div class=" highlight hl-ipython3"><pre><span></span><span class="c1"># Using the same parameters of the fitted model</span>
703
+ <span class="n">model</span> <span class="o">=</span> <span class="n">sm</span><span class="o">.</span><span class="n">tsa</span><span class="o">.</span><span class="n">statespace</span><span class="o">.</span><span class="n">SARIMAX</span><span class="p">(</span><span class="n">future</span><span class="p">,</span> <span class="n">order</span><span class="o">=</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">),</span> <span class="n">seasonal_order</span><span class="o">=</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">12</span><span class="p">),</span> <span class="n">trend</span><span class="o">=</span><span class="s1">&#39;c&#39;</span><span class="p">)</span>
704
+ <span class="n">result</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">fit</span><span class="p">(</span><span class="n">disp</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
705
+ </pre></div>
706
+
707
+ </div>
708
+ </div>
709
+ </div>
710
+
711
+ </div>
712
+ <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
713
+ <div class="text_cell_render border-box-sizing rendered_html">
714
+ <p>Now I'm going to create a new column on the test set with the predicted values and I will compare them against the real values</p>
715
+
716
+ </div>
717
+ </div>
718
+ </div>
719
+
720
+
721
+
722
+ <div class="
723
+ cell border-box-sizing code_cell rendered">
724
+ <div class="input">
725
+
726
+ <div class="inner_cell">
727
+ <div class="input_area">
728
+ <div class=" highlight hl-ipython3"><pre><span></span><span class="n">test</span><span class="p">[</span><span class="s1">&#39;Pred&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">predict</span><span class="p">(</span><span class="n">start</span><span class="o">=</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">future</span><span class="p">)),</span> <span class="n">end</span><span class="o">=</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">future</span><span class="p">)</span><span class="o">+</span><span class="mi">13</span><span class="p">))</span>
729
+ </pre></div>
730
+
731
+ </div>
732
+ </div>
733
+ </div>
734
+
735
+ </div>
736
+
737
+
738
+
739
+ <div class="
740
+ cell border-box-sizing code_cell rendered">
741
+ <div class="input">
742
+
743
+ <div class="inner_cell">
744
+ <div class="input_area">
745
+ <div class=" highlight hl-ipython3"><pre><span></span><span class="n">test</span><span class="p">[[</span><span class="s1">&#39;Temp&#39;</span><span class="p">,</span> <span class="s1">&#39;Pred&#39;</span><span class="p">]]</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">22</span><span class="p">,</span><span class="mi">6</span><span class="p">))</span>
746
+ <span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s1">&#39;Current Values compared to the Extrapolated Ones&#39;</span><span class="p">)</span>
747
+ <span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
748
+ </pre></div>
749
+
750
+ </div>
751
+ </div>
752
+ </div>
753
+
754
+ </div>
755
+ <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
756
+ <div class="text_cell_render border-box-sizing rendered_html">
757
+ <p>It seems that the SARIMA parameters were well fitted, the predicted values are following the real values and also the seasonal pattern.</p>
758
+ <p>Finally I'll evaluate the model with the RMSE in the test set (baseline against the extrapolation):</p>
759
+
760
+ </div>
761
+ </div>
762
+ </div>
763
+
764
+
765
+
766
+ <div class="
767
+ cell border-box-sizing code_cell rendered">
768
+ <div class="input">
769
+
770
+ <div class="inner_cell">
771
+ <div class="input_area">
772
+ <div class=" highlight hl-ipython3"><pre><span></span><span class="n">test_baseline</span> <span class="o">=</span> <span class="n">test</span><span class="p">[</span><span class="s1">&#39;Temp&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">shift</span><span class="p">()</span>
773
+
774
+ <span class="n">test_baseline</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">test</span><span class="p">[</span><span class="s1">&#39;Temp&#39;</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
775
+
776
+ <span class="n">rmse_test_base</span> <span class="o">=</span> <span class="n">measure_rmse</span><span class="p">(</span><span class="n">test</span><span class="p">[</span><span class="s1">&#39;Temp&#39;</span><span class="p">],</span><span class="n">test_baseline</span><span class="p">)</span>
777
+ <span class="n">rmse_test_extrap</span> <span class="o">=</span> <span class="n">measure_rmse</span><span class="p">(</span><span class="n">test</span><span class="p">[</span><span class="s1">&#39;Temp&#39;</span><span class="p">],</span> <span class="n">test</span><span class="p">[</span><span class="s1">&#39;Pred&#39;</span><span class="p">])</span>
778
+
779
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;The baseline RMSE for the test baseline was </span><span class="si">{</span><span class="nb">round</span><span class="p">(</span><span class="n">rmse_test_base</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span><span class="si">}</span><span class="s1"> celsius degrees&#39;</span><span class="p">)</span>
780
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;The baseline RMSE for the test extrapolation was </span><span class="si">{</span><span class="nb">round</span><span class="p">(</span><span class="n">rmse_test_extrap</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span><span class="si">}</span><span class="s1"> celsius degrees&#39;</span><span class="p">)</span>
781
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;That is an improvement of </span><span class="si">{</span><span class="o">-</span><span class="nb">round</span><span class="p">((</span><span class="n">rmse_test_extrap</span><span class="o">/</span><span class="n">rmse_test_base</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">*</span><span class="mi">100</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span><span class="si">}</span><span class="s1">%&#39;</span><span class="p">)</span>
782
+ </pre></div>
783
+
784
+ </div>
785
+ </div>
786
+ </div>
787
+
788
+ </div>
789
+ <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
790
+ <div class="text_cell_render border-box-sizing rendered_html">
791
+ <p>I Hope you liked this analysis, if you have any doubt or comment fell free to talk with me, also you can find me on my <a href="https://www.linkedin.com/in/leandro-rabelo-08722824">LinkedIn</a> or in my <a href="https://twitter.com/leandrovrabelo">Twitter</a></p>
792
+ <p>Thanks!!!</p>
793
+
794
+ </div>
795
+ </div>
796
+ </div>
797
+