{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Failing to find a good lagged correlation\n", "\n", "A couple of weeks ago I used Forecast Forge to build a forecast for the number of pageviews of the \"All I Want for Christmas is You\" wikipedia page in the runup to Christmas.\n", "\n", "![](https://www.forecastforge.com/files/maria-carey-spike-forecast.png)\n", "\n", "> pageviews for the “All I Want For Christmas is You” wikipedia page will peak on 24th December close to 30k\n", "\n", "This forecast \"looks\" good - it has the peak roughly when we'd expect it and the magnitude is comparable with previous years. It passes the smell test, but I am still concerned about whether it predicts the size of the peak correctly. As you can see from the chart, the peak in 2019 was way higher than any of the preceeding years and getting this right is the most important part of my prediction. How can we tell in advance what kind of peak there is going to be?\n", "\n", "My hypothesis is that the peak in 2019 was driven by the re-release of the *Merry Christmas* album; something that would have been known about on the 8th November 2019 when the corresponding 2019 forecast would have been made. If I was a Maria Carey expert I would be able to include broader information like this in a regression column; probably by giving each December a mark out of 10 for how much Maria had going on that year.\n", "\n", "But I am not a Maria Carey expert so I don't trust my intuition on this; I need some hard data to work with here that might give me an inkling of whether or not she is having a big year.\n", "\n", "The first idea that sprang to mind was that it might be possible to use traffic data from other wikipedia pages for this. The challenge is then to find which pages are a leading indicator of Christmas traffic for \"All I Want for Christmas is You\".\n", "\n", "Doing this analysis for *all* pages on Wikipedia would make the challenge more about dealing with big data so instead I first need to select a subset of pages for first analysis. All the pages that link to \"All I Want for Christmas is You\" seems like a good starting point. You can see a list of these using the [linksto: operator](https://en.wikipedia.org/w/index.php?search=linksto%3A%22All+I+Want+for+Christmas+Is+You%22&title=Special:Search&profile=advanced&fulltext=1&ns0=1) and download the pageview data from the [Massviews tool](https://pageviews.toolforge.org/massviews?project=en.wikipedia.org).\n", "\n", "The rest of this post will be me analysing this data and trying (failing!) to use it to make a better forecast.\n", "\n", "First let's load the data into python" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Title2015-07-012015-07-022015-07-032015-07-042015-07-052015-07-062015-07-072015-07-082015-07-09...2021-11-072021-11-082021-11-092021-11-102021-11-112021-11-122021-11-132021-11-142021-11-152021-11-16
0Justin Bieber112121141910973108161073711675142461378012273...138041300212540133431468113842129801326714624.014028.0
1Millie Bobby Brown000000000...1422911248949783148197845312435118409445.09979.0
2Mariah Carey9832143821098895959428932987351398510900...166381465013315138511570614629126621389513326.010419.0
3Fifth Harmony116491167410864107331129212147122471231611701...238520712169233420982151224420912104.01918.0
4Jenna Dewan131822649021592168811407416984128111170110932...359848573929330729062582259032925002.04402.0
..................................................................
628Ngayong Pasko000000000...141042021.01.0
629Česko Slovenská SuperStar (season 4)000000000...483422021.07.0
630Mr. Vocalist X'Mas000000000...322001303.01.0
63124 Hours (Agnes song)000000000...19141510998614.04.0
632We Were Born for This000000000...314434613.012.0
\n", "

633 rows × 2332 columns

\n", "
" ], "text/plain": [ " Title 2015-07-01 2015-07-02 2015-07-03 \\\n", "0 Justin Bieber 11212 11419 10973 \n", "1 Millie Bobby Brown 0 0 0 \n", "2 Mariah Carey 9832 14382 10988 \n", "3 Fifth Harmony 11649 11674 10864 \n", "4 Jenna Dewan 13182 26490 21592 \n", ".. ... ... ... ... \n", "628 Ngayong Pasko 0 0 0 \n", "629 Česko Slovenská SuperStar (season 4) 0 0 0 \n", "630 Mr. Vocalist X'Mas 0 0 0 \n", "631 24 Hours (Agnes song) 0 0 0 \n", "632 We Were Born for This 0 0 0 \n", "\n", " 2015-07-04 2015-07-05 2015-07-06 2015-07-07 2015-07-08 2015-07-09 \\\n", "0 10816 10737 11675 14246 13780 12273 \n", "1 0 0 0 0 0 0 \n", "2 9595 9428 9329 8735 13985 10900 \n", "3 10733 11292 12147 12247 12316 11701 \n", "4 16881 14074 16984 12811 11701 10932 \n", ".. ... ... ... ... ... ... \n", "628 0 0 0 0 0 0 \n", "629 0 0 0 0 0 0 \n", "630 0 0 0 0 0 0 \n", "631 0 0 0 0 0 0 \n", "632 0 0 0 0 0 0 \n", "\n", " ... 2021-11-07 2021-11-08 2021-11-09 2021-11-10 2021-11-11 \\\n", "0 ... 13804 13002 12540 13343 14681 \n", "1 ... 14229 11248 9497 8314 8197 \n", "2 ... 16638 14650 13315 13851 15706 \n", "3 ... 2385 2071 2169 2334 2098 \n", "4 ... 3598 4857 3929 3307 2906 \n", ".. ... ... ... ... ... ... \n", "628 ... 1 4 1 0 4 \n", "629 ... 4 8 3 4 2 \n", "630 ... 3 2 2 0 0 \n", "631 ... 19 14 15 10 9 \n", "632 ... 3 1 4 4 3 \n", "\n", " 2021-11-12 2021-11-13 2021-11-14 2021-11-15 2021-11-16 \n", "0 13842 12980 13267 14624.0 14028.0 \n", "1 8453 12435 11840 9445.0 9979.0 \n", "2 14629 12662 13895 13326.0 10419.0 \n", "3 2151 2244 2091 2104.0 1918.0 \n", "4 2582 2590 3292 5002.0 4402.0 \n", ".. ... ... ... ... ... \n", "628 2 0 2 1.0 1.0 \n", "629 2 0 2 1.0 7.0 \n", "630 1 3 0 3.0 1.0 \n", "631 9 8 6 14.0 4.0 \n", "632 4 6 1 3.0 12.0 \n", "\n", "[633 rows x 2332 columns]" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "\n", "inlinks = pd.read_csv(\"https://www.forecastforge.com/files/massviews-20150701-20211116.csv\",\n", " # Need to set this otherwise cloudflare (I think?) 403's the pandas request\n", " storage_options = {'User-Agent': 'Pandas!'})\n", "inlinks" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This looks OK, but I would prefer it if each page was a separate column with a row for each day" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
TitleJustin BieberMillie Bobby BrownMariah CareyFifth HarmonyJenna DewanLove ActuallyMichael BubléDespacitoTori KellyHallelujah (Leonard Cohen song)...Colleen MaddenList of Tawag ng Tanghalan finalists (season 3)List of top 10 singles for 2018 in AustraliaThe Masked Singer (Bulgarian season 1)List of Billboard Global 200 number ones of 2021Ngayong PaskoČesko Slovenská SuperStar (season 4)Mr. Vocalist X'Mas24 Hours (Agnes song)We Were Born for This
2015-07-0111212098321164913182201421290126722091...0000000000
2015-07-02114190143821167426490240926280107642239...0000000000
2015-07-0310973010988108642159225322350085012290...0000000000
2015-07-041081609595107331688125142195072522643...0000000000
2015-07-051073709428112921407424452344061132675...0000000000
..................................................................
2021-11-12138428453146292151258249787419108910881801...001217322194
2021-11-131298012435126622244259061754041118112721947...111277400386
2021-11-14132671184013895209132927413360897120162002...034156122061
2021-11-1514624.09445.013326.02104.05002.06195.03051.01066.01057.01709.0...0.03.02.04.076.01.01.03.014.03.0
2021-11-1614028.09979.010419.01918.04402.06276.03255.0960.01225.01524.0...1.0NaN1.013.067.01.07.01.04.012.0
\n", "

2331 rows × 633 columns

\n", "
" ], "text/plain": [ "Title Justin Bieber Millie Bobby Brown Mariah Carey Fifth Harmony \\\n", "2015-07-01 11212 0 9832 11649 \n", "2015-07-02 11419 0 14382 11674 \n", "2015-07-03 10973 0 10988 10864 \n", "2015-07-04 10816 0 9595 10733 \n", "2015-07-05 10737 0 9428 11292 \n", "... ... ... ... ... \n", "2021-11-12 13842 8453 14629 2151 \n", "2021-11-13 12980 12435 12662 2244 \n", "2021-11-14 13267 11840 13895 2091 \n", "2021-11-15 14624.0 9445.0 13326.0 2104.0 \n", "2021-11-16 14028.0 9979.0 10419.0 1918.0 \n", "\n", "Title Jenna Dewan Love Actually Michael Bublé Despacito Tori Kelly \\\n", "2015-07-01 13182 2014 2129 0 12672 \n", "2015-07-02 26490 2409 2628 0 10764 \n", "2015-07-03 21592 2532 2350 0 8501 \n", "2015-07-04 16881 2514 2195 0 7252 \n", "2015-07-05 14074 2445 2344 0 6113 \n", "... ... ... ... ... ... \n", "2021-11-12 2582 4978 7419 1089 1088 \n", "2021-11-13 2590 6175 4041 1181 1272 \n", "2021-11-14 3292 7413 3608 971 2016 \n", "2021-11-15 5002.0 6195.0 3051.0 1066.0 1057.0 \n", "2021-11-16 4402.0 6276.0 3255.0 960.0 1225.0 \n", "\n", "Title Hallelujah (Leonard Cohen song) ... Colleen Madden \\\n", "2015-07-01 2091 ... 0 \n", "2015-07-02 2239 ... 0 \n", "2015-07-03 2290 ... 0 \n", "2015-07-04 2643 ... 0 \n", "2015-07-05 2675 ... 0 \n", "... ... ... ... \n", "2021-11-12 1801 ... 0 \n", "2021-11-13 1947 ... 1 \n", "2021-11-14 2002 ... 0 \n", "2021-11-15 1709.0 ... 0.0 \n", "2021-11-16 1524.0 ... 1.0 \n", "\n", "Title List of Tawag ng Tanghalan finalists (season 3) \\\n", "2015-07-01 0 \n", "2015-07-02 0 \n", "2015-07-03 0 \n", "2015-07-04 0 \n", "2015-07-05 0 \n", "... ... \n", "2021-11-12 0 \n", "2021-11-13 1 \n", "2021-11-14 3 \n", "2021-11-15 3.0 \n", "2021-11-16 NaN \n", "\n", "Title List of top 10 singles for 2018 in Australia \\\n", "2015-07-01 0 \n", "2015-07-02 0 \n", "2015-07-03 0 \n", "2015-07-04 0 \n", "2015-07-05 0 \n", "... ... \n", "2021-11-12 1 \n", "2021-11-13 1 \n", "2021-11-14 4 \n", "2021-11-15 2.0 \n", "2021-11-16 1.0 \n", "\n", "Title The Masked Singer (Bulgarian season 1) \\\n", "2015-07-01 0 \n", "2015-07-02 0 \n", "2015-07-03 0 \n", "2015-07-04 0 \n", "2015-07-05 0 \n", "... ... \n", "2021-11-12 21 \n", "2021-11-13 27 \n", "2021-11-14 15 \n", "2021-11-15 4.0 \n", "2021-11-16 13.0 \n", "\n", "Title List of Billboard Global 200 number ones of 2021 Ngayong Pasko \\\n", "2015-07-01 0 0 \n", "2015-07-02 0 0 \n", "2015-07-03 0 0 \n", "2015-07-04 0 0 \n", "2015-07-05 0 0 \n", "... ... ... \n", "2021-11-12 73 2 \n", "2021-11-13 74 0 \n", "2021-11-14 61 2 \n", "2021-11-15 76.0 1.0 \n", "2021-11-16 67.0 1.0 \n", "\n", "Title Česko Slovenská SuperStar (season 4) Mr. Vocalist X'Mas \\\n", "2015-07-01 0 0 \n", "2015-07-02 0 0 \n", "2015-07-03 0 0 \n", "2015-07-04 0 0 \n", "2015-07-05 0 0 \n", "... ... ... \n", "2021-11-12 2 1 \n", "2021-11-13 0 3 \n", "2021-11-14 2 0 \n", "2021-11-15 1.0 3.0 \n", "2021-11-16 7.0 1.0 \n", "\n", "Title 24 Hours (Agnes song) We Were Born for This \n", "2015-07-01 0 0 \n", "2015-07-02 0 0 \n", "2015-07-03 0 0 \n", "2015-07-04 0 0 \n", "2015-07-05 0 0 \n", "... ... ... \n", "2021-11-12 9 4 \n", "2021-11-13 8 6 \n", "2021-11-14 6 1 \n", "2021-11-15 14.0 3.0 \n", "2021-11-16 4.0 12.0 \n", "\n", "[2331 rows x 633 columns]" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "inlinks = inlinks.transpose()\n", "## Column names are in the first row\n", "inlinks.columns = inlinks.iloc[0]\n", "## Delete the first row\n", "inlinks = inlinks.drop([\"Title\"])\n", "inlinks" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Much better!\n", "\n", "Now load the \"All I Want for Christmas is You\" pageview data" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
DateAll I Want for Christmas Is You
02015-07-01189
12015-07-02248
22015-07-03179
32015-07-04208
42015-07-05245
.........
23182021-11-044103
23192021-11-053556
23202021-11-063192
23212021-11-073046
23222021-11-082760
\n", "

2323 rows × 2 columns

\n", "
" ], "text/plain": [ " Date All I Want for Christmas Is You\n", "0 2015-07-01 189\n", "1 2015-07-02 248\n", "2 2015-07-03 179\n", "3 2015-07-04 208\n", "4 2015-07-05 245\n", "... ... ...\n", "2318 2021-11-04 4103\n", "2319 2021-11-05 3556\n", "2320 2021-11-06 3192\n", "2321 2021-11-07 3046\n", "2322 2021-11-08 2760\n", "\n", "[2323 rows x 2 columns]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "alliwant = pd.read_csv(\"https://www.forecastforge.com/files/pageviews-20150701-20211108.csv\",\n", " storage_options = {'User-Agent': 'Pandas!'})\n", "alliwant" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Match the timeseries up by joining the dataframes together" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
All I Want for Christmas Is YouJustin BieberMillie Bobby BrownMariah CareyFifth HarmonyJenna DewanLove ActuallyMichael BubléDespacitoTori Kelly...Colleen MaddenList of Tawag ng Tanghalan finalists (season 3)List of top 10 singles for 2018 in AustraliaThe Masked Singer (Bulgarian season 1)List of Billboard Global 200 number ones of 2021Ngayong PaskoČesko Slovenská SuperStar (season 4)Mr. Vocalist X'Mas24 Hours (Agnes song)We Were Born for This
Date
2015-07-011891121209832116491318220142129012672...0000000000
2015-07-0224811419014382116742649024092628010764...0000000000
2015-07-031791097301098810864215922532235008501...0000000000
2015-07-04208108160959510733168812514219507252...0000000000
2015-07-05245107370942811292140742445234406113...0000000000
..................................................................
2021-11-0441031283284951800523933147278328759731525...0115002164
2021-11-0535561247377241808022062789405629259921341...301240244132
2021-11-063192132731194416802223134085880274010671322...0202742375155
2021-11-073046138041422916638238535986717270511941269...1422065143193
2021-11-08276013002112481465020714857543624279561073...41224111482141
\n", "

2323 rows × 634 columns

\n", "
" ], "text/plain": [ " All I Want for Christmas Is You Justin Bieber Millie Bobby Brown \\\n", "Date \n", "2015-07-01 189 11212 0 \n", "2015-07-02 248 11419 0 \n", "2015-07-03 179 10973 0 \n", "2015-07-04 208 10816 0 \n", "2015-07-05 245 10737 0 \n", "... ... ... ... \n", "2021-11-04 4103 12832 8495 \n", "2021-11-05 3556 12473 7724 \n", "2021-11-06 3192 13273 11944 \n", "2021-11-07 3046 13804 14229 \n", "2021-11-08 2760 13002 11248 \n", "\n", " Mariah Carey Fifth Harmony Jenna Dewan Love Actually Michael Bublé \\\n", "Date \n", "2015-07-01 9832 11649 13182 2014 2129 \n", "2015-07-02 14382 11674 26490 2409 2628 \n", "2015-07-03 10988 10864 21592 2532 2350 \n", "2015-07-04 9595 10733 16881 2514 2195 \n", "2015-07-05 9428 11292 14074 2445 2344 \n", "... ... ... ... ... ... \n", "2021-11-04 18005 2393 3147 2783 2875 \n", "2021-11-05 18080 2206 2789 4056 2925 \n", "2021-11-06 16802 2231 3408 5880 2740 \n", "2021-11-07 16638 2385 3598 6717 2705 \n", "2021-11-08 14650 2071 4857 5436 2427 \n", "\n", " Despacito Tori Kelly ... Colleen Madden \\\n", "Date ... \n", "2015-07-01 0 12672 ... 0 \n", "2015-07-02 0 10764 ... 0 \n", "2015-07-03 0 8501 ... 0 \n", "2015-07-04 0 7252 ... 0 \n", "2015-07-05 0 6113 ... 0 \n", "... ... ... ... ... \n", "2021-11-04 973 1525 ... 0 \n", "2021-11-05 992 1341 ... 3 \n", "2021-11-06 1067 1322 ... 0 \n", "2021-11-07 1194 1269 ... 1 \n", "2021-11-08 956 1073 ... 4 \n", "\n", " List of Tawag ng Tanghalan finalists (season 3) \\\n", "Date \n", "2015-07-01 0 \n", "2015-07-02 0 \n", "2015-07-03 0 \n", "2015-07-04 0 \n", "2015-07-05 0 \n", "... ... \n", "2021-11-04 1 \n", "2021-11-05 0 \n", "2021-11-06 2 \n", "2021-11-07 4 \n", "2021-11-08 1 \n", "\n", " List of top 10 singles for 2018 in Australia \\\n", "Date \n", "2015-07-01 0 \n", "2015-07-02 0 \n", "2015-07-03 0 \n", "2015-07-04 0 \n", "2015-07-05 0 \n", "... ... \n", "2021-11-04 1 \n", "2021-11-05 1 \n", "2021-11-06 0 \n", "2021-11-07 2 \n", "2021-11-08 2 \n", "\n", " The Masked Singer (Bulgarian season 1) \\\n", "Date \n", "2015-07-01 0 \n", "2015-07-02 0 \n", "2015-07-03 0 \n", "2015-07-04 0 \n", "2015-07-05 0 \n", "... ... \n", "2021-11-04 5 \n", "2021-11-05 24 \n", "2021-11-06 27 \n", "2021-11-07 20 \n", "2021-11-08 24 \n", "\n", " List of Billboard Global 200 number ones of 2021 Ngayong Pasko \\\n", "Date \n", "2015-07-01 0 0 \n", "2015-07-02 0 0 \n", "2015-07-03 0 0 \n", "2015-07-04 0 0 \n", "2015-07-05 0 0 \n", "... ... ... \n", "2021-11-04 0 0 \n", "2021-11-05 0 2 \n", "2021-11-06 42 3 \n", "2021-11-07 65 1 \n", "2021-11-08 111 4 \n", "\n", " Česko Slovenská SuperStar (season 4) Mr. Vocalist X'Mas \\\n", "Date \n", "2015-07-01 0 0 \n", "2015-07-02 0 0 \n", "2015-07-03 0 0 \n", "2015-07-04 0 0 \n", "2015-07-05 0 0 \n", "... ... ... \n", "2021-11-04 2 1 \n", "2021-11-05 4 4 \n", "2021-11-06 7 5 \n", "2021-11-07 4 3 \n", "2021-11-08 8 2 \n", "\n", " 24 Hours (Agnes song) We Were Born for This \n", "Date \n", "2015-07-01 0 0 \n", "2015-07-02 0 0 \n", "2015-07-03 0 0 \n", "2015-07-04 0 0 \n", "2015-07-05 0 0 \n", "... ... ... \n", "2021-11-04 6 4 \n", "2021-11-05 13 2 \n", "2021-11-06 15 5 \n", "2021-11-07 19 3 \n", "2021-11-08 14 1 \n", "\n", "[2323 rows x 634 columns]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "## Default is inner join so rows match up\n", "all_series = alliwant.join(inlinks, on=\"Date\")\n", "all_series = all_series.set_index(\"Date\")\n", "all_series" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Eventually I want to run some kind of regression on the lagged timeseries; and I want to easily be able to tell which regression coefficients are important and which are not. So I am going to normalise all the data so it has mean of `0` and standard deviation of `1`" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
All I Want for Christmas Is YouJustin BieberMillie Bobby BrownMariah CareyFifth HarmonyJenna DewanLove ActuallyMichael BubléDespacitoTori Kelly...Colleen MaddenList of Tawag ng Tanghalan finalists (season 3)List of top 10 singles for 2018 in AustraliaThe Masked Singer (Bulgarian season 1)List of Billboard Global 200 number ones of 2021Ngayong PaskoČesko Slovenská SuperStar (season 4)Mr. Vocalist X'Mas24 Hours (Agnes song)We Were Born for This
Date
2015-07-01-0.360837-0.666008-0.60886-0.1362750.8337430.602052-0.38695-0.350378-0.5729811.37151...-0.382595-0.361893-0.156449-0.105454-0.033438-0.257078-0.249068-0.188576-0.063978-0.075707
2015-07-02-0.343616-0.646519-0.608860.1807880.8378451.721202-0.329304-0.261714-0.5729811.083843...-0.382595-0.361893-0.156449-0.105454-0.033438-0.257078-0.249068-0.188576-0.063978-0.075707
2015-07-03-0.363756-0.68851-0.60886-0.055720.7049381.309299-0.311353-0.31111-0.5729810.742653...-0.382595-0.361893-0.156449-0.105454-0.033438-0.257078-0.249068-0.188576-0.063978-0.075707
2015-07-04-0.355291-0.703292-0.60886-0.152790.6834440.913123-0.31398-0.338651-0.5729810.554343...-0.382595-0.361893-0.156449-0.105454-0.033438-0.257078-0.249068-0.188576-0.063978-0.075707
2015-07-05-0.344492-0.710729-0.60886-0.1644280.7751650.677065-0.32405-0.312176-0.5729810.382617...-0.382595-0.361893-0.156449-0.105454-0.033438-0.257078-0.249068-0.188576-0.063978-0.075707
..................................................................
2021-11-040.781595-0.513486-0.19010.433254-0.684997-0.241852-0.274723-0.217826-0.424959-0.30911...-0.3825950.4787840.2106531.332167-0.033438-0.2570782.1319421.2383366.04373312.053036
2021-11-050.621934-0.547286-0.2281060.438481-0.715681-0.271958-0.088942-0.208942-0.422069-0.336852...2.077097-0.3618930.2106536.795127-0.0334382.0621144.5129535.51907213.1693965.988665
2021-11-060.515689-0.471966-0.0200820.349424-0.711579-0.2199030.177251-0.241814-0.410659-0.339716...-0.3825951.31946-0.1564497.657714.931643.221718.0844696.94598415.205315.085222
2021-11-070.473074-0.4219730.0925570.337996-0.68631-0.2039250.299402-0.248033-0.391339-0.347707...0.4373023.0008130.5777565.6450323.1268020.9025184.5129534.0921619.2771079.020851
2021-11-080.389595-0.497481-0.0543910.199464-0.737832-0.0980480.112454-0.297429-0.427545-0.377258...2.8969950.4787840.5777566.79512739.5171254.3813079.2749752.66524814.1873482.956479
\n", "

