{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"<h1><center><font size=\"6\">Prdeicting Odds on Horse Racing</font></center></h1>\n\n<center><img src=\"https://images.unsplash.com/photo-1533284133567-0da9844151ce?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=871&q=80\"></img></center>\nPhoto by Pietro Mattia on <a href=\"https://unsplash.com/?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText\">Unsplash</a>","metadata":{}},{"cell_type":"code","source":"from statsmodels.tsa.statespace.sarimax import SARIMAX # used to predict the moving average process\nfrom statsmodels.tsa.arima_process import ArmaProcess\nimport statsmodels.api as sm                           # for series decompose\nfrom statsmodels.graphics.tsaplots import plot_acf     # plot the auto correlation function\nfrom statsmodels.tsa.stattools import adfuller         # test for the stationary time series\nimport matplotlib.pyplot as plt                        # data vizualizing library\nimport numpy as np                                     # data analysis library\nimport pandas as pd                                    # data analysis library\n\nimport warnings                                        # ignore warning\nwarnings.filterwarnings('ignore')\n\n#%matplotlib inline                                     # magic command for data vizualization\n\nimport os                                              # reading the file path from the kaggle kernel\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-09-23T19:18:39.639504Z","iopub.execute_input":"2022-09-23T19:18:39.640605Z","iopub.status.idle":"2022-09-23T19:18:41.349745Z","shell.execute_reply.started":"2022-09-23T19:18:39.640496Z","shell.execute_reply":"2022-09-23T19:18:41.348563Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Read the data","metadata":{}},{"cell_type":"code","source":"path = \"/kaggle/input/big-data-derby-2022/nyra_2019_complete.csv\"\ndf = pd.read_csv(path, header = None)\ndf.head()","metadata":{"execution":{"iopub.status.busy":"2022-09-23T19:18:41.351814Z","iopub.execute_input":"2022-09-23T19:18:41.352170Z","iopub.status.idle":"2022-09-23T19:18:59.702974Z","shell.execute_reply.started":"2022-09-23T19:18:41.352138Z","shell.execute_reply":"2022-09-23T19:18:59.701688Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Renaming the columns","metadata":{}},{"cell_type":"code","source":"df.rename(columns ={\n    1:\"date\",\n    16:\"odds\"\n}, inplace = True)\ndf.head()","metadata":{"execution":{"iopub.status.busy":"2022-09-23T19:18:59.704743Z","iopub.execute_input":"2022-09-23T19:18:59.705184Z","iopub.status.idle":"2022-09-23T19:18:59.727111Z","shell.execute_reply.started":"2022-09-23T19:18:59.705146Z","shell.execute_reply":"2022-09-23T19:18:59.725927Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Goal of the Competition<br>\nThe goal of this competition is to analyze horse racing tactics, drafting strategies, and path efficiency. You will develop a model using never-before-released coordinate data along with basic race information.<br>\n\n\n1. track_id - char(3) 3 character id for the track the race took place at. AQU -Aqueduct, BEL - Belmont, SAR - Saratoga.\n2. race_date - date date the race took place. YYYY-MM-DD\n3. race_number - char(3) Number of the race. Passed as 3 characters but can be cast or converted to int for this data set\n4. program_number - char(3) Program number of the horse in the race passed as 3 characters. Should remain 3 characters as it isn't limited to just numbers. Is essentially the unique identifier of the horse in the race.\n5. trakus_index - int The common collection of point of the lat / long of the horse in the race passed as an integer. From what we can tell, it's collected every 0.25 seconds\n6. latitude - float The latitude of the horse in the race passed as a floa\n7. longitude - float The longitude of the horse in the race passed as a floa\n8. distance_id - int  Distance of the race in furlongs passed as an integer. Example - 600 would be 6 furlongs.\n9. course_type - char(1) The course the race was run over passed as one character. M - Hurdle, D - Dirt, O - Outer turf, I - Inner turf, T - turf.\n10. track_condition - char(3) The condition of the course the race was run on passed as three characters. YL - Yielding, FM - Firm, SY - Sloppy, GD - Good, FT - Fast, MY - Muddy, SF - Soft.\n11. run_up_distance - int Distance in feet of the gate to the start of the race passed as an integer.\n12. race_type - char(5) The classification of the race passed as as five characters. STK - Stakes, WCL - Waiver Claiming, WMC - Waiver Maiden Claiming, SST - Starter Stakes, SHP - Starter Handicap, CLM - Claiming, STR - Starter Allowance, AOC - Allowance Optionl Claimer, SOC - Starter Optional Claimer, MCL - Maiden Claiming, ALW - Allowance, MSW - Maiden Special Weigh\n13. purse -  Purse in US dollars of the race passed as an money with two decimal places.\n14. post_time - char(5)  Time of day the race began passed as 5 character. Example - 01220 would be 12:20.\n15. weight_carried - int  An integer of the weight carried by the horse in the race.\n16. jockey - char(50) Name of the jockey on the horse in the race. 50 character max.\n17. odds - int  Odds to win the race passed as an integer. Divide by 100 to derive the odds to 1. Example - 1280 would be 12.8-1.","metadata":{}},{"cell_type":"markdown","source":"#### Checking the number of rows and columns","metadata":{}},{"cell_type":"code","source":"df.shape","metadata":{"execution":{"iopub.status.busy":"2022-09-23T19:18:59.730441Z","iopub.execute_input":"2022-09-23T19:18:59.730880Z","iopub.status.idle":"2022-09-23T19:18:59.741878Z","shell.execute_reply.started":"2022-09-23T19:18:59.730818Z","shell.execute_reply":"2022-09-23T19:18:59.740903Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### checking the column type","metadata":{}},{"cell_type":"code","source":"df.info()","metadata":{"execution":{"iopub.status.busy":"2022-09-23T19:18:59.742973Z","iopub.execute_input":"2022-09-23T19:18:59.743335Z","iopub.status.idle":"2022-09-23T19:18:59.767338Z","shell.execute_reply.started":"2022-09-23T19:18:59.743303Z","shell.execute_reply":"2022-09-23T19:18:59.766080Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### selecting and grouping the column as per need","metadata":{}},{"cell_type":"code","source":"df_race = df.groupby(\"date\")[[\"odds\"]].sum()\ndf_race.head()","metadata":{"execution":{"iopub.status.busy":"2022-09-23T19:18:59.768622Z","iopub.execute_input":"2022-09-23T19:18:59.769002Z","iopub.status.idle":"2022-09-23T19:19:00.284000Z","shell.execute_reply.started":"2022-09-23T19:18:59.768969Z","shell.execute_reply":"2022-09-23T19:19:00.282344Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_race.shape","metadata":{"execution":{"iopub.status.busy":"2022-09-23T19:19:00.288103Z","iopub.execute_input":"2022-09-23T19:19:00.288510Z","iopub.status.idle":"2022-09-23T19:19:00.295708Z","shell.execute_reply.started":"2022-09-23T19:19:00.288472Z","shell.execute_reply":"2022-09-23T19:19:00.294505Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### vizualizing the trends over time","metadata":{}},{"cell_type":"code","source":"fig, ax = plt.subplots(figsize = (19, 9))\n\nplt.tick_params(\n    axis='x',          # changes apply to the x-axis\n    which='both',      # both major and minor ticks are affected\n    bottom=False,      # ticks along the bottom edge are off\n    top=False,         # ticks along the top edge are off\n    labelbottom=False)\n\nax.plot(df_race['odds'])\nax.set_xlabel('Time')\nax.set_ylabel('odds')","metadata":{"execution":{"iopub.status.busy":"2022-09-23T19:19:00.297012Z","iopub.execute_input":"2022-09-23T19:19:00.297485Z","iopub.status.idle":"2022-09-23T19:19:01.118956Z","shell.execute_reply.started":"2022-09-23T19:19:00.297439Z","shell.execute_reply":"2022-09-23T19:19:01.118048Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from statsmodels.tsa.seasonal import seasonal_decompose\nfrom dateutil.parser import parse\n\n# Multiplicative Decomposition \nmul_decomposition = seasonal_decompose(df_race['odds'],\n                                       model='multiplicative', period=10)\n\n# Additive Decomposition\nadd_decomposition = seasonal_decompose(df_race['odds'],\n                                       model='additive', period=10)\n\n# Plot\nplt.rcParams.update({'figure.figsize': (16,12)})\n\nmul_decomposition.plot().suptitle('Multiplicative Decomposition', fontsize=16)\nplt.tight_layout(rect=[0, 0.03, 1, 0.95])\n\nadd_decomposition.plot().suptitle('Additive Decomposition', fontsize=16)\nplt.tight_layout(rect=[0, 0.03, 1, 0.95])\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-09-23T19:19:01.120066Z","iopub.execute_input":"2022-09-23T19:19:01.121047Z","iopub.status.idle":"2022-09-23T19:19:27.093393Z","shell.execute_reply.started":"2022-09-23T19:19:01.121008Z","shell.execute_reply":"2022-09-23T19:19:27.092145Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"The series above shows the pattern of peaks and troughs over the time. Hence, it can be said that series is not stationary w.r.t time.\nAlso, there is no cyclic pattern and hence we can safely say that there is no seasonal effect.<br>\nIf the magnitude of the seasonal component changes with time then we can say the series to be multiplicative else it is additive. In our case the magnitude of the component remains same so we can say that the series is additive in nature.<br>\nBefore starting the series analysis, we need to make sure of certain conditions. They are as follows:<br>\n![image.png](attachment:b678f2a9-6d2f-4108-847c-bb0888349082.png)<br>\n\nImage take from Time Series in Python book.","metadata":{},"attachments":{"b678f2a9-6d2f-4108-847c-bb0888349082.png":{"image/png":"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"}}},{"cell_type":"markdown","source":"# Test for stationary\nA times series is defined as stationary if its statistical properties does not change over time. This means that the mean, variance and autocorrelation properties are independent of time. The moving average model assumes that the time series provided is stationary. Otherwise, model is not reliable and forecast is incorrect.<br>\nThe series that we are working with cleary shows that it is not statinary. Let us check for it's mean, variance and then perform ADF test.","metadata":{}},{"cell_type":"markdown","source":"## Mean","metadata":{}},{"cell_type":"code","source":"## checking the variation of mean over time\nmean_func = []\nfor i in range(len(df_race[\"odds\"])):\n    mean_func.append(np.mean(df_race[\"odds\"][:i]))\n\n## vizualizing the variation of mean over time\nfig, ax = plt.subplots(figsize = (19, 9))\nax.plot(mean_func)\nax.set_xlabel('Timesteps')\nax.set_ylabel('mean of odds')","metadata":{"execution":{"iopub.status.busy":"2022-09-23T19:19:27.097305Z","iopub.execute_input":"2022-09-23T19:19:27.097706Z","iopub.status.idle":"2022-09-23T19:19:27.386653Z","shell.execute_reply.started":"2022-09-23T19:19:27.097668Z","shell.execute_reply":"2022-09-23T19:19:27.385537Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"From above we see that the mean of the series is increasing and decreasing w.r.t time. Hence, it can be said that the unit root is present and the series is non-stationary.","metadata":{}},{"cell_type":"markdown","source":"## Variance","metadata":{}},{"cell_type":"code","source":"## checking the variation of variance over time\nvar_func = []\nfor i in range(len(df_race[\"odds\"])):\n    var_func.append(np.var(df_race[\"odds\"][:i]))\n\n## vizualizing the variation of variance over time\nfig, ax = plt.subplots(figsize = (19, 9))\nax.plot(var_func)\nax.set_xlabel('Timesteps')\nax.set_ylabel('Variance of odds')","metadata":{"execution":{"iopub.status.busy":"2022-09-23T19:19:27.387942Z","iopub.execute_input":"2022-09-23T19:19:27.388297Z","iopub.status.idle":"2022-09-23T19:19:27.689474Z","shell.execute_reply.started":"2022-09-23T19:19:27.388265Z","shell.execute_reply":"2022-09-23T19:19:27.688323Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"The variation of variance over time states that the variance is time dependent and the series os non-stationary. Let us now check for the ADF test.","metadata":{}},{"cell_type":"markdown","source":"## Augmented Dickey-Fuller (ADF) test\nThe null hypothesis of ADF test verifies that there is a unit root present which makes the time series non-stationary. The alternative hypothesis is that there is no unit root and therefore the time series is non stationary.<br>\nThe result of the ADF test is a negative number. The greater the value of negative number the stronger is the rejection that series is non-stationary. Thus, desired is the result of achieving the stationary time series.<br>\np-value: < 0.05 then the series is stationary. It means that there are not unit roots, and so the series is stationary.<br>\np-value: > 0.05 then the series is non-stationary<br>","metadata":{}},{"cell_type":"code","source":"## ADF Test\nADF_result = adfuller(df_race['odds'])\n\nprint(f'ADF Statistic: {ADF_result[0]}')\nprint(f'p-value: {ADF_result[1]}')","metadata":{"execution":{"iopub.status.busy":"2022-09-23T19:19:27.691197Z","iopub.execute_input":"2022-09-23T19:19:27.691544Z","iopub.status.idle":"2022-09-23T19:19:27.720009Z","shell.execute_reply.started":"2022-09-23T19:19:27.691512Z","shell.execute_reply":"2022-09-23T19:19:27.718601Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"The above ADF test does not show a large negative number. Athough the p value < 0.05. Ths we can say that the series is non stationary and apply tranformations to make it stationary.","metadata":{}},{"cell_type":"markdown","source":"# Applying Transformation\nThe tranformation is a mathematecial process which aims stabalize the series by manipulating either it's mean or variance. The the process of tranformation make the series stationary. <b>Differencing</b> is the simplest means of transformation which stabilize the mean and removes and reduces the trend and seasonality effects.<br>\nIn differencing the change from one timestep to other is calculated. This is done by subtracting the previous time stamp from the present and the value obtained is the differenced value.<br>\n\ny<sup>'</sup><sub>t</sub> = y<sub>t</sub> − y<sub>t − 1</sub><br>\n\nApplying a log function to the series can stabilize its variance.<br>\n\nThe <b>first order differencing</b> is done when the difference is take only once. Taking the difference second time results in <b>second order differencing</b>\n#### Untransform the series\nThe process of untransform is done to bring back the results to the original units of measurement. The predictions obtain will make more sense w.r.t original context.","metadata":{}},{"cell_type":"code","source":"## first order differencing\nodds_diff = np.diff(df_race['odds'], n=1)","metadata":{"execution":{"iopub.status.busy":"2022-09-23T19:19:27.721916Z","iopub.execute_input":"2022-09-23T19:19:27.722394Z","iopub.status.idle":"2022-09-23T19:19:27.729427Z","shell.execute_reply.started":"2022-09-23T19:19:27.722345Z","shell.execute_reply":"2022-09-23T19:19:27.727336Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## vizualizing time series after first order differencing\n\nfig, ax = plt.subplots(figsize = (19, 9))\n\nax.plot(odds_diff)\nax.set_xlabel('Timestamps')\nax.set_ylabel('Odds (differenced)')","metadata":{"execution":{"iopub.status.busy":"2022-09-23T19:19:27.731941Z","iopub.execute_input":"2022-09-23T19:19:27.732420Z","iopub.status.idle":"2022-09-23T19:19:28.012297Z","shell.execute_reply.started":"2022-09-23T19:19:27.732371Z","shell.execute_reply":"2022-09-23T19:19:28.011207Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## checking for stationary\nADF_result = adfuller(odds_diff)\n\nprint(f'ADF Statistic: {ADF_result[0]}')\nprint(f'p-value: {ADF_result[1]}')","metadata":{"execution":{"iopub.status.busy":"2022-09-23T19:19:28.013904Z","iopub.execute_input":"2022-09-23T19:19:28.014257Z","iopub.status.idle":"2022-09-23T19:19:28.030753Z","shell.execute_reply.started":"2022-09-23T19:19:28.014225Z","shell.execute_reply":"2022-09-23T19:19:28.029628Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"The value of ADF is a large negative number also the p-vale is very small than 0.05. This make our series sattionary and now we can move to the next step of plotting ACF.","metadata":{}},{"cell_type":"markdown","source":"## Auto Correlation Function (ACF)\n\nCorrelation defines the extent of linear relationship between two variables. Thus, autocorrelation measures the relationship between the lagged values of time series. Lag is the number of timestamps seperating two values.<br>\n\nIn the ACF plot, the coefficient is the dependent variable while the lag is the independent varable. The coefficient at the lag 0 will always be equal to 1. This is because the linear relationship between a variable and itself at the same timestep should be perfect, and\ntherefore equal to 1.<br>\n\nIn the presence of a trend when plotting the ACF, the coefficients will be high for short lags, and we will see a linear decrease as the lag increases. If the data is seasonal, the ACF plot will also display cyclical patterns. Plotting the ACF for a stationary process can help us identify the presence of a random walk.<br>","metadata":{}},{"cell_type":"code","source":"## plotting the ACF with the lags of 20\n\nplt.rcParams[\"figure.figsize\"] = (15,9)\nplot_acf(odds_diff, lags=20);","metadata":{"execution":{"iopub.status.busy":"2022-09-23T19:19:28.032315Z","iopub.execute_input":"2022-09-23T19:19:28.032649Z","iopub.status.idle":"2022-09-23T19:19:28.267742Z","shell.execute_reply.started":"2022-09-23T19:19:28.032616Z","shell.execute_reply":"2022-09-23T19:19:28.266574Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"In the above figure we see significant correlation until lag 1. This means that we have a stationary moving average process of order 1. Therefor we can use the first order moving average model to forecast our stationary time series.","metadata":{}},{"cell_type":"markdown","source":"# Defining moving average model\nThis model states that the current value is linearly dependent on the current and past error terms. The errors are assumed to be muually independent and normally distributed. The model is denoted by MA(q) where q is the order. Mathematically, the moving average process of order q is represented by:<br>\ny<sub>t</sub> = μ + ϵ<sub>t</sub> + θ<sub>1</sub>ϵ<sub>t−1</sub> + θ<sub>2</sub>ϵ<sub>t−2</sub> +⋅⋅⋅+ θ<sub>q</sub>ϵ<sub>t−q</sub><br>\nwhere:\ny<sub>t</sub>: present value<br>\nμ: mean of the series<br>\nϵ<sub>t</sub>: present error term<br>\nϵ<sub>t−1</sub>: past error terms<br>\nθ<sub>q</sub>: The magnitude of the impact of past errors on the present value is quantified using a coefficient denoted as θq. <br>\nThe larger q is, the more past error terms affect the present value.","metadata":{}},{"cell_type":"markdown","source":"# Forecasting a moving average process\nTo forecast we have taken a stationary series. Now we will split the data into training and testing set in the ratio 9:1. Note that we are taking the differenced odds series for the further analysis as it is this series which make the data stationary.","metadata":{}},{"cell_type":"code","source":"## splitting the series in 9:1 ratio. \ndf_diff = pd.DataFrame({'odds_diff': odds_diff})\n\ntrain = df_diff[:int(0.9*len(df_diff))]\ntest = df_diff[int(0.9*len(df_diff)):]\n\n## printing the length of each series\nprint(len(train))\nprint(len(test))","metadata":{"execution":{"iopub.status.busy":"2022-09-23T19:19:28.269202Z","iopub.execute_input":"2022-09-23T19:19:28.269533Z","iopub.status.idle":"2022-09-23T19:19:28.277054Z","shell.execute_reply.started":"2022-09-23T19:19:28.269504Z","shell.execute_reply":"2022-09-23T19:19:28.275892Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## vizaulizing the train and test series\nfig, (ax1, ax2) = plt.subplots(nrows=2, ncols=1, sharex=True, figsize = (19, 9))\n\nax1.plot(df_race['odds'])\nax1.set_xlabel('Time')\nax1.set_ylabel('odds')\nax1.axvspan(195, 217, color='#808080', alpha=0.2)\n\nax2.plot(df_diff['odds_diff'])\nax2.set_xlabel('Time')\nax2.set_ylabel('odds differenced')\nax2.axvspan(194, 215, color='#808080', alpha=0.2)\n\nplt.tick_params(\n    axis='x',          # changes apply to the x-axis\n    which='both',      # both major and minor ticks are affected\n    bottom=False,      # ticks along the bottom edge are off\n    top=False,         # ticks along the top edge are off\n    labelbottom=False)","metadata":{"execution":{"iopub.status.busy":"2022-09-23T19:19:28.278605Z","iopub.execute_input":"2022-09-23T19:19:28.279068Z","iopub.status.idle":"2022-09-23T19:19:29.949887Z","shell.execute_reply.started":"2022-09-23T19:19:28.279034Z","shell.execute_reply":"2022-09-23T19:19:29.948593Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def rolling_forecast(df, train_len, horizon, window, method):\n\n    # total length is the sum of train and test set length\n    total_len = train_len + horizon\n    \n    # creating if loop taking the method\n    if method == 'mean':\n        \n        # creating the empty list to store the values\n        pred_mean = []\n        \n        # for loop stating start, stop and step values\n        for i in range(train_len, total_len, window):\n            # storing the mean of ith value in mean variable\n            mean = np.mean(df[:i].values)\n            # store the lastest value obtain to the end of the list\n            pred_mean.extend(mean for _ in range(window))\n\n        return pred_mean\n\n    elif method == 'last':\n        pred_last_value = []\n        \n        for i in range(train_len, total_len, window):\n            last_value = df[:i].iloc[-1].values[0]\n            pred_last_value.extend(last_value for _ in range(window))\n            \n        return pred_last_value\n    \n    elif method == 'MA':\n        pred_MA = []\n        \n        for i in range(train_len, total_len, window):\n            model = SARIMAX(df[:i], order=(0,0,2))\n            res = model.fit(disp=False)\n            predictions = res.get_prediction(0, i + window - 1)\n            oos_pred = predictions.predicted_mean.iloc[-window:]\n            pred_MA.extend(oos_pred)\n            \n        return pred_MA","metadata":{"execution":{"iopub.status.busy":"2022-09-23T19:19:29.951368Z","iopub.execute_input":"2022-09-23T19:19:29.951733Z","iopub.status.idle":"2022-09-23T19:19:29.962745Z","shell.execute_reply.started":"2022-09-23T19:19:29.951698Z","shell.execute_reply":"2022-09-23T19:19:29.961634Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# setting up the variables\npred_df = test.copy()\n\nTRAIN_LEN = len(train)\nHORIZON = len(test)\nWINDOW = 1\n\npred_mean = rolling_forecast(df_diff, TRAIN_LEN, HORIZON, WINDOW, 'mean')\npred_last_value = rolling_forecast(df_diff, TRAIN_LEN, HORIZON, WINDOW, 'last')\npred_MA = rolling_forecast(df_diff, TRAIN_LEN, HORIZON, WINDOW, 'MA')\n\npred_df['pred_mean'] = pred_mean\npred_df['pred_last_value'] = pred_last_value\npred_df['pred_MA'] = pred_MA\n\npred_df.head()\n","metadata":{"execution":{"iopub.status.busy":"2022-09-23T19:19:29.963867Z","iopub.execute_input":"2022-09-23T19:19:29.964976Z","iopub.status.idle":"2022-09-23T19:19:31.436579Z","shell.execute_reply.started":"2022-09-23T19:19:29.964922Z","shell.execute_reply":"2022-09-23T19:19:31.435333Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# specifying up the figure size\nfig, ax = plt.subplots(figsize = (19, 9))\n\n# specying original and forecast series \nax.plot(df_diff['odds_diff'])\nax.plot(pred_df['odds_diff'], 'b-', label='actual')\nax.plot(pred_df['pred_mean'], 'g:', label='mean')\nax.plot(pred_df['pred_last_value'], 'r-.', label='last')\nax.plot(pred_df['pred_MA'], 'k--', label='MA(1)')\n\n# locking the legend\nax.legend(loc=2)\n# taking the x-range of importance\nax.set_xlim(190, 217)\n\n# setting the x label\nax.set_xlabel('Time')\n# setting the y label\nax.set_ylabel('Odds')","metadata":{"execution":{"iopub.status.busy":"2022-09-23T19:19:31.438372Z","iopub.execute_input":"2022-09-23T19:19:31.439578Z","iopub.status.idle":"2022-09-23T19:19:31.779767Z","shell.execute_reply.started":"2022-09-23T19:19:31.439522Z","shell.execute_reply":"2022-09-23T19:19:31.778886Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"From above figure:\n1. The mean is almost a straight line\n2. Forecast obtain using the last is shifted by 1\n3. The MA forecast closely follows the original series<br>\n\nTo find the performance of the models we will use the MSE function imported from sklearn package. The model having the lowest MSE will be the best performing model.","metadata":{}},{"cell_type":"code","source":"from sklearn.metrics import mean_squared_error\n\nmse_mean = mean_squared_error(pred_df['odds_diff'], pred_df['pred_mean'])\nmse_last = mean_squared_error(pred_df['odds_diff'], pred_df['pred_last_value'])\nmse_MA = mean_squared_error(pred_df['odds_diff'], pred_df['pred_MA'])\n\nprint(mse_mean, mse_last, mse_MA)","metadata":{"execution":{"iopub.status.busy":"2022-09-23T19:19:31.781210Z","iopub.execute_input":"2022-09-23T19:19:31.781785Z","iopub.status.idle":"2022-09-23T19:19:31.909247Z","shell.execute_reply.started":"2022-09-23T19:19:31.781749Z","shell.execute_reply":"2022-09-23T19:19:31.908111Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# plotting the MSE\nfig, ax = plt.subplots(figsize = (15, 9))\n\nx = ['mean', 'last_value', 'MA(1)']\ny = [mse_mean, mse_last, mse_MA]\n\nax.bar(x, y, width=0.4)\nax.set_xlabel('Methods')\nax.set_ylabel('MSE')","metadata":{"execution":{"iopub.status.busy":"2022-09-23T19:19:31.910573Z","iopub.execute_input":"2022-09-23T19:19:31.910935Z","iopub.status.idle":"2022-09-23T19:19:32.111348Z","shell.execute_reply.started":"2022-09-23T19:19:31.910902Z","shell.execute_reply":"2022-09-23T19:19:32.110112Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"From above we see that the MA provides the lowest MSE value. Thus, this is the best model among the above three we used for forecasting.\n\n### Untranforming the series\nThe prediction obtained above uses the differenced series. We need to undifference it to bring it back to original form.<br>\n\nIn order to reverse our first-order difference, we need to add an initial value y<sub>0</sub> to the first differenced value y<sup>'</sup><sub>1</sub>. That way, we can recover y<sub>1</sub> in its original scale.<br>\ny<sub>1</sub> = y<sub>0</sub> + y<sup>'</sup><sub>1</sub> = y<sub>0</sub> + y<sub>1</sub> − y<sub>0</sub> = y<sub>1</sub>","metadata":{}},{"cell_type":"code","source":"## crating empty series to store values\ndf_race['pred_odds'] = pd.Series()\n## predicted test series in untranform form = first term of original test series + cumulative sum of predicted series using MA\n## applying the cumulative sum once will undo a first-order differencing\ndf_race['pred_odds'][195:] = df_race['odds'].iloc[195] + pred_df['pred_MA'].cumsum()","metadata":{"execution":{"iopub.status.busy":"2022-09-23T19:19:32.112827Z","iopub.execute_input":"2022-09-23T19:19:32.113866Z","iopub.status.idle":"2022-09-23T19:19:32.123430Z","shell.execute_reply.started":"2022-09-23T19:19:32.113800Z","shell.execute_reply":"2022-09-23T19:19:32.122365Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## plotting the untranform series\nfig, ax = plt.subplots(figsize = (19, 9))\n\nax.plot(df_race['odds'], 'b-', label='actual') ## actual test series\nax.plot(df_race['pred_odds'], 'k--', label='MA(1)') ## predicted test series\n\nax.legend(loc=2)\n\nax.set_xlabel('Time')\nax.set_ylabel('odds')\n\nplt.tick_params(\n    axis='x',          # changes apply to the x-axis\n    which='both',      # both major and minor ticks are affected\n    bottom=False,      # ticks along the bottom edge are off\n    top=False,         # ticks along the top edge are off\n    labelbottom=False)","metadata":{"execution":{"iopub.status.busy":"2022-09-23T19:19:32.124721Z","iopub.execute_input":"2022-09-23T19:19:32.125712Z","iopub.status.idle":"2022-09-23T19:19:32.889554Z","shell.execute_reply.started":"2022-09-23T19:19:32.125675Z","shell.execute_reply":"2022-09-23T19:19:32.888311Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## checking the MSE between the predicted and actutal test series\nfrom sklearn.metrics import mean_absolute_error\n\nmae_MA_undiff = mean_absolute_error(df_race['odds'].iloc[195:], df_race['pred_odds'].iloc[195:])\n\nprint(mae_MA_undiff)","metadata":{"execution":{"iopub.status.busy":"2022-09-23T19:19:32.891043Z","iopub.execute_input":"2022-09-23T19:19:32.892003Z","iopub.status.idle":"2022-09-23T19:19:32.900357Z","shell.execute_reply.started":"2022-09-23T19:19:32.891958Z","shell.execute_reply":"2022-09-23T19:19:32.899203Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"The above notebook is based on the \"Time Series Forecasting in Python by Marco Peixeiro\"","metadata":{}}]}