2323 rows × 634 columns

\n", "
" ], "text/plain": [ " All I Want for Christmas Is You Justin Bieber Millie Bobby Brown \\\n", "Date \n", "2015-07-01 -0.360837 -0.666008 -0.60886 \n", "2015-07-02 -0.343616 -0.646519 -0.60886 \n", "2015-07-03 -0.363756 -0.68851 -0.60886 \n", "2015-07-04 -0.355291 -0.703292 -0.60886 \n", "2015-07-05 -0.344492 -0.710729 -0.60886 \n", "... ... ... ... \n", "2021-11-04 0.781595 -0.513486 -0.1901 \n", "2021-11-05 0.621934 -0.547286 -0.228106 \n", "2021-11-06 0.515689 -0.471966 -0.020082 \n", "2021-11-07 0.473074 -0.421973 0.092557 \n", "2021-11-08 0.389595 -0.497481 -0.054391 \n", "\n", " Mariah Carey Fifth Harmony Jenna Dewan Love Actually Michael Bublé \\\n", "Date \n", "2015-07-01 -0.136275 0.833743 0.602052 -0.38695 -0.350378 \n", "2015-07-02 0.180788 0.837845 1.721202 -0.329304 -0.261714 \n", "2015-07-03 -0.05572 0.704938 1.309299 -0.311353 -0.31111 \n", "2015-07-04 -0.15279 0.683444 0.913123 -0.31398 -0.338651 \n", "2015-07-05 -0.164428 0.775165 0.677065 -0.32405 -0.312176 \n", "... ... ... ... ... ... \n", "2021-11-04 0.433254 -0.684997 -0.241852 -0.274723 -0.217826 \n", "2021-11-05 0.438481 -0.715681 -0.271958 -0.088942 -0.208942 \n", "2021-11-06 0.349424 -0.711579 -0.219903 0.177251 -0.241814 \n", "2021-11-07 0.337996 -0.68631 -0.203925 0.299402 -0.248033 \n", "2021-11-08 0.199464 -0.737832 -0.098048 0.112454 -0.297429 \n", "\n", " Despacito Tori Kelly ... Colleen Madden \\\n", "Date ... \n", "2015-07-01 -0.572981 1.37151 ... -0.382595 \n", "2015-07-02 -0.572981 1.083843 ... -0.382595 \n", "2015-07-03 -0.572981 0.742653 ... -0.382595 \n", "2015-07-04 -0.572981 0.554343 ... -0.382595 \n", "2015-07-05 -0.572981 0.382617 ... -0.382595 \n", "... ... ... ... ... \n", "2021-11-04 -0.424959 -0.30911 ... -0.382595 \n", "2021-11-05 -0.422069 -0.336852 ... 2.077097 \n", "2021-11-06 -0.410659 -0.339716 ... -0.382595 \n", "2021-11-07 -0.391339 -0.347707 ... 0.437302 \n", "2021-11-08 -0.427545 -0.377258 ... 2.896995 \n", "\n", " List of Tawag ng Tanghalan finalists (season 3) \\\n", "Date \n", "2015-07-01 -0.361893 \n", "2015-07-02 -0.361893 \n", "2015-07-03 -0.361893 \n", "2015-07-04 -0.361893 \n", "2015-07-05 -0.361893 \n", "... ... \n", "2021-11-04 0.478784 \n", "2021-11-05 -0.361893 \n", "2021-11-06 1.31946 \n", "2021-11-07 3.000813 \n", "2021-11-08 0.478784 \n", "\n", " List of top 10 singles for 2018 in Australia \\\n", "Date \n", "2015-07-01 -0.156449 \n", "2015-07-02 -0.156449 \n", "2015-07-03 -0.156449 \n", "2015-07-04 -0.156449 \n", "2015-07-05 -0.156449 \n", "... ... \n", "2021-11-04 0.210653 \n", "2021-11-05 0.210653 \n", "2021-11-06 -0.156449 \n", "2021-11-07 0.577756 \n", "2021-11-08 0.577756 \n", "\n", " The Masked Singer (Bulgarian season 1) \\\n", "Date \n", "2015-07-01 -0.105454 \n", "2015-07-02 -0.105454 \n", "2015-07-03 -0.105454 \n", "2015-07-04 -0.105454 \n", "2015-07-05 -0.105454 \n", "... ... \n", "2021-11-04 1.332167 \n", "2021-11-05 6.795127 \n", "2021-11-06 7.6577 \n", "2021-11-07 5.64503 \n", "2021-11-08 6.795127 \n", "\n", " List of Billboard Global 200 number ones of 2021 Ngayong Pasko \\\n", "Date \n", "2015-07-01 -0.033438 -0.257078 \n", "2015-07-02 -0.033438 -0.257078 \n", "2015-07-03 -0.033438 -0.257078 \n", "2015-07-04 -0.033438 -0.257078 \n", "2015-07-05 -0.033438 -0.257078 \n", "... ... ... \n", "2021-11-04 -0.033438 -0.257078 \n", "2021-11-05 -0.033438 2.062114 \n", "2021-11-06 14.93164 3.22171 \n", "2021-11-07 23.126802 0.902518 \n", "2021-11-08 39.517125 4.381307 \n", "\n", " Česko Slovenská SuperStar (season 4) Mr. Vocalist X'Mas \\\n", "Date \n", "2015-07-01 -0.249068 -0.188576 \n", "2015-07-02 -0.249068 -0.188576 \n", "2015-07-03 -0.249068 -0.188576 \n", "2015-07-04 -0.249068 -0.188576 \n", "2015-07-05 -0.249068 -0.188576 \n", "... ... ... \n", "2021-11-04 2.131942 1.238336 \n", "2021-11-05 4.512953 5.519072 \n", "2021-11-06 8.084469 6.945984 \n", "2021-11-07 4.512953 4.09216 \n", "2021-11-08 9.274975 2.665248 \n", "\n", " 24 Hours (Agnes song) We Were Born for This \n", "Date \n", "2015-07-01 -0.063978 -0.075707 \n", "2015-07-02 -0.063978 -0.075707 \n", "2015-07-03 -0.063978 -0.075707 \n", "2015-07-04 -0.063978 -0.075707 \n", "2015-07-05 -0.063978 -0.075707 \n", "... ... ... \n", "2021-11-04 6.043733 12.053036 \n", "2021-11-05 13.169396 5.988665 \n", "2021-11-06 15.2053 15.085222 \n", "2021-11-07 19.277107 9.020851 \n", "2021-11-08 14.187348 2.956479 \n", "\n", "[2323 rows x 634 columns]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "normalised=(all_series-all_series.mean())/all_series.std()\n", "normalised" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAW0AAAFtCAYAAADMATsiAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAA53ElEQVR4nO3deXxTVd4G8CdJd7ovdKEFZBlA2VsEEZeho6AiiKPiIAzyOiqKyusyOKKvsg1MBRdwGXQEHQTRUUcYQAS0oOIoi4IgWxELFkpXCt0obZb3j/SmSZukt22Se076fD+f+UxJ0vTnTe5zzz333HN0FovFAiIikoJe6wKIiEg9hjYRkUQY2kREEmFoExFJhKFNRCQRhjYRkUQCtC7AE0pLK2E2qx+5GB8f7sVqiMgfmExmlJVVt+h3EhIivFRNA78I7ZbS6XRal0BEggsIMGhdglPsHiEikghDm4hIIgxtIiKJMLSJiCTC0CYikghDm4hIIgxtIiKJMLSJiCTC0CYikghDm4hIIgxtIiKJMLSJ/FBZeQ1e++hH1BnNWpdCHsbQJvJDb649gM++PYGdB89oXQp5GEObyA9Z1M9UTJJhaBP5MYa3/2FoExFJhKFN5Me43of/YWgT+TF2j/gfhjaRP2IL228xtIn8EVvYfouhTUQkEYY2kT9i94jf8kloZ2VlYeTIkejVqxdycnIAAGVlZbj33nsxatQo3HzzzXjooYdw9uxZX5RD5P/YPeK3fBLamZmZWL16NTp16mR7TKfT4U9/+hM2b96M9evXIy0tDYsXL/ZFOURE0vJJaGdkZCA5OdnhsejoaAwdOtT274EDByI/P98X5RD5P3aP+K0ArQsAALPZjDVr1mDkyJGt+v24uHAPV0REBCQkRGhdQhNChPa8efMQFhaGSZMmter3S0srYTar78QT8YMgIvEUF1e06PW+yBbNQzsrKwsnT57EsmXLoNdzMAsRkTuahvZLL72En376CW+++SaCgoK0LIXIP3EUid/xSWjPnz8fW7ZsQUlJCaZOnYro6Gi8/PLLWLZsGbp27Yo777wTAJCamorXXnvNFyUR+TVeh/RfPgntZ555Bs8880yTx48ePeqLP0/U7rCB7b/YiUxEJBGGNpEfYveI/2JoE/khdo/4L4Y2EZFEGNpEfojdI/6LoU1EJBGGNhGRRBjaREQSYWgTEUmEoU1EJBGGNhGRRBjaRH7Mwtts/A5Dm8gP6XQcqe2vGNpEfshiYQvbXzG0iYgkwtAm8kPsHvFfDG0iIokwtIn82Ptbc9i/7WcY2kR+LK+wAqeKKrUugzyIoU1EJBGGNhGRRBjaREQSYWgTEUmEoU1EJBGGNhGRRBjaREQSYWgT+SH7m9h5R7t/YWgTEUmEoU1EJBGGNhGRRBjaRH6O07T6F4Y2EZFEGNpERBJhaBMRSYShTeTn2KPtX3wS2llZWRg5ciR69eqFnJwc2+O5ubmYMGECRo0ahQkTJuDEiRO+KIeISFoBal40ceJEl1egV69e3ezvZ2Zm4o9//CPuuusuh8efe+45TJw4EePGjcO6devw7LPPYuXKlWpKIiJql1SF9u233+7w7+LiYnz88ce4+eabVf2RjIyMJo+Vlpbi0KFDePvttwEAY8aMwbx583D27FnExsaqel8iUoH9I35FVWiPHz++yWOjRo3CU089hYceeqhVf/jMmTNITEyEwWAAABgMBnTs2BFnzpxhaBMRuaAqtJ1JTEzE0aNHPVlLq8XFhWtdAhH5oYSECK1LaEJVaH/00UcO/66pqcGWLVswcODAVv/h5ORkFBYWwmQywWAwwGQyoaioCMnJyS1+r9LSSpjNFtWvF/GDIPIodol4RHFxRYte74tsURXa69atc/h3WFgYBg0ahLvvvrvVfzguLg59+vTBhg0bMG7cOGzYsAF9+vRh1wgRkRs6i8WivonaSvPnz8eWLVtQUlKCmJgYREdHY+PGjTh+/Dj+8pe/oLy8HJGRkcjKykK3bt1a/P5saRM5WrRqD77aexoA8MZTmUiJZxdia4jY0lYd2idOnMCGDRtQVFSEjh07YsyYMejatauXy1OHoU3kyD6033zqd0iO76BxRXISMbRV3VyTnZ2NW2+9Fbm5uYiKikJubi5+//vf44svvvB2fUREZEdVn/ZLL72E119/HcOGDbM9tnPnTsybNw+ZmZleK46IiBypamkXFBQ0uUEmPT0dBQUFXimKiIicUxXavXv3xooVKxwee/vtt9GnTx+vFEVEnsM1EPyL2+6RHTt2YMSIEZg9ezYeeOABrFy5EsnJyThz5gzCwsLw97//3Vd1EhERmgntmTNn4tprr8VTTz2FTz/9FPv27bONHhkwYAACAwN9VScREaGZ7pGNGzeirq4ON910E7766itkZGTgxhtvREZGBgObiEgDblvaMTExWLRoEXbs2IHZs2fjk08+QY8ePRxeM2PGDK8WSEREDVQN+YuPj0dkZCQKCwsRHs47q4hEp+PkI37LbWjX1dXh1Vdfxfvvv49HHnmkySIGRCQmC7w+OwVpxG1ojxs3DsnJyfj3v/+NTp06+aomIiJywW1oT506tcmqNUQkPnaP+C+3o0cY2ETyc7W+K8nJJ6uxExG58uEXOZg6b4vWZUij1cuNEZEcfDBlfpus/PSw1iVIhS1tIiKJqArt7777Dnl5eQCAoqIiPPnkk3jqqadQXFzs1eKIiMiRqtCeM2cODAYDACArKwtGoxE6nQ7/93//59XiiIjIkao+7cLCQqSkpMBoNGLHjh3Izs5GYGAgrrrqKm/XR0REdlSFdnh4OEpKSnDs2DF0794dHTp0QG1tLYxGo7frI6JW4Cg//6UqtCdNmoTbbrsNdXV1mDVrFgDghx9+aNXK6UTkffYDRgQfPEItpCq077vvPlx33XUwGAzo3LkzACAxMRHz58/3anFERORI9TjtSy65xO2/iUgc7B7xX25De+LEic3eArt69WqPFkREbccuEf/lNrQ59wiR/DhNq39xG9rjx4/3VR1E5EHsHvFfvI2diEgiDG0if8feEb/C0CYikghDm4hIIqpC++2338bhw9Y5b/ft24drr70WmZmZ2Lt3r1eLIyIiR6pC+5133kFqaioA4IUXXsDdd9+NadOmYcGCBV4tjojajl3a/kVVaFdUVCAiIgKVlZU4evQoJk+ejNtvvx25ubnero+IiOyouo09OTkZP/zwA37++WdkZGTAYDCgsrLSNsc2EQmG47T9lqrQnjlzJh555BEEBQVh6dKlAIBt27ahX79+Xi2OiFrJYZY/dpD4E1Whfc0112DHjh0Oj40ePRqjR4/2SBHbtm3DkiVLYLFYYDab8fDDD+P666/3yHsTEfmTFq3GXllZibKyMofH0tLS2lSAxWLBzJkzsXr1avzmN7/BkSNH8Ic//AG/+93voNdzRCJRq7B7xG+pCu2ff/4ZTzzxBI4cOQKdTgeLxWKb/U8ZCtgWer0eFRUVAKwXPTt27MjA9rDc/PMor6rFgJ4JWpdCPsbeEf+iKrTnzJmDoUOHYuXKlcjMzER2djZeeOEFDBo0qM0F6HQ6vPzyy3jwwQcRFhaGqqoqvPHGG21+X3L0yAvbAQDrXxinbSFE1CaqQvvIkSNYsWIFAgMDYbFYEBERgZkzZ2LMmDEYN65tIWA0GvHGG2/g9ddfR3p6Or7//ns8+uij2LhxIzp06KDqPeLiwttUAxGRMwkJEVqX0ISq0A4ODobRaERgYCBiYmKQn5+PyMhInDt3rs0FHD58GEVFRUhPTwcApKenIzQ0FMePH0f//v1VvUdpaSXMZvXngCJ+EEQknuLiiha93hfZoqrjOD09HZs2bQIAjBo1Cvfeey8mT56MYcOGtbmApKQkFBQU4JdffgEAHD9+HCUlJba1KImIqIGqlvaSJUtsPz/22GPo0aMHqqurccstt7S5gISEBMyePRszZsywXdxcuHAhoqOj2/zeRET+pkVD/gDrSA9PhLW9sWPHYuzYsR59TyIif6QqtCsqKrBy5UocPnwY1dXVDs+tWLHCK4URUevZD9PmHZH+RVVoz5gxAyaTCddddx2Cg4O9XRMRtRFj2n+pCu19+/Zh586dCAwM9HY9RETkhurRI8ePH/d2LUTkIQ7dI5pVQd6gqqX9t7/9Dffeey8GDBiAuLg4h+ceeughrxRGRERNqQrtl156CQUFBUhNTUVlZaXtcWWIHhER+Yaq0N64cSM2b96Mjh07erseIiJyQ1WfdlpaGgICWjykm4hEwE5tv6IqiceNG4cHH3wQkyZNatKnfcUVV3ilMCIiakpVaK9evRoA8OKLLzo8rtPp8MUXX3i+KiIickpVaGdnZ3u7DiLyEvaO+BdVfdoPPPCA08c53I9ITDKO7OLt9uqoCu2dO3c6fXzXrl0eLYaIPIMB6L/cdo8oU7LW1dU5TM8KAHl5eUhJSfFeZUTkEQxw/+I2tAsKCgBYP3TlZ0VycjIefvhh71VGRK0mZ/cIIGHZPuc2tBcuXAgAGDRoEO644w6fFEREbcfWtf9S1ac9ePBglJSUAACqqqqwdOlSvPrqq7hw4YJXiyMiIkeqQvvxxx9HeXk5ACArKwu7d+/Gvn378Oyzz3q1OCJqHSm7R7QuQBKqxmmfPn0a3bp1g8Viweeff44NGzYgJCQEmZmZ3q6PiIjsqArtoKAgVFZW4vjx40hKSkJsbCyMRiMuXrzo7fqIqL2wWOA4Ezg5oyq0x4wZgylTpqCqqgqTJk0CABw6dAipqaleLY6I2o7XJP2LqtCeNWsWduzYgYCAAAwbNgyAtc/sqaee8mpxRETkSPV8qyNGjHD4d79+/TxeDBG1XzwhUMdlaN9zzz1Yvnw5AGDixIkur0YrMwAStRcWiwX/3X8Gl1+WiMAAg9blNItjtv2Ly9C+5ZZbbD/ffvvtvqiFCOu//gU9UqPR55JYrUtxaf+xEvxt5W6Mu7o7/jSur9blUDvjMrRvvvlmAIDJZMKvv/6KBx54AEFBQT4rjNqnN9ceAACsf2GcxpW4VnGhFgBQco43l3kSTwjUafbmGoPBgPfee4/LjRHVY7iQllTdEXnLLbdgzZo13q6FSC6SDCnmMca/qGo+79+/H6tWrcLy5cuRlJTkcFGSFyKJyDN4eFFDVWjfcccdnOWPSMFsIQ2pCu3x48d7uw4i6UjSO8KDjJ9RfXVxx44dOHz4MKqrqx0enzFjhseLIpIBs9CzeIFXHVWhPXfuXGzatAlDhw5FaGiot2siIiIXVIX2xo0bsXbtWiQnJ3u7HiJpyNI9YpHknECOKrWnashfdHQ0IiIivF0LERE1w2VLOy8vz/bz1KlT8cQTT+D+++9HfHy8w+vS0tLaXMTFixexYMECfPvttwgODsbAgQMxb968Nr8vEZG/cRna1113HXQ6ncNkM9u3b3d4jU6nw+HDh9tcxKJFixAcHIzNmzdDp9PZ1qMkEpEs3Q2y4cRW6rgM7SNHjvikgKqqKqxduxZffvml7aadxq15IhHJsg4js9C/uO3TrqmpQU5OjtPncnJyPLLcWF5eHqKjo/Hqq6/i1ltvxeTJk7Fnz542vy8RkT9yO3rkrbfeQnl5OWbNmtXkuX//+9+IiIjA9OnT21SA0WhEXl4eLr30Ujz55JP48ccfMW3aNGzduhXh4eGq3iMuTt3riDyBLVcvEXC7JiSINwDDbWh/+umnePvtt50+N3XqVEydOrXNoZ2SkoKAgACMGTMGADBgwADExMQgNzdX9eo4paWVMJvVf+IifhDedKakSusSyMck6bkRXnFxRYte74tscds9UlhYiMTERKfPJSYmorCwsM0FxMbGYujQofjmm28AALm5uSgtLUWXLl3a/N5kdd/Cz7Uuwa8wEElLblvaoaGhOHPmjNObavLz8z12d+ScOXMwa9YsZGVlISAgAM8//zwiIyM98t5EniZD94gMNTYmYcmacBva11xzDV588UUsWrSoyXNLlizBNddc45Ei0tLS8O6773rkvYh8RZYGN4fS+Re3of2///u/mDBhAsaOHYvrr78eCQkJKC4uxtatW1FZWYn333/fV3USUQvIGNQy1qwFt6GdkJCATz75BCtWrMDXX3+Nc+fOITo6Gr/97W8xdepUREVF+apOImHIEC3MP//V7IRRUVFRePTRR31RC7Vz0rW0BO4fMcu2LUk1VRNGEfkCc8aDLE5/JD/A0CZhSBMuEhxd2NL2XwxtEgeDxmO4Kf1Xs6FtMpnw5JNPora21hf1UDvGnPEci4T9IzzQqNNsaBsMBnzzzTfSzGhG8pJmp5VgX5BmW1KLqeoemTJlCl555RXU1dV5ux5q1yRJGgkSUbqROKSaqjUiV61ahZKSErz99tuIjY11aHU3XhiBqLVkyxmdwGP+7LelLNtVkjI1pyq0nd3GTuRp3Gk9R5agppZTFdqXX365t+sgkuaUXoYquSSa/1LVp11XV4elS5ciMzMT/fr1Q2ZmJpYuXcoRJeRZkuWMyNcjJTn+OZKyaN9T3T2yf/9+zJkzBykpKcjPz8frr7+OyspKp6vaELUGd1nPsb+5hq1u/6IqtD/77DOsW7cOMTExAIBu3brh0ksvxbhx4xja5DHSdI9IUGZYsKpdWygSbFYhqOoecbUzybKTEbU3KQlcN9VfqQrt0aNH44EHHsDXX3+N48eP46uvvsL06dNxww03eLs+akdkaQOI3JftjMjb9aPsY1qXIB1V51B//vOf8fe//x1z585FUVEREhMTceONN+LBBx/0dn3UjgicLQ5EDkGZlFfV4p8bD9n+ze2qjsvQzsrKwpNPPgkA+P777zFjxgzMmDHDZ4VROyTbXitwi1uGrksZahSRy+6Rf/3rX7afp0+f7pNiqH3jLkzUPJct7d69e+ORRx5B9+7dUVtbiyVLljh9HVvf5CnyNLykKVRojSehY8tbHZehvXTpUnzwwQfIz88HABQUFPisKGqfZNtpBe4dkYJsF3RF4TK04+LibBcaTSYTFi5c6LOiiMj/MbNbR9WQPwY2+YIsDW1Z6lSIegYjZlXi43JjJAzebt2+CHosER5Dm8QhyU7MvljPEPUMQHQMbRIGd2HPcVgEQbsyWoQZro6q0HY1n/YVV1zh0WKofZOl5SVJmcLjdmwd1fNpO3vMbDZ7vCAiWXCx67ZpfA2D1zTUcTv3yMSJE6HT6VBbW4u77rrL4bmCggIMGjTIq8VR+8KWl+dIcdYiQYkichvat99+OywWCw4cOIDbbrvN9rhOp0NcXByGDRvm9QKp/ZAhZwB56rQRtF5ByxKe29AeP348AGDAgAHo3r27Twqi9ounx+1Lk7MBfvyqqJqatXv37tixYwcOHz6M6upqh+c49wh5DHfadkW6MxZBqArtuXPnYtOmTRg6dChCQ0O9XZNUThdX4siJs8gc0lnrUqQnzz4sT6WAuGcwDO3WURXaGzduxNq1a5GcnOzteqTzyOJtqDWaGdoeIMXFM/KYpqNHSA1VQ/6io6MRERHh7Vrw6quvolevXsjJyfH63/KUWiOHPbY/HOrnEUzpVlHV0p46dSqeeOIJ3H///YiPj3d4Li0tzSOFHDx4EPv27UNKSopH3o/kI09DW/xCHe6IFLRcQcsSnqrQnj17NgBg+/btDo/rdDocPny4zUXU1tZi7ty5WLx4MaZMmdLm9yM5idr36grvrWmbxt1h7B5TR1VoHzlyxKtFLFmyBGPHjvVYq53kxH2WqHmqQtub9u7diwMHDuCJJ55o9XvExYV7sCLSitksR2rz4OIZMmzHhATvX8trKVWhbTQa8d5772H37t0oKytzOI1ZvXp1mwrYvXs3fvnlF2RmZgKw3h5/zz33YOHChRgxYoSq9ygtrWzRDi/iB0GAWYa92I5O4AuSFpf/EIcM3WHFxRUter0vskX1yjUffPABMjIycPDgQVx//fUoLS31yG3s9913H3bs2IHs7GxkZ2cjKSkJy5cvVx3Y5D9kaWmTh/DjbhVVob1lyxb84x//wJQpU2AwGDBlyhS89tpr2Llzp7fro3ZEltCWo0rxNd6Okp1oaUZV90hNTY3txpqQkBBcuHAB3bt3x6FDhzxeUHZ2tsffk+TAndY7RO2G4GiR1lE998iBAwfQv39/9O3bF6+88grCw8ORmJjo7fqkYbFYOL9yG8nSpy1DmTIEogQlCklV98isWbNgMBgAAH/5y19w6NAhbNu2DfPmzfNqcTLhF7DtlO4RvfDHPn7YntB0nLZGhUjGbUt79uzZGDJkCDIyMmyt6q5du+Kdd97xRW3UzigtbdHPWJSud8HLtBE1DAUtS3huQ9tkMuGVV17ByZMnkZqaiiFDhtj+l5qa6qsapcAvYNspLW3hQ1s5IxD/lEBo3/10RusSpOQ2tJXuj9LSUuzevRvff/89Vq5ciWeeeQbx8fEYMmQIFi9e7JNChWexgBMJtY3S0hY9DE31a6PqBT+4iG7VJsc7rUW9YCoaVX3acXFxGD16NJ5++mlkZWVhxowZMBqN2Lhxo7frkwa/bm1nqZ8wUfDMtrW0DaIXSn7JbUvbYrHg4MGD2LNnD3bt2oX9+/cjKSkJGRkZeO6555Cenu6rOqkdMEnSp20yyXFGoJClQVFYWo2OMWFalyE8t6GtXIC88cYbMXnyZAwYMABhYdyozoh6sUcmsoweMUnQpy3j93HW37/B+hfGaV2G8Nx2j9xwww2wWCxYu3Yt1q1bh40bNyI3N9dXtUlGwr1EMBZZWtrsHiENuW1pz58/HwBw9uxZ7N69G3v27MF7772H4uJiDB48GOnp6Zz/mjxGltEjyoVIabA94VdU3REZGxuLUaNGYdSoUcjJycH27dvxz3/+E1u3bmVo15PxdFQ0yugR0VuwssyRQv5J9YVIZchfdXU1+vXrh9tuuw1DhgzxVZ3CE3k37p4aheOnzmtdRrOUBqzgDW3bhUiRcfic/2r2QqTZbMaAAQOQkZGBKVOmYODAgQgKCvJVfeQBspwFHMwtBSB+94hyRiDLdmWA+xe3ob18+XL07dsXAQGaL3AjPKEn6BG4NHvrv/4FAFAn+Ar3yoVISTYr+Rm3aTxw4EAfleEHBN6DZWtpGU2Ch3Z9fTxQkxZU3RFJchM5W5yRpaUtsv/Un7XIIC2Ra7y2BEPbQ8Tfja1Ebh0O7JkAAOiZFq1tIc2QbfSIwB85AKBbSrTWJUiFoe0hIoehyLXZS0uyLooaGCD219LWpy3HZhWS/XdS8OvOwnHbp52Xl9fsG6SlpXmsGPIOWbJF9L5shQxD/kRnf7LC0G4Zt6F93XXXQafTuWyp6XQ6HD582CuFkefYf3wWi7g7iSzdDsodkbJd4BWJY0tb0C+koNyG9pEjR9w9TXbEPlUWujgbaVraysFFjs0qJHaPtJ7YnYcSEXn/dWhpa1dGs2TpK5bljEBkDt0jXDykRRja7YDoIaiQpa9458ECAGIfAO2JeCHaYmZLu7UY2p4i4I7RQOTaGsjWVyxiGMrCzD7tVmNoe4jIu69DtggcNLK0tKnt7L+GzOyWYWi3A7JEoQx92hYJLhAot9kP7t1R40pcs29p8xpBy7gcPXLNNdeoOm3Zvn27J+uRlshBI2q4NFZnNGldQrM++/aE7WdRN+vc5TsBNKwWL2Kd9kFdJ8moIVG4DO1Fixb5sg7pidy/ad9HLG6VwLmKi1qX0KzXP96vdQnN+uFoEYCG0BaR/e4i+lwzonEZ2pdffrkv6yAvEvh44uBkQYXWJbjV+DRe5AM1IHZfsf22Cw8N1LAS+bgM7SVLlqh6gxkzZnisGPIOSa5D2ogaho1n9xOzyga21eIFLFTp0+6WEoW+3eOx+buTGlckD5ehXVBQ4Ms6pCdozlgJXZw8zI23o+CbVeQLfMqmvPHKS3hrTQu5DO2FCxc2+8tm2Val9iKRxxaLW1kD+4AR9RhjsrtgFmAQf+BVk4OMQJTaBF/DWUit+uYdPXoUWVlZuPrqqz1dD3mB474r5o5skqABYN9wDQzQC7olG5htQyjFq1QpiTfWtJzqxR/Pnj2L9evXY+3atThy5AjS09Px9NNPe7M2uYi3XzQQcKdtrPR8jdYlNMu+pR0YoBcyDE8WlNt+Frl7pKK6FoD1YB2kE/+sRSRuQ7uurg7Z2dn45JNPsGPHDnTu3Bk33XQT8vPzsWTJEsTFxfmqTuGJu3vIcSHy3gWfa11Cs+y7GwyCntcXllZrXYIqqzZZp3Te9v0p3Di8q7bFSMZtaF955ZXQ6XS49dZb8fDDD+Oyyy4DAKxZs8ZjBZSVlWHmzJn49ddfERQUhC5dumDu3LmIjY312N9oz8xmixStWHsitmABsVuuigC7VX90gh5YgIYpC0wmM2f5ayG35yW9evVCRUUFfvzxRxw4cADnz5/3eAE6nQ5/+tOfsHnzZqxfvx5paWlYvHixx/+Ot4kaNJu/O6F1CX7jH2t/AgBMvqEPdDoxz1rsl2q79BJrw0fAMgFxRyMKz21ov/vuu9i6dSuuvPJKrFixAldeeSWmTZuG6upqGI1GjxQQHR2NoUOH2v49cOBA5Ofne+S9CSg+d8Hh3zLsJKLW+M1+6/cyLioEELR1aB/aGb0TNazEPdvWE/XDFlizVwA6deqE6dOnY8uWLXjnnXeQkJAAvV6PsWPH4vnnn/doMWazGWvWrMHIkSM9+r7ecr5S/NuuyfOUm1ZEPLsS+dZ1ezrbvCgWUY9/wlI9egQAMjIykJGRgWeeeQZbt27F2rVrPVrMvHnzEBYWhkmTJrXo9+Liwj1ah1r2rVgB91+nRAyaJgQv0aDXCXuLuLOx2SJ+5Mo4d9HHuyckRGhdQhMtCm1FcHAwxowZgzFjxniskKysLJw8eRLLli2DXt+yD7K0tLJFF4k89UHYt2pE3DEA+cbBRocHa11Cs/R6cS+dWepHJd53Sz+hzwiuHJCCXYcKMHXMZU268LT27YEzSIgORY+0aBQXt2w+HF+EvBCHuZdeegk//fQTXnvtNQQFBWldjmr2eSjqHZGihosrsZEhwm5LhW3KUwHLVFraaYnhtjpFvDPypTU/AAAiOgQJd9ay4J1dePTlL7Uuw6VWtbQ96dixY1i2bBm6du2KO++8EwCQmpqK1157TePK/ETjHUK8/ddBaEiA8PNqG/Q6QKcT8uBiuz1cr7O1tEUeqihYXktB89Du2bMnjh49qnUZrWK0n7xdwP2iuqYOH2zN0bqMFgkOMqC2TuzQ1gvcp610heh0koS2qBtSYEJ0j8jKaBR7cYHvjxRpXYIqeYXWfsNLL4mVouVlqL/mImCvgy2g9Tqd0N0jCp0OvLmmhRjabWAUfJKj0OCmJ1Ii7r5/fdu6PJaygomINdoLDQ4QNmaURrVekpa2LEMURcLQboNZr39j+1nEK/SBdsOpJt/QR8NK3FMyJSjQIMXpckiwQdhlYWwtbX1DIAq9BKNO2E0pLIa2H9PbzT2hjIcV8eCihEtwoMH6gIA12m+3jjFhTR4ThXK2EhhggDJyVujuEeiEnXxLVAxtP2Yf2mK3ZqyhIvKNFkoLdvy1PdAhNBA6iNmNY6wP7QCDTuhx2gqzxQKDQJ+7yNtKIc7WkpyIn7XILSx7Fy5a57EJCqw/G9CyGBeM9aEdEWZdhFYnaGrX1feFBAToGy5ECtynbTKZherXlmGXYWh7iIhjdmVoNQD2oW3QuBLXlAUQlJEjIo14qK6pQ86vZQAahqEGGgy2lvYbnxzQrLbmmMwWdo+0EEPbUwTMR/sWlkCNmSZ6psUAAK4ZnCpsncpK7AEG8aYumL9iFx5f8hVq60y2Pu2AAJ1QLdjG4qNCAACpHcOhN4hTpyAfqVsMbT+mjEjslhJle0yUoLGXHN8BMRHBGNyrIwAxa1RasLb+V504Z1fH8qytbJPZgvL6mSetFyLFCcPGEmLCMKBnvPUmIJEOLiJ++RphaLdS464HET/qbd/nAQDuGt0bIt8wbLY7RRap28GeuVFLW6QqbdOcWix4b4v17mL7C5EiMlsstroNbGm3CEO7lRpf2xGx/1jpK44KF3sSLpPZAr39CALxNiWM9ctjOfS/ClKn0lC1/woGGvRitWAbMZsttoMK+7RbhqHdShdrPbNyjzftPFgAAEhJaJhvXJCccWAy2bW0Bd1/TY26R3Q6cbalsskcFh426IVvaSsHFUMLp2L2JgHbXk2Is7Uko7Ri+3WPByDeh326uNL2s14n7gRHAGAymx1aW6L0FdtT+rQDbAEj0Aa1G9rXp2ssBvS0ficFzmyHLjGxDi7iffcaY2i3UnWNNbTDQjSfKNEp+xkIHXYK0Y4ukGPYlzJ6xOAwekSMbWlraZstDn3Fok0J8OOxYmzY8QsAcbtHBPlI3RIzcSSgtLSdTcokAvt5R+yXxxLxPgtrq8uu20HAGk2N+rSF6h6xfbYWWCwWwVquDZ5Z9l8AwJgR3Rp1j4hTryifqTtsabfSyk8PAbBO2g+I0+pS2O+4er3OFooi3h1nvRDZ0L9pErBGZSV2+z5tcdRPDGWyWFuwYhXnlH1LW9SDjKgY2q3047ESAA0hKF7MNNDrGiblMQk4nazJ1NCnbdDrYBawxo+yjwEQe/SI2WKB2SLHdKdmc0OdIoW2aI0vZxjarfD+1oaVdhKiQzWsRB3Hpac0LsYJU6OLUiK2tBUV1bX1P4mz3JiS0dl78nAi/7zDKJIbh3dFZAfxhnyaLBbbLIQidY8I8pG6xdBuhdWfHbH93Klj/XA6wT7sxpNFidrSrqyuxf6fS1BRXQfAGtoiduEoBtXftSlSY1a54Lhmy1GYLcCew4W250Q9CBqNZtusjiLN7ijelmpKnK0loREDUmx38In2YTc+y1Na2j8dL9GgGte27DwJoGHJMYOgIaMIs7vwLMqZtLuGqkGvF+4gWF1Th7PlNQgMsMaP8v+kDrdWGwQHGWzjrUTrC1N21McmDgbQ0NJe8sE+rUpyqnF/pqgtwx6pUejTNdZ2IVKv0wn0mbtObRG351vrfgIA7P/Z2oAQqqUtzGfqmjhbS0LBgQaRbrFwoHz5lB1CpIs99hrXZdDrbMPrRGIBEF4/lzZgndvDKEidjbtqhvVNsv0s4oXdc7ZJrcTrHpEBt1YbdAgNbP5FGlEaDCKOhbXX+BZmg0Ev5OIN9rfaA9agUVaJ0VrjT/a2kT1tPxsEvEag3OMQFmLdf0RqUAj41WuCod0G3/10xulkPSKwBV99fSLN72BPCUJl9jy9TryWIWC9w9R+WazAAINtlRjNNWpq2y8modfrYLaIddpfdcF60blDiLiNHpGJeTufJDIzOkOoOSicUBoxIrVm7Cn9rYsevhqAuN0jF+tMDQsPAzhQf0H3bHkNYiNDtCoLQNPuEfshfgbbUE+LMFOgKiOFRLwAKd43rynxtppE+naPs/0sUksGaLgQqRPwBgZ7dUYTAOtCCIB1bo9ao1mo7VlQWoXisgtOl0PLt5uYSyuNP1n70NbbhnqKsz2VsP5teqrGlThh970zinIm1QhDuw06hAY2dI9oW0oTTfq0RRpYbOdinTW0lUAsK7depFr75XHNamps1t+/AQAEODnwibCuZUyEY0s/MKChJvuWtijOlFQBAIb2Tda4kqbst1Jt/XdTNAztNkjtGCFs50jjPm2R1uGzV1dnhk7X0Kddcv4CgIa5PkSg9MHW1DbdiUU4g0lO6ODyORFb2s5ERwRrXUITykyeomFoe4pg+4SywGtQ/amoqKNHao1mBAYYbN04yvAvkUImJMh66aeqpq7JcyK0YN19srKE9m/T04Q4a7HvlSuvqnX9Qg3xQmQrRIQF4epBnQAAOuX0U6A+WKCh2yE40PoRi9AidKa2zoTgQMdpZIGGlWJE0DkpAmfLa9AxJsz22NWDOuGrvaeF6Pe0WIDkuA748+R0JMeHOzwn8uyO9nSAEEOw7K+lnK+8iIhY8eYWYku7FSwWi60vO7S+FVYj2PJjF2uVvmLrRxwUoH0rxpnaOpNDH6wy9r3yQtNWrVaUi6STRve2PTZqWBcAEGKki7n++9gzLQbhje4daGhpa39wsdcpwfHgItL85ArlcxcNQ7sVLHYTuAcHWQNn79FiLUtqwtbSrq9PxD5Di8WCrbt+xdnyGttjysiHCoFOTU0mC2IjgxFiN++I0oIVpaXtapUaZTGMOkFuBFLMnza8yWMCNLRtNUwb3w9JcQxtv2G2wNaRmFo/y19IsFgt2aMnzgJo6B6JChcvtM9XNg1m5SDj7KKfVkxmM/SNbk5SLpyK0FdstpvmtDHlIKh1/2zjIZwhjVZ8Em1pNKGmcWyEod0qDS1t5SKVWYDTZHsbvskF0NA9YtDr0KdrrJYlNaHMQWEvIky8uZ8v1jr2uwMNK9iI0dK2uAy9yHAxQrvxwa3xMn0Ggw5Gk1nzvndR5kh3h6HdCvbfK71ehwCD3tYdIYreXWIAOLaw+/eMr1+DUYwvpjJe90/j+toeu3F4VwDA2Ku7aVGSUxcuGpuEjG2Ui8YH66oLdTh+6rzLESRRHayf/3knB0hfsj+4LXr4qiajmZRb2rW+NmQ0KjelaVqGW0KEdm5uLiZMmIBRo0ZhwoQJOHHihNYluVVnNDvcghsUqEetIH2G//nqOOYt34nAAAMu6xbn8JzZbIHFIkb/ptFkxoJ3dgEAhvdLsT0eGGBAUKABAQLNlXK+qrbJGYASOlrPP7LgnV0oPFvtsn0YVd/S1jq0lRb0tYNT0dvJGV9Y/VqrVRe0De33NlsXONl7tEjTOtwRYs947rnnMHHiRGzevBkTJ07Es88+q3VJLimncPbzUAQFGoS5e+of637CrkMFOHC8BAWlVQ7PKescbt31qxalORg/c73t54QYx2FVoiyE8Mvp87j58XX4Oe8cYhrNL6L0vV/UuGV4LK8MgHUFIGfCQgIRGhyA0vM1Tp/3FWUa256do50+r8z4V+1kLLwv5RVZF+OouSjG/uyM5qFdWlqKQ4cOYcyYMQCAMWPG4NChQzh79qzGlTlna7HYnT6JFNr2Gu+oSq9IzUVtg8Y+kKeOuazJ8wEGnRBD1A7YrfIzuH6ZMUV0fbeTs355X1Kuqbi7ey8qPEiTPu09hwvx7qbDABrmmAl2cQON0j3i7AYmX1K6vRLjwpp5pXY0D+0zZ84gMTERBoP1wzQYDOjYsSPOnDmjcWXO/Xe/ta7IDg19xSFBBqFGOygeuWOgw78vSYkE0HAqqhX7A5yzncOg12veVww4Th06vL/jPBlBgQZ0CAnAufKWhXbp+QsOazi2VYjtPgHX37/IDtqE9py3vsO/Ps+ByWS21ecqtMNCmz/4+IKygMRddmPyReMXd0TGxYU3/yIPKa2fG+O3gxtmKIsIC7JbpVscv7u8s8O/7x/fH395bQfyS6pc/IZv2Id2Rp/EJs/r9TohRmXYD+MMdHJzUnREMMpa2NJ+YunXKDl3AetfGNfm+oCG0UGxka6HdEaEBdkm4tLC6s1HMGKA9Q5ipVupMWXtTa27R5TrPcoBOyEhQstynNI8tJOTk1FYWAiTyQSDwQCTyYSioiIkJ6ufAay0tLJFQ4Va+0EYTWZ8vO1nAI7jTKsu1OHEmfJWvac3NR4G1jnJ+t+t9UiX2jrrjnH90C5OW17hYYFCHASVg8uih69y+nx0RAjOVbQsDEvOWQ/6RpPZI8tsKRfE7S/mNnaqqBKFZ6ux/YdTuHaw76dD/fCLY+iabD3LCw5yHjnKnbAnzpTj6kE+K83BkRNncSzvHHS6hu1aXFzRovfwRchr3j0SFxeHPn36YMOGDQCADRs2oE+fPoiNFWtMMQA88sJ2p48rF4G07isGGkYLOBMRFoSQIIPLU1TA+t/i7ZEGtfX9m/26xzl9Pj4qFHmFFZoPTVSmAmh8oVQRFxViC+HWvndz8gor8OMx53fbFpddwM+nzgMA7rEbNtnY8P7WQH9h9fctrLLlqi7UOe2KWbTK+rddLXwQHR6M2MhgbP7upMuLqt5iMpmxZedJ/PmVr/HtgTNu7zAVgeahDQCzZ8/GqlWrMGrUKKxatQpz5szRuqQm8gorkFdoPeouesSx5TXphj4AgNJyba/QAw23LbsSHuq+FTvpuc8w6bnPPF2Wg9pGc2g3NqBnPE4XV+FUkbYLDCirhbtqHSZEh1qH27Xi4KL2wvWDz2fjmWX/dXgsr7ACE//vU/zP/C22x9y12u/IbFgz0tUZYXVNHQ7lljZbT3lVrduFH+6ZvwV3PbsJZS72BftJt+wZDHokxXVAeVUtZry4vdk6WqOm1mi7IGrvo+xjeOVf+7zyN71B8+4RAOjevTs+/PBDrctw69P/Wu8wXPzIVejVxfEsQJn85pdT55tMhONL5VW1KDlfg6jwIPxt+ginryk5X4MvdufhnrF9nd596OmhdsrdepUX6rDpv7koKK3Glp0nATSdvF/Rv2cCAGDzdycdbrzxtOw9v6Jf9wSHlvSPOcVIjAvDG58csF0wDAt2vpsoNy49sfQr/G36VbZWpNL1UXr+AiI7BDu0LpVV3JvrorJYLE5v8y8qq8aDz2c7PDb3vivcvld4WBD+Met3uHfB53h48Tbb4ynxHTBv2nB0jAnDhKc/bfJ716an4uqBnXDiTDkiOwRh1LCu+PPSr5BfUuW0T/6b/fmoqr+Q+Mc5mwEAQy9Lwn239ENu/nn0uSTOYVWdxu4f3x8zXtyOorILWPDOLtw2sid+Ol6K313eGSXnLsBisaBLciT0Op3TWSvd3RkKABOe/hSJsWF4feZILFq1B7dc3QO9usTgk+0/214TGxmMBQ8633dEobNofQ7qAZ7q0y6rqHEIkrLyGmzZeRKrPjtie8zZl7XOaMKtT1q7d+4ZexluurKbT9e/s1gs2JdTjGff/BYAcMPwrnjw9wOcvvbl93/AF7vz0DkpAmNGdMNVAzs5zAx38+PrAABrn7/ZYSFbRVFZNf689GvMvf8KdEmKxOniStTWmXBJSlST105+7jOcq7yIXl1icPRkWZPn1y4a63Se74t1Jtz2F+v2zHpoBLomR9rG8dr/N1+4aGzyuMJstqC2zmS79mCxWHCu8iICAwwwmcz45fR52/b6cOFNeHnNXqcLL3TrFIUlj13r9G9UXqjDH56xhp1er8MH829E4dlqPLR4Gx6bOBgvvvcDoiOCER8VgucfvhqBAXrc9tQGXKw1YcGDVyJ7dx5+P7KH7UBvNJlh0OtRW2fCW//5CZu/O+n07yquu7wz0hIjMP7aHm5fp/if+VtQXNa67pzGLr80CXtzipq9UevDBTc1mWfEnY+yj+GfGw+pem1cVEiTYa2XXhKLQ7lnce3gVAzoGY/jp8/j+8NFOFPa/MX3MSMuwX239HMIfhH7tNtdaJ8oKMfKzTm4ckAKai4a8fG2n9Gvezxy8883Ox1o3+5xWOjiKKyEnaJrciRKz9dg/LXdkRTXAR9+kYOBv+mIAIMOwUEGXKw1IS0xApEdgvDqv/ahpP7Ld/NV3VBdU4czJVUIql/x+1RRBdJ7J6Lk3AVUVtfhl/zzbuv85Pmb3Z4uj3tiHZxtrsk39LGNqwWA0GADLri5yaBnWjSO5Z1zeOyqgZ1QW2fCzoMFLn/vhiu64sHbnB9UFMrBRa2hlyXh4C+lHp3SdcUz17vsz1b856vj+Me6nzz2N9UICwnAnydlOB1505zn392Dr/eddvl8eu+OGNSrI7784VSTz1atR/8wCJEdghEVHoSeaTEt/v2LdSYs+3g/Pt/tu5vAnn/oKvS5pOl1NIa2l7QktP/nb9nNv6iRaeP74Yr+KQgLDnDZasjNP+/yQqWvDOubhFl3X97sRZSfT53Doy996ZUaAgx6h+F6kR2swyHjo0Px9N2Xo3tqtOr3emLpV05b6N70h+t7YeKolo3RLSitwuJV3+Por56v1TpXjHVo5F2je+NCjRH9esR77P2NJjPWfXkcVw5IcTkVaU2tEcVl1u6JZ9/8tn5suAWZQzrjN51jkBIfjppaI1ISwj2+QpLZbIHJbMGpIus1pfDQIAzoGY+Pt/2M9Tt+wehhXZFfUomC0iqMGNAJlRfqsPtQAXLzrX33w/snIy4qFF/+cAoZfRIx4brfIDG2Awz1w0oPnziL3l1iXZ4ZM7S9pCWhfejEWSx+fx+uGtgJQYF6lFVcRN9ucQgOMiAlPhyHckvRJSkSfbvHIToipMVfwrKKGrzyr33IL67E6WLrKVlsZDA6hAYir9B6AUevAyI6BOFCjRHhYUEY3i8ZQYEG/PRLCXJ+PQfAOgSqf4947DxYgG4pkQgNDoQFFnSMCcP1Q7ugptaI+KhQpCVGtHpVGovFgqoaI4xGM/69/WeMGJCCbd/n4Y7f/Qaf/fcE4qJDUWc0I7+kEqfrLwoOvSwJl14Sh43f5OLor2WoM5qRGBuGXl1icOu1PRBg0ONseQ2CAg0IbmakSktrPXGmHGUVF9G7SwwKz1YjONCAnLxzSIgORXVNHaLCg6HX63As7xx6pkajc1IEcn4tw4kz5bjObnihyWQGdDqvLcFmMplReaEOYSGBOF95EaHBAQgKNKC86iLqjGZEdghy2q1jMluEXRauvWJoe4mvxmkTUfsiYmgLMeSPiIjUYWgTEUmEoU1EJBGGNhGRRBjaREQSYWgTEUmEoU1EJBGGNhGRRBjaREQSYWgTEUmEoU1EJBEhFkFoq9ZOmERE5I6I2eIXE0YREbUX7B4hIpIIQ5uISCIMbSIiiTC0iYgkwtAmIpIIQ5uISCIMbSIiiTC0iYgkwtAmIpKIZrexv/vuu5g/f75Wf56ISDg6nQ5Hjhxx+xrNWtp6vR7h4eEICQlBYGCgVmUQEQnDYrHAbDa7fY0wc4+kp6ejsrJS6zKIiDR19OhRt88L0addXl7OwCaidi81NbXZ1wgR2kOGDNG6BCIizZ06dQpFRUVuX6N5aPfq1UvrEoiIhLFs2TK3z2sa2gxsIiJHd999t9vnNQvt5gojImpv9Ho9Onfu7PY1woweISKi5mnep01EROoxtImIJMLQJiKSCEObiEgiDG0iIokwtImIJKLZ1KxE3jBy5EiUlJTAYDDAYDCgR48eGDduHCZMmAC93n0b5dSpU8jMzMTBgwcREMBdg8TEbyb5nWXLlmH48OGoqKjArl278Ne//hX79+/HwoULtS6NqM3YPUJ+KyIiApmZmXj55ZfxySefICcnB9u3b8ctt9yCwYMH45prrsErr7xie/2kSZMAWCcwGzRoEPbu3QsA+Oijj3DDDTdgyJAhuOeee3D69GlN/nuIAIY2tQP9+/dHUlIS9uzZg9DQUGRlZWHPnj144403sGbNGnz++ecAgFWrVgEAdu/ejb1792LQoEH4/PPP8cYbb+DVV1/Ft99+i/T0dDz++ONa/udQO8fQpnahY8eOOH/+PIYOHYpevXpBr9ejd+/euOmmm7Br1y6Xv/f+++/jvvvuQ/fu3REQEIBp06bh8OHDbG2TZtinTe1CYWEhoqKi8OOPP2Lx4sU4duwY6urqUFtbi9GjR7v8vfz8fCxYsABZWVm2xywWCwoLC9GpUydflE7kgKFNfm///v0oLCxEeno6pk+fjkmTJuGtt95CcHAw/vrXv6KsrAyAdVHVxpKTkzFt2jSMHTvW12UTOcXuEfJblZWV2LZtGx577DGMHTsWvXr1QlVVFaKiohAcHIz9+/djw4YNttfHxsZCr9cjLy/P9tidd96JN998E8eOHQMAVFRUYNOmTT7/byFScGpW8iv247T1ej169OiBsWPH4s4774TBYMBnn32GrKwsnDt3Dpdffjk6deqE8vJyLF68GACwZMkSrFmzBkajEW+99RYGDhyItWvXYvny5Th9+jQiIiIwfPhwDh8kzTC0iYgkwu4RIiKJMLSJiCTC0CYikghDm4hIIgxtIiKJMLSJiCTC0CYikghDm4hIIgxtIiKJ/D/zkGYd4P882QAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "import numpy as np\n", "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "sns.set(rc = {'figure.figsize':(12,6)})\n", "sns.relplot(x=\"Date\",y=\"All I Want for Christmas Is You\", kind=\"line\", data=normalised)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The \"All I Want for Christmas is You\" data looks how it should. \n", "\n", "Eventually I want to start to use the pageview data from the in-linking pages to make a better forecast for this. There are 633 of these pages but I will also need to look at whether a page is a leading indicator by 30 days, 50 days etc. This quickly multiplies out to be **a lot** of potential regressor columns; I am nervous about chucking this amount of data at a regression algorithm and hoping it can figure out what is and isn't important.\n", "\n", "There are certainly situations where this would be a good approach but for this specific problem I don't like it. There might be 2323 rows of data but there are only six Christmas peaks - and if I reserve one of them for testing then that only leaves five for training. This means there is a big risk of overfitting and the more regression variables I throw into the mix, the bigger this risk.\n", "\n", "My plan here is to follow a two step process:\n", "\n", "1. Filter out a lot of the regression variables based on correlation value\n", "2. Setup the forecasting model so that it will only use a small number of them\n", "\n", "There are a few different ways of doing step 2. Tensorflow supports \"Structural Time Series\" (more on this shortly) with a [Sparse Linear Regression](https://www.tensorflow.org/probability/api_docs/python/tfp/sts/SparseLinearRegression) component.\n", "\n", "> SparseLinearRegression uses a parameterization of a Horseshoe prior to encode the assumption that many of the weights are zero, i.e., many of the covariate time series are irrelevant\n", "\n", "Which sounds pretty close to what I want so let's go with that for now.\n", "\n", "Rather than diving straight into the deep end let's start by making a simpler model so we can verify it works" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "import tensorflow_probability as tfp\n", "import tensorflow.compat.v2 as tf\n", "\n", "## Forgetting this line is my number one cause of mysterf tf errors that I can't figure out\n", "tf.enable_v2_behavior()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The \"structure\" in a structural timeseries describes how the timeseries evolves given certain parameters. For example, we might model the value at day `t+1` as the value at day `t` plus a small amount of random noise. This is a \"random walk\" model and it can actually work pretty well for predicting things only 1 day ahead.\n", "\n", "The parameters are estimated from historical data; in the above example the parameter to estimate is the variance of the random noise.\n", "\n", "The first model I want to try is a bit more complicated than that. It is similar to how Forecast Forge works behind the scenes. There are three components:\n", "\n", "+ Two seasonalities; weekly and annual\n", "+ A trend component\n", "\n", "\n", "The trend component looks a bit similar to the first random walk example:\n", "```\n", "level[t] = level[t-1] + slope[t-1] + Normal(0., level_scale)\n", "slope[t] = slope[t-1] + Normal(0., slope_scale)\n", "```\n", "The main difference is that there is both a `level` and a `slope` both random walking around. This means that the model is slower to \"change direction\" than a random walk; if the slope is large and positive then it will take a few days for it to become negative and start trending the other way.\n", "\n", "The weekly seasonality component will estimate an effect for each day. This is the same approach to seasonality that Tom Capper uses in his [Google Sheets template on Moz](https://moz.com/blog/seo-forecasting-in-google-sheets).\n", "\n", "The annual seasonality component is designed to be *smoother* than that. This is actually a weakness when forecasting \"All I Want for Christmas is You\" pageviews because the data is so \"spikey\" but I have picked this for three reasons:\n", "\n", "1. I don't want to estimate 12 different monthly effects because the peak in pageviews is concentrated at one part of December. Adding an average effect for the whole month to whatever weekly seasonality there is won't capture the 7 days before Christmas very well\n", "2. Estimating an effect for each of 365 days slows down the model fit quite a lot and eats RAM like it is going out of fashion. This way of modelling things also ignores any smoothness there might be in the data (e.g. the value for November 23rd is likely to be close to the values for November 22nd and 24th)\n", "3. This is most similar to what the Forecast Forge algorithm does which makes the forecasts more comparable" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "def build_model(observed_time_series):\n", " trend = tfp.sts.LocalLinearTrend(observed_time_series=observed_time_series)\n", " weekly = tfp.sts.Seasonal(\n", " num_seasons=7, observed_time_series=observed_time_series, name=\"week\")\n", " annual = tfp.sts.SmoothSeasonal(\n", " period=365, frequency_multipliers=[1, 2, 3, 4, 5, 6])\n", " # The actual prediction is the sum of the above three components\n", " model = tfp.sts.Sum([trend, weekly, annual], observed_time_series=observed_time_series)\n", " return model" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's forecast for Christmas 2020 and see what it looks like against the actuals." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "WARNING:tensorflow:From /opt/conda/lib/python3.8/site-packages/tensorflow/python/ops/linalg/linear_operator_composition.py:182: LinearOperator.graph_parents (from tensorflow.python.ops.linalg.linear_operator) is deprecated and will be removed in a future version.\n", "Instructions for updating:\n", "Do not call `graph_parents`.\n", "WARNING:tensorflow:From /opt/conda/lib/python3.8/site-packages/tensorflow_probability/python/distributions/distribution.py:342: MultivariateNormalFullCovariance.__init__ (from tensorflow_probability.python.distributions.mvn_full_covariance) is deprecated and will be removed after 2019-12-01.\n", "Instructions for updating:\n", "`MultivariateNormalFullCovariance` is deprecated, use `MultivariateNormalTriL(loc=loc, scale_tril=tf.linalg.cholesky(covariance_matrix))` instead.\n", "WARNING:tensorflow:From :15: StructuralTimeSeries.joint_log_prob (from tensorflow_probability.python.sts.structural_time_series) is deprecated and will be removed after 2022-03-01.\n", "Instructions for updating:\n", "Please use `StructuralTimeSeries.joint_distribution(observed_time_series).log_prob`\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "observed = normalised[normalised.index<\"2020-11-09\"][\"All I Want for Christmas Is You\"]\n", "observed = list(observed)\n", "\n", "model = build_model(observed)\n", "\n", "# The below is mostly tensorflow voodoo\n", "# The output will be a loss curve plot; we want to see that this converges before proceeding\n", "variational_posteriors = tfp.sts.build_factored_surrogate_posterior(\n", " model=model)\n", "\n", "num_variational_steps = 200\n", "\n", "# Build and optimize the variational loss function.\n", "elbo_loss_curve = tfp.vi.fit_surrogate_posterior(\n", " target_log_prob_fn=model.joint_log_prob(\n", " observed_time_series=observed),\n", " surrogate_posterior=variational_posteriors,\n", " optimizer=tf.optimizers.Adam(learning_rate=0.1),\n", " num_steps=num_variational_steps,\n", " jit_compile=True)\n", "\n", "plt.plot(elbo_loss_curve)\n", "plt.show()\n", "\n", "# Draw samples from the variational posterior.\n", "q_samples = variational_posteriors.sample(100)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The model converges (yay!) so we can use the parameter samples from the posterior to get the forecast values" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "forecast_dist = tfp.sts.forecast(\n", " model,\n", " observed_time_series=observed,\n", " parameter_samples=q_samples,\n", " num_steps_forecast=53)\n", "\n", "forecast_mean, forecast_scale = (\n", " forecast_dist.mean().numpy()[..., 0],\n", " forecast_dist.stddev().numpy()[..., 0])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Quick inspection of the forecast_mean data. We want to see values somewhere between 4 and 8 later in the series" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0.35289314, 0.46619806, 0.48649132, 0.4791094 , 0.55845815,\n", " 0.63580596, 0.7344554 , 0.8415572 , 0.9938936 , 1.0518934 ,\n", " 1.0805393 , 1.1938901 , 1.3028748 , 1.4304701 , 1.5635145 ,\n", " 1.7384964 , 1.815573 , 1.8594788 , 1.9840505 , 2.1000252 ,\n", " 2.2302155 , 2.361333 , 2.5297706 , 2.5956268 , 2.6236136 ,\n", " 2.7275822 , 2.8183236 , 2.9187396 , 3.0156708 , 3.1456726 ,\n", " 3.1690443 , 3.1507301 , 3.2048495 , 3.2424893 , 3.286877 ,\n", " 3.3252015 , 3.3943956 , 3.3551486 , 3.2728195 , 3.261949 ,\n", " 3.2340572 , 3.2128124 , 3.1858494 , 3.1905372 , 3.0880094 ,\n", " 2.9440494 , 2.8736162 , 2.788633 , 2.7131534 , 2.6351662 ,\n", " 2.5923865 , 2.4462488 , 2.2628186 ], dtype=float32)" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "forecast_mean" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hmmm, possible a little low.\n", "\n", "Pad these forecasted values out so we can compare them with the actuals in a plot" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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M4/L7j1X59GMjo0bN6G+foLew8ipgeqBs6G5eS9qaxP/ppnWFHObZyIiIjIkZooplxgUExEREVHeY1BMREREhsREMeUSg2IiIiIyJJ2XPeVMvvycuTCSf0sGxUREREQ6cToL4PEcZmCcBaqqwufrgdU6vP0zRrzNMxEREdGoyIM4sbGxEfv370dTU99tm8cqRRm97hNWqx1lZVXD+94sj4WIiIgoK/IgJobNZsPkyZP1HkZOJW/BbCQsnyAiIiKivMegmIiIiAyJdbaUSwyKiYiIiCjvMSgmIiIiQ2KimHKJQTERERER5T0GxURERGRITBRTLjEoJiIiImNi/QTlEINiIiIiIsp7DIqJiIjIkJgnplxiUExERESGxOoJyiUGxURERGRIyZt3eAMR7Gvu0XE0NNYxKCYiIiLDu/YP7+Dqu1foPQwawxgUExERkeHtb/HoPQQa4xgUExERkSGxpphyiUExEREREeU9BsVERERkSCqbslEOMSgmIiIiY2JMTDnEoJiIiIgMiTEx5RKDYiIiIiLKewyKiYiIyJBUtp+gHGJQTERERER5j0ExEREREeU9BsVERERkSKyeoFxiUExERESGxKCYcolBMRERERkSN++gXGJQTERERER5j0ExERERGRMTxZRDDIqJiIjIkBgTUy4xKCYiIiKivDdoULxkyRIsWLAA06dPx7Zt2+KP7969G4sXL8aZZ56JxYsXY8+ePaM5TiIiIsoz3NGOcmnQoPj000/HU089hYaGhpTHb7rpJlx44YV47bXXcOGFF+LGG28ctUESEREREY2mQYPi+fPno66uLuWxjo4ObNq0CQsXLgQALFy4EJs2bUJnZ+fojJKIiIjyDhPFlEvDqiluampCTU0NLBYLAMBisaC6uhpNTU1ZHRwRERERUS5Y9R5ARUWh3kMgIiIiA+LmHWNTVVWR3kNIa1hBcV1dHVpaWiDLMiwWC2RZRmtra58yi0x0dHihKLn9pTfqZBAREVESxsRjUlubJ6d/nygKGSVhh1U+UVFRgZkzZ2L58uUAgOXLl2PmzJkoLy8fztsRERERZYQdKWi0DJopvv322/H666+jvb0dV1xxBUpLS/Hyyy/j5ptvxs9//nM8+OCDKC4uxpIlS3IxXiIiIsoTDH8plwRV50sulk8QERFROgdaPfjukv+kPPbi3YsgioJOI6JsGFPlE0RERESjjZUSlEsMiomIiMg0GCfTaGFQTERERER5j0ExERERGVLaZU+sqaBRwqCYiIiIiPIeg2IiIiIypHQ5YeaJabQwKCYiIiJjYgRMOcSgmIiIiAwpbaaYgTKNEgbFRERERJT3GBQTERGRIaXfdJepYhodDIqJiIiIKO8xKCYiIiLTYE0xjRYGxURERGRIDIAplxgUExERkSGlqylmnGw+4YiMYFjSexiDYlBMREREhpS+JRvDYrO54rbX8f+uf1nvYQyKQTERERERjZoeX1jvIWSEQTEREREZEzuyUQ4xKCYiIiJDUhkBUw4xKCYiIiLTYJhMo4VBMRERERkS19RRLjEoJiIiItNg9wkaLQyKiYiIyJAYAFMuMSgmIiIiorzHoJiIiIgMiXliyiUGxURERGRMaaJiVlTQaGFQTERERER5j0ExERERGVK6rDATxTRaGBQTERGRIXFHO8olBsVERERkSGnrh1lUTKOEQTERERER5T0GxURERGQazBPTaGFQTERERIbEHe0olxgUExERkWkwTqbRwqCYiIiIDCn9OjtGxTQ6GBQTERGRMTH+pRxiUExERESGxD7FlEvWkb7BihUrcP/990NVVSiKgh/84Af4r//6r2yMjYiIiIgoJ0YUFKuqimuvvRZPPfUUpk2bhi1btuDrX/86zjjjDIgik9BEREQ0fGm3eWbymEbJiCNXURTh8XgAAB6PB9XV1QyIiYiIaOQYAFMOjShTLAgC7rvvPnzve9+Dy+WCz+fDQw89lK2xEY15Xn8Y1z7wDq675DhMqCvWezhERIbHOmMaLSMKiiVJwkMPPYQHH3wQ8+bNw6pVq/Df//3fePnll+F2uzN6j4qKwpEMgcjUVm1pxf4WL/7+xjZce8l8vYdDRGQoDIDHpqqqIr2HkNaIguLNmzejtbUV8+bNAwDMmzcPTqcTO3fuxOzZszN6j44OLxQlt7/0Rp0Myj9av01REHQeCRGR8aStH2acbHptbZ6c/n2iKGSUhB1R8W9tbS2am5uxa9cuAMDOnTvR3t6O8ePHj+RtifKGdj0osAyfiKgPxr+USyPKFFdVVeHmm2/Gj370IwixTNedd96J0tLSbIyNaMzT7pIwU0xElBkGyjRaRtyneNGiRVi0aFE2xkKUd1g+QUQ0AEbAlEO8aUuko3j5BGNiIqI+0i20U9momEYJg2IiHcUzxSKjYiIiIj0xKCbSkRILigWmiomI+mBSmHKJQTGRjtT4QjudB0JERJTnGBQT6UirKeZCOyKivtLVDzN7TKOFQTGRjuLlE0wVExFlhEExjRYGxUQ6Yks2IqL+Mf6lXGJQTKQjRYn+nzExEVEaaaLidG3aiLKBQTGRjpgpJiIiMgYGxUQ6SrRk03kgREQGlHajDiaKaZQwKCbSkcLNO4iI+sX4l3KJQTGRjlS2ZCMi6hcTxZRLDIqJdKQo3NGOiIjICBgUE+mI5RNERANJt3kHc8U0OhgUE+koUT6h7ziIiIyI8S/lEoNiIh2pKssniIiIjIBBMZGOEjXFOg+EiMiAmCimXGJQTKQjhd0niIj6l677BCNlGiUMiol0xPIJIqL+cUtnyiUGxUQ60sonRH4SiYgywkCZRgtPxUQ6UpgpJiLqF0slKJcYFBPpKXbAZ0xMRJRGuqCYgTKNEgbFRAYggFExEVEmGBPTaGFQTKQj7eDOTDERUV+sH6ZcYlBMpKN49wmdx0FEZETpaoq5zTONFgbFRDrioZ0ot1RVxeOvbEJLp1/voVAGeIykXGJQTKQnHvFN67kV2/HrRz/Wexg0RPuaPXj239tx12OcO7NiophGi1XvARDlM7XX/8k8/rp8k95DoGHQ2iBKMj91psAImHKImWIiHWm1cTzuExH1xUMj5RKDYiID4AprotzgBSgR9YdBMRER5Y14xxe2fDEFdp8wPzPNF4NiIh2pLComyql4b3A2QjQJHhzNzkQxMYNiIj3Fa4p1HgdR3khExWQCaTPFuR8GjYCZ5otBMRER5Q3W7xPlmIlSxQyKiXSkHStMdMwgMjXtsyYyU2wKaY+NPF6aipmmi0ExkY5Udiom0gdX2pkEj41mx4V2RDQkJjpmEBHpiodLczHT+W3EO9qFQiH8+te/xgcffACHw4E5c+bgtttuy8bYiMY8Mx0siMaCeEs2ncdBmeEx0vzMNIUjDorvvvtuOBwOvPbaaxAEAe3t7dkYF1Fe4I52RLkVbz7BqNgU0pYU84BpKmaarxEFxT6fDy+88ALeeustCLEjTGVlZVYGRpRfzHPQIBoL2KfYHEwUT1E/zDSHI6op3r9/P0pLS/HAAw/g/PPPxyWXXIKVK1dma2xEY56JjhVEYwM/dEQ5lTeZYkmSsH//fhx55JG47rrrsHbtWnznO9/Bv/71LxQWFmb0HhUVmb2OaExiSzainNI+ayyfMIu+B0ceL82vqqpI7yGkNaKguL6+HlarFQsXLgQAHHPMMSgrK8Pu3bsxa9asjN6jo8MLRcntb7hRJ4Pyh6qqUNWkPsX6DocobyjaQjtGxaaQHADPnlqJdTu4bsls0l3EtLV5cjoGURQySsKOqHyivLwcJ5xwAt577z0AwO7du9HR0YEJEyaM5G2JxrxfP/oxzv3ZS/GvzXR7icjM+FkzLzF2IcM5NBczzdeIu0/ccsst+MUvfoElS5bAarXiN7/5DYqLi7MxNqIx68MNzQC45SxRrpno/ExIvYsmchtCUzLTR27EQXFjYyOeeOKJbIyFKO/wBE2UW1q5HqsnTCLpIKkFxTxsmouZznPc0Y7IAMx00CAyM9YUm5fIOTMlM5VPMCgm0pGZDhZEYwE/cuaSPF3xmJhzaCpm+swxKCbSkRr/v4mOGkQmppjpDE0pARVris3JTOc3BsVEelJ7/Z+IRlWifELngVBmkmuKte4TPGCai4mmi0ExkY60g7uJjhlEpqZqC+24zbPpMFNsTmY6vzEoJtJRrjeuIcp32keOmWJzSFdTzAoYc0leO2P0dTQMiol0JMfO0AY/ThCNGawpNhfWFJufmT5yDIqJdKQFxaY6ahCZmMqaYtNiSzZzSj69Gf1Ux6CYSEeyrOg9BKK8ovIjZyrJi+oYFJtT8hwaPCZmUEykp3j5hM7joKExel0c9S/efYIL7cwhTfkEP38mY6LpYlBMpCNZZk2xGXG+zCteU8yY2BSSP2rc5tmcFBPVTzAoJtKRFCufYN9Nc2GmyrziNcU6j4OGjuvsaLQxKCbSkcyWbKbEaTMvhTXFppLSfSLek02fsdDwpCSK9RtGRhgUE+kovtDO6EcKSsFMsXkluk8w7WgOic+awFSxKaUstDP4oZNBMZGOJJkL7cyIvW7NizXF5sXNO8zJTPPFoJhIRzLv5ZqSmQ7ylEphTGwqyZ+1Qqddv4HQsKXeWTP2wdOq9wCI8lk8U8woy1Q4X+bF8glz0T5qP1o8F+UlBdHHDB5YUSoTNZ9gpphIT9y8w5yMfmCn/qlcJWky0fn67DH1zO6byJ6mHqze2qr3MIaMmWIiHUnsU2xKzBSbl8y5M6XkgJhTaHw/uGcFAGDZveemrMEw+tQxU0ykI4U1xabEZKN5xdfZMe1oCskBMOfMpFLKJ4x98GRQTKQjSWFNsRlxvswrsXkHIywziH/SOF2mZaajJYNiIh1JEjPFZsSWbOalKNpCO50HQkMiCAIvZExKNdHuHQyKiXTEHe3MSTXR7UBKxY+cuaT7fPEzZy4miokZFBMZAY/x5pJ8UubcmUuiJZvOA6EhEeL/IbMx00UMg2IiAzDPIYMAIHl9JOfOXFj6Yi7pFkZyBs0lZesOg3/+GBQTGYDRDxSUSjVTN3pKoV3QcPMOsxGY3TcrEx0iGRQTEQ0Rs43mxQtQc0m7ex2n0FTMdLxkUExENERmWjhCqcx0gibEP2CCkGijx22ezcvoHz8GxUQGYPQDBaXiQjvz0uZLYRsKU2HlhHmZ6e4Mg2IioiFKzTaa54BPDIbNJmW2YpGxiWKsvKeqqXl9o08dg2IiA+DtQHPhOjvz0rJWnDdziM+TkLR1B+fO0JIzw4qiQlVSnsz9gIaAQTGRERj7OEG9sC7VvLREMefQJOLbcic6hjCJYGzJHy1FVU01XwyKiQzAPIcMArjQzszMVN9ICYKQ6FXMKTS25M+YLKumOl4yKCYiGqLUhXZGP8xTMq2mmJlic0iepXj3CU6doSVPT+/PmdHnjkExkQEwsDKXlMVanDpTiZ+kOW+mkNjRLrF5h5lux+ej3jXFZroAZVA8Bqiqilv+/CE+3dKq91BouMxzzCCwfMLM4i3ZTHSipiiWT5hD8vzIippykDR6AohB8RggyQpWbm7BbX/5SO+h0DAZ+zBBvTGgMq94lp9TaArJWeH4Qjt+/gwtpXxCydOFdg888ACmT5+Obdu2ZestKUOyHP2Fs1jY3pwoF1hTbF7aBQ0vbExCTWSIkx4iA1OTyst++7dPTZXZz0pQvHHjRqxZswb19fXZeDsaIin2C2gRGRSbFQMrc+F0mRfnzlxUJHazExNFxWRgydOzZntbr/KJnA9nSEYcFIfDYdx666246aab4rc2KLckKdoZm0GxeRn8OEG9KCmZYh0HQkPGzTtMSIstYv9jlt/Yeid5Uo6XBj/bjTgovv/++7Fo0SI0NjZmYzw0DLKiBcUsETcLXj+aW3L3CWMf4qk3mS3ZTCU5wBLij+kzFspM7/kx03RZR/LNq1evxvr163HNNdcM+z0qKgpHMgQCIMVqikVmik1DQK8DhZmOGgRJVgZ/ERkSS5XMJ14+ET/HcQ6NrM/sqH3/XFVVlKPRDM2IguJPPvkEu3btwumnnw4AaG5uxpVXXok777wTJ598ckbv0dHhTe35mQNGnYzhkmMnaC60MxFBSLmc5iHeXLQLUQBMW5lMvCVbjs87NHy976xx6oyt94VnupKJtjZProYDIHpBlUkSdkRB8VVXXYWrrroq/vWCBQuwdOlSTJs2bSRvS0MUkVlTbDa9Z4rZK3ORkzLFnDlzYdmEuSRPl8CFdqbQp3wi6Wujf/5YhDoGxFuyMSg2DWMfFmgwUnJNMSfTVLjNs7lEEwbRcxt3tDOHPpliE33WRpQp7u0///lPNt+OMqTVN4pcaGcaZjpIUF8pmWLOpanEp4vTZhq9mk9AZUm/oQ200M7oh0tGUWMAM8XmoqrqgLeXyPhSaorJVLh5h/loZ7b4jna8ojG0PokClk9QLkkKF9qZCReJmB+7T5hXvE+xzuOgzKTWFPd9jIyn9/Tc9pePEs8ZfO4YFI8B3LzDXNLdbucteHNJLZ/QcSA0ZFqfYk6cOahAPBqOZ4o5d4Y20PwYfe4YFI8BcnybZ06nGRj9oECDSy6f4K1cc4nEkgi8Y2Me8ZpiNp8wvC5PEKu2tPb7vNFPf1ldaEf6SCy0Y6bYDNKdjI1+oKBU2i6SAHiGNhktKOa8mUPqjnbMFBvdd+/6N3xBqd/njZ5EYGpxDNBaDIncO9gUVKaoTI8L7cwrHJEBGH/BDyUkFtpF/8+pM67kgHhiXXGf540+dwyKxwDt4M6Y2BzSnYyNfvVMqSRu3mFa8UwxmYKqJpdPCPHHyPiK3fY+jxk9y8+geAzQMsUMis0h3THB4McJ6kVin2LTikjMFJuPkPRffubM4rQjCjC3LvUxo08dg+IxQLsbL/TZPJiMqPfJuNBp02kkNFwyyydMKxzLFBv95ExRKXfRuNDOVMZtewbfntaU8pjRL2gYFI8BzBSbi9KrpthVwPWuZpN8C97gx3jqJRLRgmJOnCkklU+ILJ8wDQEK7D0HIFpSw0yjzx2D4jFAjdcUMyo2gz4HBUHgCdpkQrHFWmQ+4Vj5BD9y5tF3oR0nz4iS52WytRWiHIYa6EGDpSPxGj0GNgQMiscAJVE/QSagHTiqypw4/bhGCDD+gYJShcKJFdY8P5tLOKJl+TlxZpBuljhzxpS81uIY+z4AQGjXp7jQ/T6E2KwZ/YKGQfEYoNWosiWbOWjz9bXTp+HHFxwbzX4Y+zhBvbR2BeJ/ZucQ85AVNX7iZmdEc1CT2k+I7MlmaKGwdgdNxVG2AwhUHYnKL30H46xduND9XvQZg08dg+IxgAd3c9EOCkLS1qVGP1BQws4D3di4K3E7kDGxeSRn+DlvJqEm3QSN/YHnPGPyBiIAALcQggwRoaojUXjUyQCA4x27AKiG7/rCoHgM4OYd5pLI7Ee/FmD8W0qU8OnW1C1MOXPmEQwnasGNfnKmhHifYjBTbGQefxgAEFJt2B6pRWDcPAiCiOd8xwGIBstGP9cxKB4DEgvtdB4IZSTRLSQpU6zngIjyRDCWKRYEXsyYQUSS0dLlhyhqx8ro45w7Y/L4IrAjgm8V/QcbIo2AvRAAcNhShg6UxoJinQc5CAbFY0DvFl9kbNpBQTvQiyKzVmbSe4tno2c+KCEYimaKnQ4r580E7nt6NT7Z1AKHPdq2Uksk8HhpTB5/GBUWL2bYmlAghOMXMbfd9m0I5/8arUqJ4T93DIrHgPjteJGpYjNQe5VPAGzJZibaQq1Fp0zWeSQ0VFqmuMBuNXzGioAPNzYDAGyxXrfxu6GcO0OKSDLKRR8AoFMuTLl7bZYsP4PiMUBRBn8NGYeippZPiAJL5MxEkhTYbRZMGVcCgHNnJlpNsdNh5cSZgLbvg82qBcWxzTv0GhANSFaActELAOhUCqGtjFRlCSUvX48zCtZDNXi8wqB4DGBLNnOJl0+kdJ/gYd4sJFmBzSIgfsDnKdo0gqFopthZYGUHAxPQguB4UBx7nMdLY1JUFRWiF2HVAo9akFhMbrECogX1li7DHy8ZFI8B8QMEY2JTiGeKY58+gZliU4nICqxWkQtbTUjLFLscVjDfaHyWWFRl7VU+weOlMSmKinKLN54lTt5lVy6pR52l2/BzZ9V7ADRy8W4GOo+DMsM+xeYmSUr8JA2AsZWJaDXFTgczxWagrZPpUz7BuTMkWVHwsn8OXGK0NVty4kApaUD1oU0Iy1I/320MDIrHAPYpNpfEfEW/FgSupjaTiBwNirnmx3ySu09w4oxPOyyyfMIcFAVoUUqBWN1wcqZYLamHVVAQ7mkBUKPL+DLB8okxgBkPc+m90E7gxYypSJISPUnHs1b8AJrFX5dvBAAUOKy8EDUBrQZcC4phkg4GeSsSxCLnKjRYOvs8pZY2QFEBwdumw8Ayx6B4DNAO7jxQmEM8U6w1pAczxWYi9c4Uc+pMxyKyZMkMwlI05WizWgAk7obyQtSYbIF2nO7ciErRAyD17rVa0oDrur4OqW62XsPLCIPiMUA7QPBAYQ5aAKwtIhG5vZapSLLKhXYmx63VzWFiXTEA4IzjxgPgQjujswU6AACdijv6QHKfYosFYdigGrwnG4PiMUDLPPJAYQ6y3KsGnDXFphKR5PhmAmQerZ1+AEBlqRPgdagpVJQU4IjGUhw7ozr2CNsgGllp50b4FDua5VIAyRtURS9o5tt3wf3qTYYOjHlkHwNkLSjmgcIU4pliSyJTzKyVeQRDMhw2CwTwVq5ZtHUFcOUd/wIQ3YlQZB9EQ1u3ow3n/PRF7G3qSen0InJ1q6EVevdhm1QHq8MBAPFjJBA9z7mFECy+NigBn15DHBS7T4wB2rGdx3hzUHplinl+Npcubwh1lW4u+jGJP/zvGhS5bPGvHXZL7O6MjoOiAa1YeQAA0H44iLrKwsQTsWMm5854VEWGI9SFVnkcXAU2BEJyavmEAHjVaLAsB3oAFOsz0EEwKB4DeOvdXOR4TXGi9yan0Bw27+5Ea6cfk+uLEzXFnDtDe/2jvSlfF9gtsQtSTpxRJd/11O6oAUkxFg+YxqOq2DrhK1i/IQTBHn2ooqQg/rQgCPAq0a8Vfw9QwKCYRokau2xWePlsConuE9Gvo+vsOHdm8OGGJgCAxSKm3BokY4pIcp/HtNvxPFwaV3LMW2C3xP8s8O6MYQkWK1pKZqNF3YWbL5qHVZtbMK66KPF8cqbY1wMU9PdO+mJN8Rgg86rZVLSgOJ4pBjPFZlFaFD2of/u8WfG0Fe/UGJc/2Hf3rPqqwlgdvw4Doowk1+m7ChKlL0K8fIKTZzTS4TbUdHyCIjGEWVMqcfnCo1KeFyDAp0Yj4Wj5hDExKB4D2H3CXGQluvI23qdY4GItswjENhMoLnQk9UzVc0Q0EF8wkvL1c0vOwdRxpfzMGVwoksjwuwpSb2iz8sWYgge3YcbBZSi2BNI+LwhAj+JEx+euR+HMk3I8uswxKB4D4gvteKQwhVhMnNKnmOdncwiEJBTYLbCIQnwlPMuWjMsfSM0Ux7cL5mfO0ELh5KDYlvKcIAg80xmQ5In2KPagMO3zgiBAgQipuB5igTuXQxsSBsVjgJZ55EHeHHpnitmn2Dz8QQlORzRzpc0f5864AuG+5RMA784Y2cMvrMeqLa3xr12OXplicO6MSPZ0QoIVPRFL2ufNsvEKF9qNAdpVNQ8U5pCoKeaOdmbR3h3AFbe9jspSJ4NiE5Gk/jcJ4KwZ07J3dqV8XejqnSk2fmCVjyRPJ7pkJ8JS+skRTFJuNqKguKurC9deey327dsHu92OCRMm4NZbb0V5eXm2xkcZCGpBsc7joMzI8e4TzBSbxaotLQCiwfGUcSUAkhb9sHzCsCQ5fVDMzTvMo6TQkfK1wM2ODEn2dKJbcfX7fKJziLHnbkTlE4Ig4Jvf/CZee+01LFu2DI2NjbjnnnuyNTbKULz+yti/a4RoS6/7nlkNILF5h8gaOcPz+BMLtlyOaObKwqDY0Lbu7YQ3EJ23i744A9deMj/xJDfvMI1itz3l62j5hD5jof4VTJ2HNeEJ/T4fb+tu3B2eAYwwU1xaWooTTjgh/vWcOXPw9NNPj3hQNDTBWN0cr56N7/FXNsX/rDWlZ32j8fkCiaC4d/kEp854vIEIrvn9O/GvPzu7Ho01iZ6pic4hajzjT8Yyb0Y1powrxYwJqXeeBZFJBCMqOn4R3v3H8n6fj5dPGHz2srbQTlEUPP3001iwYEG23pIy0Nzhw/b93QB4cjYDSU5MUnybZwiGv3rOd8m34bWgWGD3CcOKRFI37dC6TmjiWStOnWEd0ViGS86amSgzi+FCO+NRpDD8B3fAgUi/r4kfLw0+dVlbaHfbbbfB5XLh4osvHtL3VVSkb99BmfnZHxLZEKNfgREgJwVXKX2KOXeGlnwObuv2A0jMHzfPMZ5Qr6BY28VOI2hZ/pyNiIaqyG1L+zjLwY0n0nEIHU/+AjNsp2FtJH0Jhdir/URVVVHa1+ktK0HxkiVLsHfvXixduhSiOLTkc0eHN+eZFqNOxnB0e0LxP/NAYXzJGUdLyuYdeo2IMqG10QOAyQ3RhXaJ8glOntGEM84Uq0lfkZFMaShN+7goCFyYbDByrEfxQAvt0CtT3NbmGeVRpRJFIaMk7IiD4t/97nfYsGEDHn74Ydjt9sG/gSiPpZRPxINirqY2ukhSa69vnTsLQCLzwfIJ4wlHUuuRemeK4+30FBVI31aVdBCt8QYWnjwZR02uSPsam9WS8nkk/UmeTgDAYdWFC8+ckfY1yXX8RjaioHj79u1YunQpJk6ciAsuuAAAMG7cOPzxj3/MyuBoaAz+u0ZIXz4RzXzoNSLKRPLt+OR5AxgUG1FYGjhTzLkzJkVRoapAibv/BJvNJva5E0D6CrcfhKSK6FGcqCgpSPuavOhTfMQRR2Dr1q3ZGgsNQ2mhA93eaAkFbykZm6qqkJJOwhat1IjdJwwv3Uk4sXlHrkdDg+k9X/1mivm5M5RILGnQe76S2SzigJuyUO55dq7FTqkaCsR4WWBvqSVLxsUd7UxuamMpdh3sRkNVEQ/wBnbZLa+hvsrdb6aYU2ds2u34806bEn8ssZqak2c0yeUTFlHo08EgpXyCDEMrL7MMFBRbxXjwTPpTVRVKYTU2R1J3au0t0ZLN2LLWko30EY7IqK1ws9etwXX2BLFhZ0fKY0kb2nHuDGrngW6c89MXcaDVgyMnlePKRUfHn2NgZVzJ5S4F9r5Fw1r5hMy5MxQtA2yz9L/40WZjTbGRCIIA6ZRvY0XwKAD9X9Akmk8Y+zPHoNikgmEJPb4wwhEZdpuFHQxMQqttPP9zU+NXzgJ3tDOsf364FwDQ3OGHw5YaXJll4Ug+Si6fqCl393me5RPGpHXnsVoHLp9gTbFxqLIEOZzogtV/pjj6f6NfhzIoNqnf/30NLrrxVRz2hWG3WqIbQPAAb3iBkIyv/9d0XHHOUfHHBJGBlVElz0tlqTPlOWaKjSs5aCpPs/CHc2dM2u6svS9Ak9msIjPFBhLYuxEF//t9TLK2Aui/HlxbQ2P0zxyDYpN6Z81BAEBTuw9upzW6WEvnMVFmXAWpTekFGP/qOV8lX6tUl6f24Ix3MOAFjeGEYjXFDrsF5546uc/zie4TOR0WDcIb20690DVA9wnWFBuKEugBAPgUx4Cvs8ZKYiSDzx0X2pmUq8AKfzB6VV1Z6oxu4sFzsym4ClI/dgJrXwwrOVM8a0plynOJbGNOh0QZiMRasj1161lps45aMosXNMbi04JiZ/rd7ADAbrP02cab9CP7DgMAvGo0KA6F08+NlkGWDR4UM1NsUsmLRypLnbG6VB7gjah3aUTfoJiZYqNKXog1fUJZynPsPmFc2kI7ez+1qSyfMCavPxoUuwcIim0Wlk8YidTTAVW0wR8LirUSmN60OnGjZ/kZFJtUgT0RWJW4HQysDKz37SKXI/WALzJTbFj+YCT+5961chYGVoYVjiiwW8X4YtbeWPqij25PCHubevp93hccPFNstYo41O7DdQ+8k/Xx0dBJng7IzlJonYjD/VywaMdLWTb2Z45BsUkltz1xFVi5VbCB9c5qhHrd+hO4o51haTWOvRfZAew+YWRaV57+MFOsj+8s+Te+f8+Kfp/PKFMcyzhu2t2Z3cHRsKhSGLKzHABw5KRynH5cY9rXCYIAq0UwfE0xg2KTiiRtY+p22mARBR7gDUoLis86cSKmjCvBrCkVKc+zx7Rxef0RHH9kLf5ywxf6PCdwq2DDGiwoNstK+LFGqxlOR1VVdBwOwG4VB5y7gZ6j3Kv9fz9H+/HfAwBc/dVjUu5i92axiPENWoyKC+1MKrnlkNtpgygKbERvUB9vbAYAVJU58b2vHtPnefYpNi5vIILJDba0t+G1bKPMCxrDCUXkAdt6iVxoZzirtrTilff3DPo62wC73ZE+tDh3oJ0IgWgJGjPFNCqSV3i6C6JBMbMexrR6WxsAoCJNv1SAO9oZWSgsp90RDUgExZw649nX7EF1ed+SFw13tDOeA63ejF5nG2BjD8otyduN/X/6ARzNawH0v3GHxmoR4rsWGhUzxSYUisjwBSWcflwjJtQWo6TQzvIJA1JVFe+va0IgFF2Ne9rccWlfx3V2xiXJMmzWfoJirfsEP3eGc6DVg3kzpvT7PGuK9aWqap+7L4XOaDgySFzFoNhA5J52RDoPQYmVEYuDBsXGzxQzKDah1k4/AGDOEVX43LzobyPLJ4zn/fVNuOvxTwBEr6D7u7UkcpGkYYUjCuy2/ucNYGBlNBFJgSSrcBb0f3rjNs/6khU1vpmDRlt78dD1Zwz4vf1dpFLuSZ4OAEDYXgKgI4NMsfGDYl5ymVBzhw8AUFvhjj8mCgIP8AajXbwA6DewAgCwnZ4hKYoKWVH7rWFkYGVMoVif1IEW/PCCRl/pbqFr/Wt77/jZGzPF+tjT1NOnnZ7UEw2KQ7ZiAIkFrP2xWgTDt2RjptiEWmLBVk3StrMsnzCe5E06BmsPxbkzHu0kbetn7ngL3pgCoeh6iwGDYs6drtJlC7VAebCg15r0vCwrgy7uouz4QayV3rJ7z40/JvW0AxYrwpZo/b7FMnimmJt3UFbta+7BC2/thN0qorQosdc4yyeMJ3mTjv42EQCiq6mNvvVlPtK2ku3vJK3dKjR6i6F84g9GsHFXOwD0u0ASYJZfb+kCI+2x3pvk9Ob1hxPfY/BFW2NdcN8m2CsboajRz9Og5RNW45dPMFNsMlffnWh8nhxoMdtoPELSsX2goNcMdVb5KDJI5irajF5M6RlO+nrs5U3xtl5OB8snjEqS+v67a4/1rjXuraQwkQwKSwoKHAO8mLIiHEl/jKu7+BYoAS+UVdGNVAZbaFfidqDLE8r6+LKJmWITONjmTalPTcciMCg2muQM4kBBr9UqQlHZHspotKDYPsDtXJvV+M3o80nyCdcxQKY4sUX3qA+J0tCOh8kLjCOSDKul/625NWccNx7nnTYl/j00+oLh9P/Oos0Ba3FF/Nw1WE1xdbkLLR0DxzJ6Y1BsAt+569+48o5/pTx2+3dOSvlatLB8wmiUpDOuVueYTuI2PM/QRhGRZGzYFV1EYh1gtTszxcZS7LbH/zypvqTf18U3XmFUrAtJVvDciu0479plaGr3YeXmFvxjxY6MjoGiKMTnNhzh/OVCujudgd3r0PTMHZB6OhCKyBCFwcsnyosL4PGHDX2uY/mEiWi3MC4+awaOOaIq5Tl2nzCe5Ayia4D2UNrt+R5vGBUlBYPegqLR9+D/rcMbn+wDwEyxmSQfApMD5N5YPqEvSVbw+kf7oCgqDrV78fbqA0P6fq2bT5gXpDmRLuEW7jiIwM5PoQgWdHtCKHY7Bj13abtM9leOYQQMik2k43AQAFBR3HdnNHafMB7t6nrxF6bhjOPG9/s6bWHJN25/HeedNgVXLjo6J+Oj/q3c0hL/80AXNFYrM8VGEoy1Y/vN908Z8HVcaKeviKTE/+39AWnImxfZY3dvIswU50S6zK7s6wYg4GcPrcKuJi8m1BYN+j4O7WLGwPPG8gkT2bwnWsye3J9Yw+4TxqNlEM85eXLaOdMkr7b+dyw7SfryB6X4n+sqC/t9nc3CTLGRhMIyJtYVY+ak8gFfpy3CS55nGl3JSZtgWIp/7Q9F4AtGhvRezBTnVrqEm9TTDktROXY1RbfnTl4A2R87M8WUTe+vOwQAaKzpe0XG7hPGo9UrDtZiKPl5I9da5ZPku4CVpc5+X2djpthQQmF5wFZsGq2dpdFXwo8lyVn5YEhOZIqDEnyBCOor3fj5Zcdl9F42ZopzKm1f6e42WEsSZZylGQTFWs/3sCTDYdAqQWaKTeSjjc2oq3SnvSKzsEbOcLQM4qANzZNqViNpWhVR7iVvJTvQ4hGrRWCm2ECCYWnArhMap8MKp8OCrp5gDkZFQGqnCX9IipeX+YIReAMRjK8tGnBxZDJminMr3V3oSFczFHdl/OuSosGDYpZPUNY1tfvSPi5aWCNnNFqmOJOtLzXMFBuDdtKdPbVywNfZrBZmig3E44+g0Nn/ArtkxW4HPtncgsNeZotzITmwCoYk+GKlK15/BM3tPtSU919i1ptWUxzm5h05kW5r5pqv/AyhaV+If13kHHh7bsAc5RMMik3mju+elPZxbTU164qNQzuQDNaMfrDyCso9fzCCs06aiFuuOnHA11lZU2woHn94wK4TyRx2C5rafbj5zx+O8qgISL2L6fGHEYr1vn35vd0ISwqmjsssSwwAtthFa8TAwdVYIiW1LtTmsaDhCOzwJdZbZPK5syeVTxgVa4pN5ujJ6TNXiWb0PEEbhSQrEEVh0Gb0DIqNRZYVBEIyygodg86N3SZif4sH63a0YfbUqgFfS6PnrU8PYOWWFnj9YRRlGBT7A9HFXfuaekZzaBSTfGp6/JXNfZ6fMq404/fSWnv1t6kEZVdyplhWFIQObEXPtk/x6e5oV6XPzq7H6QN0WNLE522Avv1649nYZPrrAyjGbtEzKDYOWVZhzaDncH/bCJM+evxhAJllPtxOG1q7Avjln95PqZmk3LrnqVV4c9UBKCpQ5MosKO7xRee5NINaSBq5wc5NDVX9d3npTeseorXgo9GVvMlNRFLg27EaPR++gI+3tOOYIyrx88uOQ8EA26praspdsFtF7DzQPYqjHRlmik3ksrOP7Pc5rWyV5RPGEZGVlEV0/cn0di/lRo83FhRnsJo6OQCTZCVlgR7po6Kkbx/3dLR6VAbFuaFdNNZVuvusjXE7bUPatMhhj4YuAbbUy4nkErFATzd6PngOQdUOGRZUl7kyfp+SQgfu/fFpKCtyIBwIj8ZQR4wpKpModNqw8ORJ/T7P7hPGc9gTQol78BMug2JjOeyLLrwqKRx8XgqTFpdEuOhHNxPriuN/rizpv4VeOoUZZpZpZLRz04L5jZg2vhSLTpkcn7c//+KMIb2XRRTgsFsQYPlETiTHFYEdnwIAVgSjSbqqAVpWpjOxrjijnsZ6YabY4LRfxnNOmYwC+wBbBcdrrCQAxv2FyyddnhDKijMJijlfRnI4linO5IImOaBiUKwfd+ziRBQF1FVm1sXg7h+egp/9/h32us0RrTNSaaED9/7oNABARJIhy2pGt957c9qtCISYKc6Ff328N/5n6XAbAGBF8CgAQFmaHXbNjJlig9MOJIP1uq0ui16tHWj1jvqYKDOdPUGUFQ1+wGBNsbH0xFp0FWeQKZ5Un8hQMijWTygs4djp1Xj8pjMzLoeYMaEcx06vRijCwCoXtNK+5DIJm9UyrIAYiNYVBxkU58T765rifw4rFuyVKiDBAleBFTMmDrx7pNnwbGxwWt/awXrd1se2on3m9a2jPibKTJcnmFGmuDeZvYp1s2l3B5Y+vx4AUJzBbfWpSSvmjdxmaKwLhmU4C6xDvi3rsFsQMPBK+LFEW4cqDtKNJ1NFbhu6PNx8Jdce3FaH3/acDQB45vYvpZQujQUMig1OK58YrNdtdXms2N2gWyfmm7dXH4A/KGWUKQaA44+sjf/Zz+yHbq574F0A0W2eLRm0ynMVJLJczBTrJ5jh9s69uQts8AcjozAi6k1JkykeiXHVRdjf4snKe1Hmdh44HP/zYO1GzYhBscFpqz4zOZCccFRtvCE66evuJ1cN6fU/v+w4/NcJEwAA3R7usKWH5MUkmdalJp8UGBTrQ1ZUdHsyK1XqrdBlgzfAoDgXtFLALMXEmFBbhM6eELx+Y3YxGEsaa/q2y0tO5IwlDIoNLtOtgoHoYhNmPYxBy1p96aSJGb3eZhXxuWPHAYjWIlNuKYqK9TvbAQC1FS7c9u3PZvy9Z34mejEjMSjWRcfhACRZRU155q2hNIVOG0JhmRc0o0hRVOw80J31TPH42uht+z3cfGXUhSNKfP3EVz4/Ff9zwxfwqytP0HlUo2PEQfHu3buxePFinHnmmVi8eDH27NmThWGRxuuPBrnuDPYVdztt8DHrkXOPvLAe7687FP/aH4wgGJZx2dlHDqndk7ZA6NUP9mR7iDSI/1m2ATcsfR8AcNfVJ6OqLPM2Q6fObQDATLFe9saCoobqzDd/0Ggt9XjcHD3/+ngvfvy7t7BqSyuA7AXF0yeUwSIK+GRTS1bej/oXCsuYPqEcd//gFFzypSOH1JvYbEYcFN9000248MIL8dprr+HCCy/EjTfemI1xUYx2K70sgxXV7gIb/CEpvjiPRp+iqHjpnV2487FPAAArN7fgj/+3FgAwbogn6fJYa5v31h7i7mg5cOdjH+OH966ALCt46e1dAIBffeMEVAyxz63NEr0rwIV2uXHYG8I5P30RV97+Ot789ABu+8tHsFoETBtfNuT3KokdVzsOB7I9TIrRzmGfbokGr1lbaOeyY860KnywoWnwF9OIBMMSCuwWzJhYDku26l8MakRBcUdHBzZt2oSFCxcCABYuXIhNmzahs7MzK4OjRH/A8gx6AdZXuaGqwME2tmXLFW2jByBa23jLnz/E26sPAgAmN5QM6b2SF235uFPTqHt/XRN2H+rBlr1dAIDrLp2P448aep2cNm/+AOcsF3bEtoht7Qrg3qdWQVWBS790JBy2oS+001bO7z50eJBX0nBp2fjDsW21s7k464jGMrR0+BDhBemw9PjCeGf1wQH7PUckGcGwnLJR0Vg2oqC4qakJNTU1sMQyJRaLBdXV1Whq4pVbNmze3YkVqw5AFJK6SwxgUn00CNt9iDVWudJ5OFH/eyjpYmThyZOGfIsp+WTR4+Niu1x57OVNsIgC5k6rHtb3a83rO9keKid6L0T9+aXH4cufmzqs96qvLESB3YKdB40RFCuKOuYC9GBs8feu2L9xNjONdZUuKCpwqNe20ZSZi258Fb95ciV++7f+F4b3+DLf9n4s0H1Hu4qKodeB5Qtt4c/v/vtzGWVBGqoKYbUI2HPoMBBbtEWjqyNpUZy24OMLx4/HN845aljv9+XPTcXzb+7Ays0tWHQKPxujJRxJZJY27+nE9756TEZ1++kUuWywWsSUCyQaPb0Xos4/smbY7yWKAiY3lMTvFujtpXd24X9e2oDffP8UzJw0NjZFCIQTWci6Svewylz6c/TkSgDAJ5taMKF2bPXLzaUPNzTjPyv3Y8H8xj7PJXb4zO526FVVRVl9v2wZUVBcV1eHlpYWyLIMi8UCWZbR2tqKurq6jN+jo8Ob0gopF4w6GRpVVfHnlzbgpbd3ochlz/g2vM0qor6qEG9+egCXLxxeUEZD05EUCP3miZUAgEvOmgmbdei3cgFg4Wcn4fk3d+DTLa1YdMqUrIyR+kpeWHXNRfNw2gguIgVBQE25C4faWbaUCx5/BHabBQ9c83l09gSHVTaRbP7MGjz+yma0dQWGtMByNOzY3w0AaOn0jZmgOJi0OcoFX5iW8Y6Dmagud8FqEfHYy5twRGMpKkudaKhiMmE47v/7ahx/VC3W72jDibPq449rd2aGujHOYNracttjWhSFjJKwIyqfqKiowMyZM7F8+XIAwPLlyzFz5kyUl4+ND7MeNu7qwFevfzm+8Ocb5xw5pO8vLy5Ax+Egtu0zRuZjrNMW6BS5ElnGkRw8qstdmDGhjJ0MRpnWm/ZnF48sINZMbijBxl2dXLCVA15/GEUuG+oq3ThqcsWI3++zs6MBwAfrDw3yytGnVVDptczWF4hkdetkVVWxcXcHAGDxF6bh1LnZv4Optb28Yen7+M5d/8aG2B1WGljv/s6KouLrN7yCXz/6CV56eyc6Dgewbkcb7vjrRwCirSrzwYi7T9x888148sknceaZZ+LJJ5/ELbfcko1x5R2PP4xb/+dD/PyP78Zv7X7ny7NwxvEThvQ+l30pGkRv2cPFjrnQeTiI8mIHrr/seADRLiEjbTlUVeZCU4cv6x0obv/LR3jy1c1ZfU+z8gUzb3WYiTM/MwG+YATX3P92VoMK6uu9dYfgdGSv8q++qhDjqguxZntb1t5zpPRqPnPBDa/g6rv/M+TvC4YkvPTOThxq8+Lt1Qdw1a/fwAPPrsGvHnofO/Z3o7rMiYu/OBPWDHaJHKpvnTcLXzxxYvzr+/++mv36Y1as2o/rH3w37blk+Xu7+zymnboeeXEDLr/1dfzyT+8jHEvQZLLYfywY8ZFlypQpePbZZ7Mxlrx1oNWDmx7+AK1dAcyaUonTjm3A8UfVDmuHpinjStBYU4h/rNiBM44fD1dBfqwY1cvaHe0oKy7AtAllmDOtChd9ccaI3/OYI6rwzpqD+NVD7+MnF87LysEoGJbw0cZmfLSxGRefNXPE72d0sqJCFBKLF2VFhQBg9bZW7Gv24KONzQCAEnd2bgkec0QVbrzyBNz8yId49YM9w174NZaoqpqVTgOhiAyPL4y3Vx/A6m1t8AclNNZk97g2paEUb60+gL+9tgWLvzAdgWBkSD3Gsyb2z6Uo+t0pau3K/G7Hcyu246/LN8FqESHJCh7BhvhzTR2JxW+3fvukrI6xt29/eRZOnl2PHn8Yv3liJa68/V+YNbUSXzt9GiY1lEAUAElWsGl3J0oLHRhXU4QDrR5MqC0e8Pd0b3MPvn/3CgDAX274L1SWFqC1K4Cmdi8qS53YsqcL82fWYOfBboQjCj5zdC0EQUAgJEEAUJB08bZmWytqK9yorUi/W+a7aw/i3qdW4W+3fSlrF32//dunAKJ3oCtLnSh02bF2WxtKixx49t/bMX9mDc45ZTL+8Z/t+NnF81FSaMeeph688NZO1Fe5YRFFjKsuhKvAOia3dE5H94V2+URRVKiIXo2t29GOfc0eTBtfikde3IDWrgBuuepEzJ1WNaJfPkEQcOmXjsQdf/0Yv/jTe7jjO5+F22mDqqoIRWQU2DnlIxEISdjf4sFflm3Exl3R24JTGurgsFlwW5YO/KfObcDDz6/D2u3tuPzW1/Dw9WegtsINVVWhKCosw8i2NHf4szK2dLp6gnhv3SGcddKknPSwPNTmxR//by1OOKo27YWfqqq4+eEPUjJ/TocFgVBq26bPHTsOU8YNrW3eQI6dXo36Sjf+smwjNu/pxPf/3xy4C6zDmi+zu++ZT/HvT/bjF5cfjxNnpV9j0tLph6Ko8S2131t3CHc99gmmjitBRYkTH21sRoHdAkFAn7n72cXzszreLxw/HgfaPHj69a14+vWtAIBff/ezKC8pQF2Fu9+7Pys3t2BPUw++uuCIlMeXPrcOE+uKUzKYHYcDg/bA1v6WULhvi7H9LR5UlBRkLdGxp6kHT766GT+9aB6cDmu/a3vauwN445N9qC5zob7KjUKnDStWHcDm3Z3xxeBab/yJdcWYP7MGjTVFeOKVTfjaGdPwxRMnjnpAZbWIOGZaFQDA6bDizsc+wQfrm/DB+sE7YdWUu3DaseMgywrmzazBpl0dOP6oWpQUOvCr2IY+APCN21/PaCxnnTQRr76/BwBw+dlHwh+SUFXqxB//by3Kix24/yefR7c3BKfDivbuAGxWEdPGl+Hh59dDklVs2NmO6jIXJtQlFg62dvrR5QmiyGWHrKho6w6gvTuAY6dX40CrB/taPJhUX4K/LtuI7bG69GTXP/he2rF+dcEROGpyBY6dnui8M6m+BP/99WMz+lnHIkHVeZcAPRbaVVZGi60H+6CGIzIkWUk5CCmKijXb2/Dmqv34zvmzYbNa0HE4gPLiAnT2BFFT7kIgJCEUkdHS6cebqw7gYKsXRW473llzEDarCHeBDd3evi23lt17blZ+PklW8MN738T+lmgh+2VnH4m129qwZnsb5kyrwsnH1GPB/EbYrJaU2yoD/Xv4AhHsbe7BkZNGXsMHAM0dPtisIsqLCyAIArbv70KRy97vVTSQyPYln6CSr/K7eoLx9ljpHPaGUOSyY8eBbhS77QiEJDTWFKGrJ4TK0gLsa/agxxeGoqjwhyQEQhJaOnxo7Qpg0+4OCAJwsC219c/UxlJcd8n8Acc9HKGIjP98sg8PvxA9UB49pQIbdkaD8DlHVMEbCOOcUyZDUVS4CmxwFVhx1OQKRCQFTkfiql6OnazWbm/HTY98EH//u39wCqaNL4v/W8qKio272jFzYjm6PWFUlTmhqiq6PCF4/GGUFjpQ7Lb3+R2JSDJ+9Ns3sb/Fi+999Rh84fjxsFpEKIqaMk8RScHFN72KS790JM7+7CREJBmHvWHIioqDrV40tXsxsb4ExW47enxhTG4ogSQrcBfY4AtG8OH6JtRUuHCwzYcHY5ujaI6aXBG/QHHHtu3tbwObuko3fvi1OQCAo6dUDnd6+rVpdweue+DdlMcWzG+MngTtVsiKginjSlFeXICqUieKXHbUV7mxbkc7aspd8AUiqKt0Y+fBw6gscaLQacMHG5owb0Y1/rNyPypLnZg7rRq+QAQVJQX45wd78JlZdZhQWwxRFBCOyLDbop/rHl8Yh70hlBcXoK07gJpyF1Q1Ote7DnZjXHURXv9oL9q7AxhfW4wF8xvhsFsgSQoKHFZIsoJ3Vh/E1n1dmD21Ept2d6Cuwo1Pt7bixFl1EAQB7gIbvIEwXnhrJxadMhm7m3qw51APNieVb33tjGkoctnR1u3HwVYv5kyrwj8/2BP/LAnCwOUCk+qLIckKTjt2HBw2C+bNiAZd2SYrKm7984f4dGtryuMVJQWYP7MGVaVOtHT6Mam+BDUVLtSUu+JZxMdvOhP/WbkfbqcNJYV2/PrR6GY+t3zrRDz28ibsirVZu+7S+agodqK1y48p40pQVebC5t0d6PaG0dUTxCvv745fwBbYLbhy0dGoLnfhk43N8dvd5502BdPGl6Gm3IUtezrRHLu48PojKCmyw11gg0UUUF3uwp5DPVi3sx3FLjtKixxwOqzw+MN4d81BJJ92C502+IOR+GNupw2BYASiKECS+5+cIpcNR0+pRGdPEOd/bipOml3f72tzqasniOfe3IGDbd4+O96dOqcBb6+J9pK3WcWM1m/YrWK8jGDWlEpMGVeCF97aidlTKyEIgCSrONjm7dMuMFMWUYCcJg6aPbUS63e2D7ucprGmCBd8YRrW7+zA5t0dmD+zBk6HFVv2RjPcZ3920vDeOAuMutAu74LitTvacf//rQMAzJhQhi5PCCWF0ROx1SKitSsAh02Ex5+oSaqvdONQuw8OuwUCEn0Xh+uEo2rjDf/H1xbDahFQWerEycc0jOh9kwVDEn76+7exr3ngXzxRFGCziimZicpSJwIhCSVuOybWF8Prj2DdjmhGoLKkAM6C6AE0GJLgC0porCnEgVYvJjeUYOeBw2iociMsKSgvKoDdZkFEkiEIAhRVRWdPEOVFBdgaWwg4qb4Y4YgcP0FObihBS6cfkqygxB29Ku44HERFSXQBYXlx9MDe7Q3HOwhUl7vQ2umP/zxHTapAICwhFJZxsNWDSQ0lKHLZsWZb/zWDyQe9wVSXOfHNc4/GrKlVo97QfM22Vvzx/9ai43Bw0IN38gG+yGWHw25Bjzc04M/ldFggK6ktygBg5sTylMBGU+iMBqnaUUMUgP4+vkUuOwqdtpTbqJnS3lcUhX6PD5PrSwAhWtfd7Q2hptwV/d0NSjhycjkuX3gU7FYRG3Z1YEpDSU5LiT7c0IQlj6/M2e6SpYUOOOwWtHT6UVbkwOHYxZ3RTaovjvdVnz6+DNdcPA8WUYQgANv3d2PutKqUW9C50NrpRzAs4R8rdkBVVXy0sRn+MbiZTnIgVlrowLTxZfh4U7SsaFx1IZwOK4JhCfWVhZg5sRzTxpdh+Xu7cLDViyvOOQrHHFEFURCytm3zaAlF5HiHknSlEsGQhPfWHYKqRksZX3l/N4JhGWd/dhKOnlKJE4+uy/hnlGQFO/Z3o6y4AEUuG/xBCXube+ALROB0WPH8m9GyhIl1xZBkFYfavNjT1AOrRcT6ne3x89fG3R1QFBWT60tQ4LDAVWDD9AlleP7NHfjK54+Axx/G3qYezJpaCa8/glBEhgDg6KmVmDWlMn5eUpHdvtDZxKC4H7kOit/f0IQ/L98Mq0WE02FFY00huj0hlBUXoMcXhtcfRkWpE5GIjL3NHpw4qw6KouJQuw91FW6EJRktHX6cPKcezR1+vLPmIGrKXZhQW4xdB7sxfWI5ymLdB4rddhx/VC3KiwtQ6LJj96HDOKKxNKe1ORFJxv4WLw61R4PWZW/v6lNgX1nqxMS6Yqzc3HcP+UKnDRFZgRi7hdn7itYiCnAV2GC1CLDbLOjyhFBaaEd5cQG6vSF4/RGoqgpfUILdKkIQBVSWOHGwzQu304Zilx0qVDR3+OF2RleUt3b60eMLo6TQjroKN7bs7YLDboGqqCh22+Fy2uD1h9HtCUFRgTnTqrBjfze8gQjG1xYhIikodtnhC0ZQ7LbjsDeEiKxCkmSMry2G02FFkcuO9sMBQAW6PEFMqi/BuOpCRCQFsqKivLgA42uKMK66EMVuO7pjGTe96qrCERkbd3XgULsPsqLguJm18VuaiqLgQKsXsqJib3MPNuzswOeOHQdRFOCwWeDxh9Ha5UdFiRPXXXocmtq9eG/dIWza1QmrRURThxdTGkrhDUTg9YexZW8XpowrQVlRQfx3QhCAsqICTJ9QhlVbWlFgt2DWlEo47BYoqoqZE8uxanMrFFXF/hYPaspd2N/igSAAPb4IpjSUxDOOW/Z2QVFUSLKCk2bXYf6MGkyoK0bH4QB6fNE527avCwWxIK+8uABhSUEwLGFCbTFOj2U0zVDj1tkTREmhA15/GIGQhMpSJ95ctR/FhQ70eMOIyAo27GiHzSZi7bY21FS4UVPugs0qoqrUiUPtPmzf34UZE8pR7LbDYbdiy55OOB1WbN/fBYtFxMS6YlhEAaGIjMoSJwJhCWVFBejyBNHdE0JlqRNTG0vx4YYmtHT60dblx8KTJ+NQmw9Wq4AjGssgywqCYRkRScGLb+9EQ5Ub0yeUwx+MoKrMhapSJywWAS6HDcccUYVAKBK/YPUFIjjsDQECYBFFlBc7MGVcKarLXOg4HIAgCDjY6oUkK5hUX4KDbV64CqyoitU4Zqv2eLQoioouTxCH2nyoKnOiqd2Hjbs74HLYML62CE6HFWu2taGzJwhVjR6jTp07Di2dfvzvG1tx0ux6zJ1ejfbuANbtaEdZkQMNVYVo7w7gQJsXpYUOSLICbyCC9u5A9A6kRYQvGMGOA4ehKGrs38qG0kJHNNN/6DAikgKPLwxJVlBdFs1cd3tCkBQFB9u8mFBTDEvsuDypvhg2qyV+5yg5yPMFJbgcVsMHtzS2MCjuB/sU66f3LW4gcSWtqioCISnlVrwmIimwWTOvk1RVFS2d/iGXGCSPZbCTpiwrgCAY9qqYiIiIoowaFHPVVR5LlxnQgk9BEPq93TyUgFh7r+HU3CaPZTD5uJiJiIiIsoeRBBERERHlPQbFRERERJT3GBQTERERUd5jUExEREREeY9BMRERERHlPQbFRERERJT3GBQTERERUd5jUExEREREeY9BMRERERHlPQbFRERERJT3GBQTERERUd6z6j0AURT0HgIRERER5UiuY79M/z5BVVV1lMdCRERERGRoLJ8gIiIiorzHoJiIiIiI8h6DYiIiIiLKewyKiYiIiCjvMSgmIiIiorzHoJiIiIiI8h6DYiIiIiLKewyKiYiIiCjvMSgmIiIioryn2zbPe/bswfnnnw+fz6fXEIiIiIhojPv617+Om2++edDX6bbN8969e/HXv/4V27dvR0VFBd59910GyERERESUNaIoQlEUbN68GaI4cIGEbkFxb0uWLMGjjz4KRVH0HgoRERERjQGFhYXwer145ZVXMGXKlAFfa4iaYkmS8Pe//50BMRERERFljdfrBQBs3Lhx0NcaIig+77zzWDpBRERERKNCkqRBX6N7UPyVr3wF27dv13sYRERERDRGFRcXD/oaXYPiCy64ABs2bNBzCEREREQ0xs2fP3/Q1+gWFL/xxhtYvXq1Xn89EREREeUBt9uNiy66aNDXGab7BBERERGRXnSvKSYiIiIi0huDYiIiIiLKewyKiYiIiCjvMSgmIiIiorzHoJiIiIiI8h6DYiIiIiLKe1a9B0BERMCCBQvQ3t4Oi8UCi8WCqVOn4txzz8XixYshisxfEBGNNgbFREQGsXTpUpx00knweDz4+OOPcccdd2DdunW488479R4aEdGYx/QDEZHBFBUV4fTTT8d9992H559/Htu2bcObb76J8847D8ceeyxOO+00/OEPf4i//qqrrsITTzyR8h7nnHMO3njjjVwPnYjItBgUExEZ1OzZs1FbW4uVK1fC6XRiyZIlWLlyJR566CE8/fTT8aD3vPPOw0svvRT/vi1btqC1tRWnnnqqXkMnIjIdBsVERAZWXV2Nw4cP44QTTsD06dMhiiJmzJiBs88+Gx9//DEA4IwzzsDevXuxZ88eAMCLL76Is846C3a7XceRExGZC4NiIiIDa2lpQUlJCdauXYtLLrkEn/nMZzBv3jw888wz6OrqAgDY7XZ88YtfxEsvvQRFUbB8+XKce+65Oo+ciMhcGBQTERnUunXr0NLSgnnz5uGnP/0pTj/9dLz11ltYtWoVLrjgAqiqGn/tl7/8ZSxbtgwffPABnE4n5s6dq+PIiYjMh0ExEZHBeL1erFixAj/5yU+waNEiTJ8+HT6fDyUlJXA4HFi3bh2WL1+e8j1z586FKIq46667sGjRIp1GTkRkXoKanGogIiJdJPcpFkURU6dOxaJFi3DBBRfAYrHgn//8J5YsWYLu7m4cf/zxaGhoQE9PD+655574ezz44IO4//778cYbb6CxsVHHn4aIyHwYFBMRjREvvPAC/v73v+Ppp5/WeyhERKbD8gkiojEgEAjgb3/7GxYvXqz3UIiITIlBMRGRyb3zzjs48cQTUVFRgYULF+o9HCIiU2L5BBERERHlPWaKiYiIiCjvMSgmIiIiorzHoJiIiIiI8h6DYiIiIiLKewyKiYiIiCjvMSgmIiIiorz3/wGvxOcx83/+rgAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "padded_forecast = np.pad(forecast_mean,(len(observed),0),constant_values=(np.NaN,))\n", "\n", "forecast_df = pd.DataFrame({\"forecast\":padded_forecast\n", " })\n", "forecast_df[\"actuals\"] = list(normalised[\"All I Want for Christmas Is You\"] [:forecast_df.shape[0]])\n", "forecast_df.index = normalised.index[:forecast_df.shape[0]]\n", "forecast_df.index.name = \"Day\"\n", "forecast_df = forecast_df[[\"actuals\", \"forecast\"]]\n", "\n", "sns.lineplot(data=forecast_df)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Not bad! It misses the big peaks but that is ok for now because the model doesn't have anything in it to account for them.\n", "\n", "Now back to doing some data-munging in preparation for the lagged regression.\n", "\n", "First extend the index on the dataframe into the future - this is so there is \"space\" for the lagged regressors to go into. There is probably a better way of doing this, LMK if you know what it is." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "from datetime import date\n", "old_ix = pd.date_range(start=date(2015, 7, 1), end=date(2021, 11, 8), freq='D')\n", "extended_ix = pd.date_range(start=date(2015, 7, 1), end=date(2021, 12, 31), freq='D')\n", "normalised.index = old_ix\n", "normalised = normalised.reindex(extended_ix)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The absolute minimum amount of lag we can consider is 53 days; this means the value on November 8th will tell us a bit about what happens on New Year's Eve. I've decided the maximum to look at is 83 days; looking back earlier than October probably won't give that much extra information.\n", "\n", "So now make a dataframe with every page lagged between 53 and 83 days:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['Justin Bieber_53', 'Millie Bobby Brown_53', 'Mariah Carey_53',\n", " 'Fifth Harmony_53', 'Jenna Dewan_53', 'Love Actually_53',\n", " 'Michael Bublé_53', 'Despacito_53', 'Tori Kelly_53',\n", " 'Hallelujah (Leonard Cohen song)_53',\n", " ...\n", " 'Colleen Madden_82',\n", " 'List of Tawag ng Tanghalan finalists (season 3)_82',\n", " 'List of top 10 singles for 2018 in Australia_82',\n", " 'The Masked Singer (Bulgarian season 1)_82',\n", " 'List of Billboard Global 200 number ones of 2021_82',\n", " 'Ngayong Pasko_82', 'Česko Slovenská SuperStar (season 4)_82',\n", " 'Mr. Vocalist X'Mas_82', '24 Hours (Agnes song)_82',\n", " 'We Were Born for This_82'],\n", " dtype='object', length=18990)" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "shifted = None\n", "for i in range(53,83):\n", " x = normalised.drop(columns=\"All I Want for Christmas Is You\").shift(periods=i).add_suffix(\"_\"+str(i))\n", " if shifted is None:\n", " shifted = x\n", " else:\n", " shifted = pd.concat([shifted,x], axis=1)\n", "\n", "shifted.columns" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`18990` is a lot of columns. Let's reduce that number down by seeing which have a statistically significant correlation with \"All I Want for Christmas is You\"" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/opt/conda/lib/python3.8/site-packages/scipy/stats/stats.py:3845: PearsonRConstantInputWarning: An input array is constant; the correlation coefficent is not defined.\n", " warnings.warn(PearsonRConstantInputWarning())\n" ] }, { "data": { "text/plain": [ "[{'col': 'Tawag ng Tanghalan (season 3, quarter I)_80',\n", " 'corr': 0.42718188064663565,\n", " 'p': 3.524046455470085e-100},\n", " {'col': 'Tawag ng Tanghalan (season 3)_80',\n", " 'corr': 0.41963677515784387,\n", " 'p': 2.2040219582815046e-96},\n", " {'col': 'Tawag ng Tanghalan (season 3)_81',\n", " 'corr': 0.4151538500141587,\n", " 'p': 3.9297134847417186e-94},\n", " {'col': 'Tawag ng Tanghalan (season 3)_82',\n", " 'corr': 0.41496413323530373,\n", " 'p': 5.348570466557383e-94},\n", " {'col': 'Tawag ng Tanghalan (season 3, quarter I)_81',\n", " 'corr': 0.38587368756325663,\n", " 'p': 1.6532525769584053e-80},\n", " {'col': 'Tawag ng Tanghalan (season 3, quarter I)_79',\n", " 'corr': 0.37752700745584056,\n", " 'p': 6.1489592197905055e-77},\n", " {'col': 'Tawag ng Tanghalan (season 3, quarter I)_82',\n", " 'corr': 0.36852002750662144,\n", " 'p': 4.9533722974120236e-73},\n", " {'col': 'The X Factor: Celebrity_59',\n", " 'corr': 0.34727695650499074,\n", " 'p': 3.603730969714107e-65},\n", " {'col': 'Tawag ng Tanghalan (season 3)_79',\n", " 'corr': 0.344126527727554,\n", " 'p': 2.114127129858737e-63},\n", " {'col': 'The X Factor: Celebrity_58',\n", " 'corr': 0.31705212117051595,\n", " 'p': 4.591941729922087e-54}]" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from scipy.stats import pearsonr\n", "\n", "sig_cols = []\n", "for i in shifted.columns:\n", " nas = np.logical_or(np.isnan(normalised[\"All I Want for Christmas Is You\"].values), \n", " np.isnan(shifted[i].values.astype(\"float\")))\n", " \n", " corr, pval = pearsonr(normalised[\"All I Want for Christmas Is You\"].values[~nas], \n", " shifted[i].values[~nas]\n", " )\n", " if(pval < 0.05):\n", " sig_cols.append({\"col\":i, \"corr\":corr, \"p\":pval})\n", "\n", "# View the top ten \n", "sig_cols.sort(key=lambda x: -abs(x['corr']))\n", "sig_cols[:10]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\"Tawag ng Tanghalan\" is a Philippine singing competition which I'm guessing is similar to the X Factor (also listed in the top 10). It seems like these competitions start their TV runs in late Autumn and interest builds through until the final before Christmas - maybe so the winner can have a shot at a Christmas number one.\n", "\n", "This means that interest and pageviews to their wikipedia pages start increasing through November so the lagged correlation with \"All I Want for Christmas is You\" appears strong. I'm guessing that \"All I Want for Christmas is You\" is also sung in the later stages of these competitions which is why the wikipedia pages are linked.\n", "\n", "Worryingly, none of this is saying anything about what Maria Carey is doing in November and wikipedia pages for new seasons of Tawag ng Tanghalan won't be included in our data set but let's plow on regardless." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "def build_regressor_model(observed_time_series, regressors):\n", " trend = tfp.sts.LocalLinearTrend(observed_time_series=observed_time_series)\n", " weekly = tfp.sts.Seasonal(\n", " num_seasons=7, observed_time_series=observed_time_series, name=\"week\")\n", " annual = tfp.sts.SmoothSeasonal(\n", " period=365, frequency_multipliers=[1, 2, 3, 4, 5, 6])\n", " regressors = tfp.sts.SparseLinearRegression(\n", " design_matrix=regressors, weights_prior_scale=0.01\n", " )\n", " model = tfp.sts.Sum([trend, weekly, annual, regressors], observed_time_series=observed_time_series)\n", " return model" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "WARNING:tensorflow:@custom_gradient grad_fn has 'variables' in signature, but no ResourceVariables were used on the forward pass.\n", "WARNING:tensorflow:@custom_gradient grad_fn has 'variables' in signature, but no ResourceVariables were used on the forward pass.\n", "WARNING:tensorflow:@custom_gradient grad_fn has 'variables' in signature, but no ResourceVariables were used on the forward pass.\n", "WARNING:tensorflow:@custom_gradient grad_fn has 'variables' in signature, but no ResourceVariables were used on the forward pass.\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "training_regressors = shifted[[x['col'] for x in sig_cols]].to_numpy(na_value=0).astype(\"float32\")\n", "\n", "regressor_model = build_regressor_model(observed, training_regressors)\n", "\n", "variational_posteriors = tfp.sts.build_factored_surrogate_posterior(\n", " model=regressor_model)\n", "\n", "# Build and optimize the variational loss function.\n", "elbo_loss_curve = tfp.vi.fit_surrogate_posterior(\n", " target_log_prob_fn=regressor_model.joint_log_prob(\n", " observed_time_series=observed),\n", " surrogate_posterior=variational_posteriors,\n", " optimizer=tf.optimizers.Adam(learning_rate=0.1),\n", " num_steps=num_variational_steps,\n", " jit_compile=True)\n", "\n", "plt.plot(elbo_loss_curve)\n", "plt.show()\n", "\n", "# Draw samples from the variational posterior.\n", "q_samples = variational_posteriors.sample(100)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now make the forecast" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "forecast_dist = tfp.sts.forecast(\n", " regressor_model,\n", " observed_time_series=observed,\n", " parameter_samples=q_samples,\n", " num_steps_forecast=53)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "forecast_mean, forecast_scale = (\n", " forecast_dist.mean().numpy()[..., 0],\n", " forecast_dist.stddev().numpy()[..., 0])" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0.3419128 , 0.16032058, 0.15885748, 0.1694471 , 0.17209485,\n", " 0.24001464, 0.30079925, 0.23198693, 0.2288272 , 0.30739444,\n", " 0.2748402 , 0.27468073, 0.2854338 , 0.3390003 , 0.43987024,\n", " 0.4561404 , 0.41528323, 0.5061559 , 0.5395754 , 0.5807379 ,\n", " 0.65537524, 0.74345917, 0.6702833 , 0.6577884 , 0.7820074 ,\n", " 0.9250628 , 0.98716795, 0.97071433, 0.96333086, 1.0289012 ,\n", " 1.0218781 , 1.0453612 , 1.2554653 , 1.3225553 , 1.4090129 ,\n", " 1.3831987 , 1.2706091 , 1.4852198 , 1.4680619 , 1.493119 ,\n", " 1.4223785 , 1.4672687 , 1.3933413 , 1.3527845 , 1.2680241 ,\n", " 1.389934 , 1.2610297 , 1.179503 , 1.1058247 , 0.96355927,\n", " 0.806806 , 0.78724074, 0.7621913 ], dtype=float32)" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "forecast_mean" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This seems way worse; peak value for the first forecast was `3.68` compared with `2.69` here" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "padded_forecast = np.pad(forecast_mean,(len(observed),0),constant_values=(np.NaN,))\n", "forecast_df['Lagged regressors'] = padded_forecast\n", "ax = sns.lineplot(data=forecast_df.tail(730), dashes=False, palette=[\"blue\",\"green\",\"red\"], sizes=[1,10,10])\n", "import matplotlib.dates as mdates\n", "ax.xaxis.set_major_locator(mdates.MonthLocator(interval=3))\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is textbook overfitting :-(\n", "\n", "Regressors that were predictive in December 2019 do not work so well in 2020 and the model has learned to rely more on the regressors than the seasonal components.\n", "\n", "Let's analyse this in a little more detail by looking at the regression coefficients" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DescribeResult(nobs=9766, minmax=(-3.6937814, 5.5515313), mean=0.0075476845, variance=0.11523925, skewness=2.4852867126464844, kurtosis=42.284171718810875)" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "regs = q_samples['SparseLinearRegression/_weights_noncentered'].numpy().mean(axis=0)\n", "from scipy import stats\n", "stats.describe(regs)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sns.displot(regs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "These are not what I expected! It is true that the regression coefficiants are tightly distributed around zero, but I was expecting it to be more obvious which of them were relevant and which weren't. I think the `SparseLinearRegression` hasn't worked the way that I wanted it to.\n", "\n", "So to sum up there are two main problems here, they are kind of linked but each could happen alone too:\n", "\n", "1. I chucked a load of data at an algorithm expecting it to be able to figure out what was and wasn't important\n", "2. The result was overfitted on the training set\n", "\n", "Can I do better by manually choosing regressors?\n", "\n", "Let's look at only various lags for the Maria Carey page." ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "WARNING:tensorflow:@custom_gradient grad_fn has 'variables' in signature, but no ResourceVariables were used on the forward pass.\n", "WARNING:tensorflow:@custom_gradient grad_fn has 'variables' in signature, but no ResourceVariables were used on the forward pass.\n", "WARNING:tensorflow:@custom_gradient grad_fn has 'variables' in signature, but no ResourceVariables were used on the forward pass.\n", "WARNING:tensorflow:@custom_gradient grad_fn has 'variables' in signature, but no ResourceVariables were used on the forward pass.\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "cols = [col for col in shifted if col.startswith(\"Mariah Carey_\")]\n", "shifted_mariah = shifted[cols]\n", "\n", "training_regressors = shifted_mariah.to_numpy(na_value=0).astype(\"float32\")\n", "\n", "regressor_model = build_regressor_model(observed, training_regressors)\n", "\n", "variational_posteriors = tfp.sts.build_factored_surrogate_posterior(\n", " model=regressor_model)\n", "\n", "# Build and optimize the variational loss function.\n", "elbo_loss_curve = tfp.vi.fit_surrogate_posterior(\n", " target_log_prob_fn=regressor_model.joint_log_prob(\n", " observed_time_series=observed),\n", " surrogate_posterior=variational_posteriors,\n", " optimizer=tf.optimizers.Adam(learning_rate=0.1),\n", " num_steps=num_variational_steps,\n", " jit_compile=True)\n", "\n", "plt.plot(elbo_loss_curve)\n", "plt.show()\n", "\n", "# Draw samples from the variational posterior.\n", "q_samples = variational_posteriors.sample(100)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "image/png": "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ORlwMtGzZj0NwE03Xcs550xm7NjTsW2b3Nzcw/6dladgWEQkBFQmIdJ4/PDDt7z77lsUFORjmmbp7UuW/MLw4SNLA7vTThvPwoUf1vizH3/8nh07tnP55ZeWnss0TbKyMlmyZBFjxpxEbGwsAOPGncFLLz1XZdtOOmksHo8T7n3zzVesWbOaCy+c8vs5vcTHx//enkVcd92NACQmNuOYY46tcJ7hw0eSlJRUY/sGDBjI448/SklJCYMGDWHQoCEADB48hFmzHub4409k2LARdO7clfz8PNavX8tpp00A4IgjOtO1aw9WrlzOqFGjATj11HGljzFo0BBeeeVFdu/exVFHDaNPnyOr+7XUmoJhEZEQUDAs4p+iiZP9zt56PC683vr9Y9u9exePPfYQzzzzMm3atGX58qXcfvstAL/X1la+3WRNPzv66OH88593VHG/2ouJia1w3/PPv5Bx486o9LxGNVtjHnyeqtp33HEncOSR/fjppx945ZUXmT9/LjNm3MmVV17Hhg3r+eWXn/nnP29i4sTzOOGEkyp9rPLtKP+455wzmZEjR/Pzzz/yyCP3c9RRw7j00suq74Ba0AQ6EZEQ0DrDIo1DXl4eHk8EqampWJbFnDnvlP5s4MDB/PDDt+zfvx+ABQvm1epnQ4cO48cfv2fjxg2lt61evRKAwYOH8tlnn1BQUIBpmnz44dxat3XUqNG8997bpaULxcXFrFu3FnCyrh9++AHglDZ8/fVXVZ6nuvZt376NlJRUTjttPBdccAmrVjm3b926mS5dunLOOedy8smnsnr1KuLi4unatTsffeQ89y1bNrNhw1p6964847t16xbatm3HmWf+gT/96dzSx6wrZYZFREJIwbBIeLn66stxu92l37/00hscf/yJTJkykZYtWzJw4GCWLl0CQLdu3Zk8+c/85S8XkJKSypAhQ4mLi6/xZ+3bd2DGjDu57747KSoqwustoW/f/vTq1YeRI49hxYplXHDBZJo3T2PgwMFkZGTUqu1jx57OgQP7ueIKp7zBsizOOutPdOvWnWnTLuG+++5gypRzaN26Nf369SstoThYde377LP/sXDhAiIiPBiGwVVXXQfAk0/OYvv2rbjdHuLj47n55hkA3HrrXTzwwD3897+v4Xa7ueWWO0pLRw729ttvsHjxL0REeIiIiOSaa/5Wq+ddE8MOxfoY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H7+qx9i7dy+XXXYZBQUFuFwumjVrxo033kifPn38Ok91z6+x9RnAtm3b+Pvf/87+/fvxeDxcffXVHHvsseqzah4jEOcJdJ+Fur+qOo+/zzMY/XU4fVXT41fXx7V9joEaw6r7fRyuhtpnEJgxrKn1WaDGwkD2Waj7q77HsED3VyAoGBYRERGRJksT6ERERESkyVIwLCIiIiJNloJhEREREWmyFAyLiIiISJOlYFhEREREmiwFwyIiIiLSZGkHOhGRBmDMmDHs3bsXt9uN2+2ma9eunHHGGUycODFguxiKiMihFAyLiDQQs2fPZsSIEeTk5PDTTz9x9913s2zZMu69995QN01EpNFSukFEpIFJSEjghBNO4JFHHuG9995j7dq1fPHFF5x55pkMGjSIY489lscee6z0+EsvvZT//Oc/Fc4xfvx4Pvnkk2A3XUQk7CgYFhFpoPr160erVq1YtGgRMTExzJw5k0WLFvHUU0/x+uuvlwa7Z555JnPnzi2935o1a9izZw+jR48OVdNFRMKGgmERkQasRYsWHDhwgKOPPpoePXrgcrno2bMnp59+Oj/99BMAJ554Ilu2bGHz5s0AvP/++5x66qlERkaGsOUiIuFBwbCISAOWnp5Os2bNWLp0KVOnTmXYsGEMHjyYN954g3379gEQGRnJ2LFjmTt3LpZlMW/ePM4444wQt1xEJDwoGBYRaaCWLVtGeno6gwcP5rrrruOEE07gyy+/5JdffmHSpEnYtl167FlnncUHH3zA999/T0xMDAMHDgxhy0VEwoeCYRGRBiY3N5fPP/+ca6+9lgkTJtCjRw/y8vJo1qwZUVFRLFu2jHnz5lW4z8CBA3G5XNx3331MmDAhRC0XEQk/hl0+tSAiIiFRfp1hl8tF165dmTBhApMmTcLtdrNgwQJmzpzJ/v37GTp0KG3btiU7O5t//etfped44oknePTRR/nkk09o3759CJ+NiEj4UDAsItJIzJkzhzfffJPXX3891E0REQkbKpMQEWkECgoKeO2115g4cWKomyIiElYUDIuIhLmvv/6a4cOHk5qayrhx40LdHBGRsKIyCRERERFpspQZFhEREZEmS8GwiIiIiDRZCoZFREREpMlSMCwiIiIiTZaCYRERERFpshQMi4iIiEiT9f/zgpk7HguxXwAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "forecast_dist = tfp.sts.forecast(\n", " regressor_model,\n", " observed_time_series=observed,\n", " parameter_samples=q_samples,\n", " num_steps_forecast=53)\n", "\n", "forecast_mean, forecast_scale = (\n", " forecast_dist.mean().numpy()[..., 0],\n", " forecast_dist.stddev().numpy()[..., 0])\n", "\n", "padded_forecast = np.pad(forecast_mean,(len(observed),0),constant_values=(np.NaN,))\n", "forecast_df['Mariah regressors'] = padded_forecast\n", "ax = sns.lineplot(data=forecast_df.tail(730), dashes=False\n", " , palette=[\"blue\",\"green\",\"red\",\"purple\"]\n", " , sizes=[1,10,10])\n", "import matplotlib.dates as mdates\n", "ax.xaxis.set_major_locator(mdates.MonthLocator(interval=3))\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The result isn't very different to the first attempt forecast; it looks like pageviews for \"Mariah Carey\" in November don't tell you very much about what is going to happen in December.\n", "\n", "I'm going to leave it here for the day, I hope this post has demonstrated two things:\n", "\n", "1. This stuff is hard. Being able to use fancy tensorflow models doesn't necessarily make things any easier\n", "2. I don't know enough about All I Want for Christmas is You to really drive this forward (or else it is just hard - see point 1)" ] } ], "metadata": { "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.8.5" } }, "nbformat": 4, "nbformat_minor": 4 }