{"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":"<div class=\"alert alert-block alert-info\">\nIf you find <a href=https://www.kaggle.com/fergusfindley/tpsjan22-eda-baseline-train-submission>this notebook</a> useful or you just like it, please upvote ▲.<br>\nIf you are using any part of this notebook, please link to <a href=https://www.kaggle.com/fergusfindley/tpsjan22-eda-baseline-train-submission>TPSJan22:EDA,baseline,train&submission</a> notebook.<br>\nIn case of any question/feedback don't hesitate to <a href=https://www.kaggle.com/fergusfindley/tpsjan22-eda-baseline-train-submission/comments>comment</a> below.\n</div>","metadata":{}},{"cell_type":"markdown","source":"<hr>","metadata":{}},{"cell_type":"markdown","source":"<h1><center>🏆 TabularPlaygroundSeries Jan22: EDA, baseline, train & submission📊</center></h1>\n<h2><center>Help us figure out whether KaggleMart or KaggleRama should become the official Kaggle outlet!</center></h2>\n<center>\n    <img src = \"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F59561%2Fcc6d9a21f0c3ed71b00113b33efb2b66%2Fkaggle_sweater.png?generation=1640900016906235&alt=media\" width = \"900\" height = \"500\"/></center>","metadata":{}},{"cell_type":"markdown","source":"<div class=\"alert alert-block alert-warning\"> 📌 Please note that this notebook is still underconstruction 🏗👷‍♀️.</div>","metadata":{"execution":{"iopub.status.busy":"2021-12-26T19:14:44.588819Z","iopub.execute_input":"2021-12-26T19:14:44.589179Z","iopub.status.idle":"2021-12-26T19:14:44.625909Z","shell.execute_reply.started":"2021-12-26T19:14:44.58909Z","shell.execute_reply":"2021-12-26T19:14:44.624605Z"}}},{"cell_type":"markdown","source":"<a id=\"references\"></a>\n<h1 id=\"references\" class=\"list-group-item list-group-item-action active\" data-toggle=\"list\" style='background:#20BEFF; border:0; color:white' role=\"tab\" aria-controls=\"home\"><center>References</center></h1>\n    \n<a href=\"#toc\" class=\"btn btn-primary btn-sm\" role=\"button\" aria-pressed=\"true\" style=\"color:white\" data-toggle=\"popover\" title=\"Go to TableOfContents\">Go to TOC</a>","metadata":{}},{"cell_type":"markdown","source":"Special thanks to:\n    \n\n> * [TPS Jan Happy New Year](https://www.kaggle.com/subinium/tps-jan-happy-new-year)\n> * [PyCaretfor Starters TPS Jan 2022](https://www.kaggle.com/akmalmir/pycaret-for-starters-tps-jan-2022)\n> * [Tabular Playground Series Jan 2022](https://www.kaggle.com/mfedeli/tabular-playground-series-jan-2022)\n> * [Happy New Year TPS understanding lstm](https://www.kaggle.com/toomuchsauce/happy-new-year-tps-understanding-lstm)\n> * [TPS Jan 2022 automated ensembling](https://www.kaggle.com/sytuannguyen/tps-jan-2022-automated-ensembling/notebook)\n> * [TPS Jan 2022 EDA](https://www.kaggle.com/craigmthomas/tps-jan-2022-eda)\n> * [TPS Jan22-03 Linear Model](https://www.kaggle.com/ambrosm/tpsjan22-03-linear-model)\n> * [How to use 'Kaggle colors util'](https://www.kaggle.com/fergusfindley/how-to-use-kaggle-colors-util)\n> * [TPS Dec EDA Modeling](https://www.kaggle.com/odins0n/tps-dec-eda-modeling)","metadata":{}},{"cell_type":"markdown","source":"<a id=\"toc\"></a>\n<div class=\"list-group\" id=\"list-tab\" role=\"tablist\">\n<h1 id=\"toc\" class=\"list-group-item list-group-item-action active\" data-toggle=\"list\" style='background:#20BEFF; border:0; color:white' role=\"tab\" aria-controls=\"home\"><center>Table of contents</center></h1>","metadata":{}},{"cell_type":"markdown","source":"0. [References](#references) 🎓\n1. [Competition Overview](#competition-overview) 👀\n1. [Libraries](#libraries) 📚\n1. [Load Datasets](#load-datasets) 🧱\n1. [Tabular Exploration](#tabular-exploration) 🔍\n1. [Data Visualization](#data-visualization) 🎨\n1. [Feature Engineering](#feature-engineering) 🧰\n1. [Baseline Model](#baseline-model) 🦄\n1. [Train Models](#train-models) 🏋️‍♂️\n    1. [PyCaret](#pycaret)\n    1. [PyCaret blend top models](#pycaret-blend)\n1. [Blend of blend](#blend-of-blend)🌪\n1. [Submission](#submission) 📝","metadata":{}},{"cell_type":"markdown","source":"<a id=\"competition-overview\"></a>\n<div class=\"list-group\" id=\"list-tab\" role=\"tablist\">\n<h1 id=\"competition-overview\" class=\"list-group-item list-group-item-action active\" data-toggle=\"list\" style='background:#20BEFF; border:0; color:white' role=\"tab\" aria-controls=\"home\"><center>Competition Overview</center></h1>\n    \n<a href=\"#toc\" class=\"btn btn-primary btn-sm\" role=\"button\" aria-pressed=\"true\" style=\"color:white\" data-toggle=\"popover\" title=\"Go to TableOfContents\">Go to TOC</a>","metadata":{"execution":{"iopub.status.busy":"2021-12-26T21:41:38.604646Z","iopub.execute_input":"2021-12-26T21:41:38.605202Z","iopub.status.idle":"2021-12-26T21:41:38.611076Z","shell.execute_reply.started":"2021-12-26T21:41:38.605159Z","shell.execute_reply":"2021-12-26T21:41:38.609899Z"}}},{"cell_type":"markdown","source":"## **<span style=\"color:#58355E;\">Problem Statement</span>**","metadata":{}},{"cell_type":"markdown","source":"https://www.kaggle.com/c/tabular-playground-series-jan-2022 (Month-long Tabular Playground competitions launch on the 1st of every month since 2021.)\n> The goal of these competitions is to provide a fun, and approachable for anyone, tabular dataset. These competitions will be great for people looking for something in between the Titanic Getting Started competition and a Featured competition.\n\nThere are two (fictitious) independent store chains selling Kaggle merchandise (*KaggleRama* & *KaggleMart*) that want to become the official outlet for all things Kaggle. We've decided to see if the Kaggle community could help us figure out which of the store chains would have the best sales going forward. So, we've collected some data and are asking you to build forecasting models to help us decide. \n\nThis is **Time Series** problem about daily sales.","metadata":{}},{"cell_type":"markdown","source":"## **<span style=\"color:#58355E;\">Evaluation Criteria - Metrics</span>**","metadata":{}},{"cell_type":"markdown","source":"Submissions are evaluated on **Symmetric mean absolute percentage error** ([SMAPE](https://en.wikipedia.org/wiki/Symmetric_mean_absolute_percentage_error)) between forecasts and actual values. It is an accuracy measure based on percentage (or relative) errors.\n\n$$\n{\\text{SMAPE}}={\\frac {100\\%}{n}}\\sum _{t=1}^{n}{\\frac {\\left|F_{t}-A_{t}\\right|}{(|A_{t}|+|F_{t}|)/2}}\n$$\nwhere $A_t$ is the actual value and $F_t$ is the forecast/predict value. We define $\\text{SMAPE} = 0$ when the actual and forecasted/predicted values are both $0$.\n\nFollowing [Wikipedia](https://en.wikipedia.org/wiki/Symmetric_mean_absolute_percentage_error) $\\text{SMAPE}$ is not treating over- and under-forecasts equally, which might be helpful when dealing with outliers. \n\n## **<span style=\"color:#58355E;\">Submission File</span>**\n\nFor each row_id in the test set, you must predict the corresponding num_sold. The file should contain a header and have the following format:\n\n```\nrow_id,num_sold\n26298,100\n26299,100\n26300,100\netc.```\n","metadata":{}},{"cell_type":"markdown","source":"<a id=\"libraries\"></a>\n<div class=\"list-group\" id=\"list-tab\" role=\"tablist\">\n<h1 id=\"libraries\" class=\"list-group-item list-group-item-action active\" data-toggle=\"list\" style='background:#20BEFF; border:0; color:white' role=\"tab\" aria-controls=\"home\"><center>Libraries</center></h1>\n    \n<a href=\"#toc\" class=\"btn btn-primary btn-sm\" role=\"button\" aria-pressed=\"true\" style=\"color:white\" data-toggle=\"popover\" title=\"Go to TableOfContents\">Go to TOC</a>","metadata":{}},{"cell_type":"code","source":"DIRECTORY_PATH = \"../input/tabular-playground-series-jan-2022\"\nTRAIN_CSV = DIRECTORY_PATH + \"/train.csv\"\nTEST_CSV = DIRECTORY_PATH + \"/test.csv\"\nSUBMISSION_CSV = DIRECTORY_PATH + \"/sample_submission.csv\"\n\nRANDOM_STATE = 42\n\n# time series data common new feature  \nDATE = \"date\"\n\nYEAR = \"year\"\nQUARTER = \"quarter\"\nMONTH = \"month\"\nWEEK = \"week\"\nDAY = \"day\"\n\nDAYOFYEAR = \"dayofyear\"\nDAYOFMONTH = \"dayofmonth\"\nDAYOFWEEK = \"dayofweek\"\nDAY_NAME = \"day_name\"\nMONTH_NAME = \"month_name\"","metadata":{"execution":{"iopub.status.busy":"2022-01-06T15:19:08.715297Z","iopub.execute_input":"2022-01-06T15:19:08.718335Z","iopub.status.idle":"2022-01-06T15:19:08.798774Z","shell.execute_reply.started":"2022-01-06T15:19:08.717507Z","shell.execute_reply":"2022-01-06T15:19:08.797761Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install -qqq bar_chart_race --user\n!pip install -qqq pycaret --user","metadata":{"execution":{"iopub.status.busy":"2022-01-06T15:19:13.075456Z","iopub.execute_input":"2022-01-06T15:19:13.07633Z","iopub.status.idle":"2022-01-06T15:20:00.035157Z","shell.execute_reply.started":"2022-01-06T15:19:13.076292Z","shell.execute_reply":"2022-01-06T15:20:00.0337Z"},"_kg_hide-input":true,"_kg_hide-output":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from IPython.display import Markdown as md\n\nimport numpy as np\nimport pandas as pd\n\nimport holidays\nfrom pycaret.regression import *\n\nimport os\n\nfrom kaggle_colors_util import *\nimport pandas_profiling\nimport plotly.graph_objects as go\n\nfrom bar_chart_race import bar_chart_race\n\nimport gc  # garbage collection (clear up some RAM)\n\nimport warnings\nwarnings.filterwarnings('ignore')","metadata":{"execution":{"iopub.status.busy":"2022-01-06T15:55:39.440086Z","iopub.execute_input":"2022-01-06T15:55:39.440435Z","iopub.status.idle":"2022-01-06T15:55:39.604893Z","shell.execute_reply.started":"2022-01-06T15:55:39.440399Z","shell.execute_reply":"2022-01-06T15:55:39.603965Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# https://www.kaggle.com/c/web-traffic-time-series-forecasting/discussion/36414\ndef smape(y_true, y_pred):\n    denominator = (np.abs(y_true) + np.abs(y_pred)) / 2.0\n    diff = np.abs(y_true - y_pred) / denominator\n    diff[denominator == 0] = 0.0\n    return 100*np.mean(diff)","metadata":{"execution":{"iopub.status.busy":"2022-01-06T15:20:05.485442Z","iopub.execute_input":"2022-01-06T15:20:05.486071Z","iopub.status.idle":"2022-01-06T15:20:05.49119Z","shell.execute_reply.started":"2022-01-06T15:20:05.486033Z","shell.execute_reply":"2022-01-06T15:20:05.490324Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<a id=\"load-datasets\"></a>\n<div class=\"list-group\" id=\"list-tab\" role=\"tablist\">\n<h1 id=\"load-datasets\" class=\"list-group-item list-group-item-action active\" data-toggle=\"list\" style='background:#20BEFF; border:0; color:white' role=\"tab\" aria-controls=\"home\"><center>Load Datasets</center></h1>\n    \n<a href=\"#toc\" class=\"btn btn-primary btn-sm\" role=\"button\" aria-pressed=\"true\" style=\"color:white\" data-toggle=\"popover\" title=\"Go to TableOfContents\">Go to TOC</a>","metadata":{}},{"cell_type":"code","source":"train_df = pd.read_csv(TRAIN_CSV, parse_dates=[DATE])\ntest_df = pd.read_csv(TEST_CSV, parse_dates=[DATE])\nsubmission_df = pd.read_csv(SUBMISSION_CSV)\n\nID = 'row_id'\nTARGET = 'num_sold'\n\ndfs_dict = {\"train\":train_df, \"test\":test_df}\ntest_ids = test_df[ID]","metadata":{"execution":{"iopub.status.busy":"2022-01-06T15:20:05.493208Z","iopub.execute_input":"2022-01-06T15:20:05.494006Z","iopub.status.idle":"2022-01-06T15:20:05.835105Z","shell.execute_reply.started":"2022-01-06T15:20:05.493965Z","shell.execute_reply":"2022-01-06T15:20:05.833525Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<a id=\"tabular-exploration\"></a>\n<div class=\"list-group\" id=\"list-tab\" role=\"tablist\">\n<h1 id=\"tabular-exploration\" class=\"list-group-item list-group-item-action active\" data-toggle=\"list\" style='background:#20BEFF; border:0; color:white' role=\"tab\" aria-controls=\"home\"><center>Tabular Exploration</center></h1>\n    \n<a href=\"#toc\" class=\"btn btn-primary btn-sm\" role=\"button\" aria-pressed=\"true\" style=\"color:white\" data-toggle=\"popover\" title=\"Go to TableOfContents\">Go to TOC</a>","metadata":{"execution":{"iopub.status.busy":"2021-12-26T23:09:33.423668Z","iopub.execute_input":"2021-12-26T23:09:33.423945Z","iopub.status.idle":"2021-12-26T23:09:33.430025Z","shell.execute_reply.started":"2021-12-26T23:09:33.423914Z","shell.execute_reply":"2021-12-26T23:09:33.428814Z"}}},{"cell_type":"markdown","source":"## **<span style=\"color:#58355E;\">AutoEDA with Pandas Profiling</span>**\n\nProfiling is a process that helps us in understanding our data and [PandasProfiling](https://github.com/pandas-profiling/pandas-profiling) is python package which does exactly that. It is a simple and fast way to perform Exploratory Data Analysis (EDA) of a Pandas Dataframe. The pandas `df.describe()` and `df.info()` functions are normally used as a first step in the EDA process. However, it only gives a very basic overview of the data and doesn’t help much in the case of large data sets. \n\nThe Pandas Profiling function, on the other hand, extends the pandas DataFrame with `df.profile_report()` for quick data analysis. It displays a lot of information with a single line of code and that too in an interactive HTML report.","metadata":{}},{"cell_type":"code","source":"for df_name, df in dfs_dict.items():\n    title = 'TabularPlaygroundSeries January 2022 Exploratory Data Analysis using Pandas Profiling'\n    dataset = {\"description\": \"\"\"There are two (fictitious) independent store chains selling Kaggle merchandise that want \n                                 to become the official outlet for all things Kaggle. We've decided to see if the Kaggle \n                                 community could help us figure out which of the store chains would have the best sales \n                                 going forward. So, we've collected some data and are asking you to build forecasting models \n                                 to help us decide.\"\"\",\n               \"copyright_holder\": \"Kaggle.com\",\n               \"copyright_year\": \"2022\",\n               \"url\": \"https://www.kaggle.com/c/tabular-playground-series-jan-2022\",\n               }\n\n    variables = {\"descriptions\":\n                 {\"row_id\": \"Unique ID of the transaction\",\n                  \"date\": \"When the sale was made\",\n                  \"country\": \"The country where the products were sold\",\n                  \"store\": \"KaggleMart or KaggleRama\",\n                  \"product\": \"Either Kaggle Mug, Hat or Sticker\",\n                  \"num_sold\": \"Number of pices sold\",\n                  }\n                 }\n\n    profile = df.profile_report(title=title, \n                                dataset=dataset, \n                                variables=variables, \n                                explorative=False,\n                                minimal=True)\n    # profile.to_file(output_file=f\"{title}.html\")\n    \n    display(md(f'### <span style=\"color:{COLOR_BLUE};\">EDA of {df_name} dataset</span>'))\n    display(profile)","metadata":{"_kg_hide-input":true,"_kg_hide-output":false,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<a id=\"data-visualization\"></a>\n<div class=\"list-group\" id=\"list-tab\" role=\"tablist\">\n<h1 id=\"data-visualization\" class=\"list-group-item list-group-item-action active\" data-toggle=\"list\" style='background:#20BEFF; border:0; color:white' role=\"tab\" aria-controls=\"home\"><center>Data Visualization</center></h1>\n    \n<a href=\"#toc\" class=\"btn btn-primary btn-sm\" role=\"button\" aria-pressed=\"true\" style=\"color:white\" data-toggle=\"popover\" title=\"Go to TableOfContents\">Go to TOC</a>","metadata":{}},{"cell_type":"markdown","source":"<a id=\"histograms\"></a>\n## **<span style=\"color:#58355E;\">Histograms</span>**\n<a href=\"#toc\" class=\"btn btn-primary btn-sm\" role=\"button\" aria-pressed=\"true\" style=\"color:white\" data-toggle=\"popover\" title=\"Go to TableOfContents\">Go to TOC</a>","metadata":{}},{"cell_type":"code","source":"# https://www.kaggle.com/toomuchsauce/happy-new-year-tps-understanding-lstm\nsold = pd.DataFrame(train_df.groupby('country')[TARGET].sum()).reset_index()\n\nfig = go.Figure()\n\nfig.add_trace(go.Bar(\n    x = sold['country'],\n    y = sold[TARGET],\n    text = sold[TARGET],\n    textposition = 'outside',\n    marker_color= [COLOR_BLUE, COLOR_VIOLET, COLOR_YELLOW],\n))\n\nfig.update_xaxes(\n        tickfont = dict(size=15),\n        tickmode = 'array',\n        ticklen = 6,\n        showline = False,\n        showgrid = False,\n        ticks = 'outside')\n\nfig.update_yaxes(showgrid=False,\n                 categoryorder='total ascending',\n                 showline=False)\n\nfig.update_layout(\n                  font_family   = 'monospace',\n                  title         = dict(text = 'Total units sold by Country', x = 0.525),\n                  margin        = dict(t=80, b=0, l=70, r=40),\n                  plot_bgcolor  = 'white',\n                  paper_bgcolor = 'white',\n                  font          = dict(color=COLOR_GREY_DARK),\n                  showlegend    = False)\n\ncountry_flag_dict = {'Finland':'https://i.postimg.cc/wv9Yydft/image.png',\n                     'Norway':\"https://i.postimg.cc/mZ8B9tGT/image.png\",\n                     'Sweden':\"https://i.postimg.cc/T27vwFrw/image.png\"\n                    }\nfor country_name, flag_url in country_flag_dict.items():\n    fig.add_layout_image(\n        dict(\n            source=flag_url,\n            xref=\"x\", yref=\"y\",\n            x=country_name, y=0, \n            sizex=1, sizey=10**6,\n            xanchor=\"center\", yanchor=\"bottom\",\n            opacity = 1,\n        )\n    )\n\nfig.show()","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-01-06T15:30:07.691466Z","iopub.execute_input":"2022-01-06T15:30:07.691749Z","iopub.status.idle":"2022-01-06T15:30:07.732962Z","shell.execute_reply.started":"2022-01-06T15:30:07.691719Z","shell.execute_reply":"2022-01-06T15:30:07.732309Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<a id=\"maps\"></a>\n## **<span style=\"color:#58355E;\">Maps</span>**\n<a href=\"#toc\" class=\"btn btn-primary btn-sm\" role=\"button\" aria-pressed=\"true\" style=\"color:white\" data-toggle=\"popover\" title=\"Go to TableOfContents\">Go to TOC</a>","metadata":{}},{"cell_type":"code","source":"!pip install -qqq calplot --user","metadata":{"execution":{"iopub.status.busy":"2022-01-06T15:20:06.144038Z","iopub.execute_input":"2022-01-06T15:20:06.144345Z","iopub.status.idle":"2022-01-06T15:20:15.954125Z","shell.execute_reply.started":"2022-01-06T15:20:06.144298Z","shell.execute_reply":"2022-01-06T15:20:15.952798Z"},"_kg_hide-input":true,"_kg_hide-output":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# https://www.kaggle.com/craigmthomas/tps-jan-2022-eda\nimport calplot\n\n_ = calplot.calplot(\n    train_df.groupby(DATE)[ID].count(), \n    vmin=0, \n    vmax=18, \n    colorbar=True, \n    suptitle=\"Training Set - Number of Samples Per Day\",\n    suptitle_kws=dict(fontsize=20),\n)","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-01-06T15:32:11.486079Z","iopub.execute_input":"2022-01-06T15:32:11.486381Z","iopub.status.idle":"2022-01-06T15:32:12.474816Z","shell.execute_reply.started":"2022-01-06T15:32:11.486351Z","shell.execute_reply":"2022-01-06T15:32:12.473487Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for country in [\"Finland\", \"Norway\", \"Sweden\"]:\n    df = pd.DataFrame(train_df[(train_df[\"country\"] == country)])\n    df[\"date1\"] = df[DATE]\n    df.set_index(df[DATE], inplace=True)\n    df = df.groupby(\"date1\")[TARGET].cumsum()\n\n    _ = calplot.calplot(\n        df, \n        colorbar=True, \n        linewidth=0,\n        edgecolor=\"black\",\n        linecolor=\"w\",\n        suptitle=\"Total Products Sold per Day in {}\".format(country),\n        suptitle_kws=dict(fontsize=20),\n    )","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-01-06T15:20:28.295496Z","iopub.execute_input":"2022-01-06T15:20:28.295774Z","iopub.status.idle":"2022-01-06T15:20:31.29933Z","shell.execute_reply.started":"2022-01-06T15:20:28.295745Z","shell.execute_reply":"2022-01-06T15:20:31.298397Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"After [craigmthomas](https://www.kaggle.com/craigmthomas/tps-jan-2022-eda)\n\nIt appears that sales are influenced by the following holidays:\n\n    Easter (various clusters in April)\n    Father's Day (various clusters in November)\n    National Day of Sweden (clusters in June for Sweden)\n    Mother's Day in Sweden (clusters in May for Sweden)","metadata":{}},{"cell_type":"markdown","source":"<a id=\"animation\"></a>\n## **<span style=\"color:#58355E;\">Animation</span>**\n<a href=\"#toc\" class=\"btn btn-primary btn-sm\" role=\"button\" aria-pressed=\"true\" style=\"color:white\" data-toggle=\"popover\" title=\"Go to TableOfContents\">Go to TOC</a>","metadata":{}},{"cell_type":"code","source":"train_month = train_df.set_index('date').groupby([pd.Grouper(freq='M'), \n                                                  'country', \n                                                  'store', \n                                                  'product'])[TARGET].mean().unstack([1, 2, 3])","metadata":{"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"bar_chart_race(df=train_month,\n               n_bars=9,\n               period_length=800,\n               cmap=COLOR_CONTINUOUS_SCALE,\n               figsize=(4,3),\n               filename=None)","metadata":{"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<a id=\"feature-engineering\"></a>\n<div class=\"list-group\" id=\"list-tab\" role=\"tablist\">\n<h1 id=\"feature-engineering\" class=\"list-group-item list-group-item-action active\" data-toggle=\"list\" style='background:#20BEFF; border:0; color:white' role=\"tab\" aria-controls=\"home\"><center>Feature Engineering</center></h1>\n    \n<a href=\"#toc\" class=\"btn btn-primary btn-sm\" role=\"button\" aria-pressed=\"true\" style=\"color:white\" data-toggle=\"popover\" title=\"Go to TableOfContents\">Go to TOC</a>","metadata":{"execution":{"iopub.status.busy":"2021-12-31T08:47:20.076914Z","iopub.execute_input":"2021-12-31T08:47:20.07763Z","iopub.status.idle":"2021-12-31T08:47:20.08424Z","shell.execute_reply.started":"2021-12-31T08:47:20.077585Z","shell.execute_reply":"2021-12-31T08:47:20.083217Z"}}},{"cell_type":"markdown","source":"### <span style=\"color:#20BEFF;\">Add Festivities</span>","metadata":{}},{"cell_type":"code","source":"def get_country_holidays(country, years_list):\n    festivities = holidays.CountryHoliday(country, years=years_list)\n    festivities_df = pd.DataFrame.from_dict(festivities, orient='index').reset_index().rename(columns={'index':DATE, 0:'festivity_name'})\n    festivities_df[DATE] = pd.to_datetime(festivities_df[DATE])\n    if country == 'Sweden':\n        festivities_df = festivities_df[festivities_df['festivity_name']!='Söndag']\n    \n    additional_dates = [[pd.to_datetime(f'{year}-12-24'), 'Christmas Eve'] for year in years_list]\n    additional_dates += [[pd.to_datetime(f'{year}-12-29'), 'Peak in sales 1/2'] for year in years_list]\n    additional_dates += [[pd.to_datetime(f'{year}-12-30'), 'Peak in sales 2/2'] for year in years_list]\n    additional_dates += [[pd.to_datetime(f'{year}-12-31'), 'Saint Sylvester'] for year in years_list]\n    additional_dates += [[pd.to_datetime(f'{year}-01-01'), 'New Year'] for year in years_list]\n    additional_festivities_df = pd.DataFrame(additional_dates, columns=[DATE, 'festivity_name'])    \n        \n    festivities_df = festivities_df.append(additional_festivities_df, ignore_index=True)\n    return festivities_df.sort_values(DATE)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"years_list = [2015, 2016, 2017, 2018, 2019]\ncountry_mapping = {'fin':'Finland', 'nor':'Norway', 'swe':'Sweden'}\n\nfor _, df in dfs_dict.items():\n    for iso, country_name in country_mapping.items():\n        df[f'is_festivity_in_{iso}'] = df[DATE].isin(get_country_holidays(country_name, years_list)[DATE]).astype(int)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### <span style=\"color:#20BEFF;\">Days till next holiday</span>","metadata":{}},{"cell_type":"code","source":"def days_till_next_holiday(country, date):\n    country_holidays_dates = get_country_holidays(country, [date.year, date.year+1])[DATE]\n    next_date = min([holidays_date for holidays_date in country_holidays_dates if holidays_date >= date])\n    return (next_date - date).days","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\n# TODO how to optimize below as it's over 3 mins run\nfor _, df in dfs_dict.items():\n    df['days_till_next_holiday'] = df.apply(lambda x: days_till_next_holiday(x['country'], x[DATE]), axis=1)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### <span style=\"color:#20BEFF;\">Cyclic time transformations</span>","metadata":{}},{"cell_type":"code","source":"# https://www.kaggle.com/c/tabular-playground-series-jan-2022/discussion/298200\n# https://www.kaggle.com/c/tabular-playground-series-jan-2022/discussion/298202\n\nfrom sklearn.base import BaseEstimator, TransformerMixin\n\nclass DateProcessor(BaseEstimator, TransformerMixin):\n    def __init__(self, date_format='%d/%m/%Y', hours_secs=False):\n        self.format = date_format\n        self.columns = None\n        self.time_transformations = [\n            ('day_sin', lambda x: np.sin(2*np.pi*x.dt.day/31)),\n            ('day_cos', lambda x: np.cos(2*np.pi*x.dt.day/31)),\n            ('dayofweek_sin', \n                lambda x: np.sin(2*np.pi*x.dt.dayofweek/6)),\n            ('dayofweek_cos', \n                lambda x: np.cos(2*np.pi*x.dt.dayofweek/6)),\n            ('month_sin', \n                lambda x: np.sin(2*np.pi*x.dt.month/12)),\n            ('month_cos', \n                lambda x: np.cos(2*np.pi*x.dt.month/12)),\n            ('year', \n                lambda x: (x.dt.year - x.dt.year.min()\n                          ) / (x.dt.year.max() - x.dt.year.min()))\n        ]\n        if hours_secs:\n            self.time_transformations = [\n                ('hour_sin', \n                lambda x: np.sin(2*np.pi*x.dt.hour/23)),\n                ('hour_cos', \n                lambda x: np.cos(2*np.pi*x.dt.hour/23)),\n                ('minute_sin', \n                lambda x: np.sin(2*np.pi*x.dt.minute/59)),\n                ('minute_cos', \n                lambda x: np.cos(2*np.pi*x.dt.minute/59))\n            ] + self.time_transformations\n\n    def fit(self, X, y=None, **fit_params):\n        self.columns = self.transform(X.iloc[0:1,:]).columns\n        return self\n\n    def transform(self, X, y=None, **fit_params):\n        transformed = list()\n        for col in X.columns:\n            time_column = pd.to_datetime(X[col],\n                              format=self.format)\n            for label, func in self.time_transformations:\n                transformed.append(func(time_column))\n                transformed[-1].name += '_' + label\n        transformed = pd.concat(transformed, axis=1)\n        return transformed\n\n    def fit_transform(self, X, y=None, **fit_params):\n        self.fit(X, y, **fit_params)\n        return self.transform(X)","metadata":{"execution":{"iopub.status.busy":"2022-01-02T18:50:38.969429Z","iopub.execute_input":"2022-01-02T18:50:38.970065Z","iopub.status.idle":"2022-01-02T18:50:38.986086Z","shell.execute_reply.started":"2022-01-02T18:50:38.970011Z","shell.execute_reply":"2022-01-02T18:50:38.985223Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dates_df = pd.date_range(start=train_df[DATE].min(), end=test_df[DATE].max()).to_frame()\ndates_df.columns = [DATE]\n\ndate_processor_df = DateProcessor(date_format='%Y-%m-%d')\\\n                                .fit_transform(dates_df, axis=1)\\\n                                .reset_index().rename(columns={'index': DATE})","metadata":{"execution":{"iopub.status.busy":"2022-01-02T18:52:12.141535Z","iopub.execute_input":"2022-01-02T18:52:12.141893Z","iopub.status.idle":"2022-01-02T18:52:12.16863Z","shell.execute_reply.started":"2022-01-02T18:52:12.141857Z","shell.execute_reply":"2022-01-02T18:52:12.168022Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = train_df.merge(date_processor_df, how='left', on=DATE)\ntest_df = test_df.merge(date_processor_df, how='left', on=DATE)","metadata":{"execution":{"iopub.status.busy":"2022-01-02T18:53:49.457557Z","iopub.execute_input":"2022-01-02T18:53:49.458215Z","iopub.status.idle":"2022-01-02T18:53:49.477543Z","shell.execute_reply.started":"2022-01-02T18:53:49.458164Z","shell.execute_reply":"2022-01-02T18:53:49.476807Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### <span style=\"color:#20BEFF;\">Basic Time Series feature engineering</span>","metadata":{}},{"cell_type":"code","source":"min_date = min(train_df[DATE])\ntrain_df['time_series'] = (train_df[DATE] - min_date).astype('timedelta64[D]').astype(int)\ntest_df['time_series'] = (test_df[DATE] - min_date).astype('timedelta64[D]').astype(int)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_basic_ts_features(df):\n    df[YEAR] = 'Y' + df[DATE].dt.year.astype(str)\n    df[QUARTER] = 'Q' + df[DATE].dt.quarter.astype(str)\n    df[MONTH] = df[DATE].dt.month\n    df[MONTH_NAME] = df[DATE].dt.month_name()\n    df[WEEK]= df[DATE].dt.week\n    \n    df[DAY] = df[DATE].dt.day\n    df[DAY_NAME] = df[DATE].dt.day_name()\n    df[DAYOFWEEK] = df[DATE].dt.dayofweek\n    df['is_weekend'] = (df[DAYOFWEEK]>=5).astype(int)\n    \n    df[DAYOFMONTH] = df[DATE].dt.days_in_month\n\n    df[DAYOFYEAR] = df[DATE].dt.dayofyear\n    df.loc[(df[DATE].dt.is_leap_year) & (df[DAYOFYEAR] >= 60), DAYOFYEAR] -= 1\n    \n    return df  ","metadata":{"execution":{"iopub.status.busy":"2022-01-02T18:57:38.921929Z","iopub.execute_input":"2022-01-02T18:57:38.922917Z","iopub.status.idle":"2022-01-02T18:57:38.928174Z","shell.execute_reply.started":"2022-01-02T18:57:38.922865Z","shell.execute_reply":"2022-01-02T18:57:38.927619Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = get_basic_ts_features(train_df)\ntest_df = get_basic_ts_features(test_df)","metadata":{"execution":{"iopub.status.busy":"2022-01-02T18:58:16.810589Z","iopub.execute_input":"2022-01-02T18:58:16.810962Z","iopub.status.idle":"2022-01-02T18:58:16.828026Z","shell.execute_reply.started":"2022-01-02T18:58:16.810929Z","shell.execute_reply":"2022-01-02T18:58:16.827209Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### <span style=\"color:#20BEFF;\">GDP</span>","metadata":{}},{"cell_type":"code","source":"gdp_df = pd.read_csv('../input/gdp-20152019-finland-norway-and-sweden/GDP_data_2015_to_2019_Finland_Norway_Sweden.csv')\ngdp_df.columns = ['year', 'Finland', 'Norway', 'Sweden']\n\ngdp_df = pd.melt(gdp_df, id_vars=['year'], value_vars=['Finland', 'Norway', 'Sweden'], var_name='country', value_name='gdp')\ngdp_df['year'] = 'Y' + gdp_df['year'].astype(str)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = train_df.merge(gdp_df, how='left', on=['year', 'country'])\ntest_df = test_df.merge(gdp_df, how='left', on=['year', 'country'])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### <span style=\"color:#20BEFF;\">Reduce memory usage</span>","metadata":{"execution":{"iopub.status.busy":"2022-01-01T11:53:05.720108Z","iopub.execute_input":"2022-01-01T11:53:05.720418Z","iopub.status.idle":"2022-01-01T11:53:05.724513Z","shell.execute_reply.started":"2022-01-01T11:53:05.720384Z","shell.execute_reply":"2022-01-01T11:53:05.723612Z"}}},{"cell_type":"code","source":"def reduce_mem_usage(df, verbose=True):\n    numerics = ['int8','int16', 'int32', 'int64', 'float16', 'float32', 'float64']\n    start_mem = df.memory_usage().sum() / 1024**2\n\n    for col in df.columns:\n        col_type = df[col].dtypes\n\n        if col_type in numerics:\n            c_min = df[col].min()\n            c_max = df[col].max()\n\n            if str(col_type)[:3] == 'int':\n                if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:\n                    df[col] = df[col].astype(np.int8)\n                elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:\n                    df[col] = df[col].astype(np.int16)\n                elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:\n                    df[col] = df[col].astype(np.int32)\n                elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max:\n                    df[col] = df[col].astype(np.int64)  \n            else:\n                if c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max:\n                    df[col] = df[col].astype(np.float32)\n                else:\n                    df[col] = df[col].astype(np.float64)\n\n    end_mem = df.memory_usage().sum() / 1024**2\n\n    if verbose:\n        print('Mem. usage decreased to {:5.2f} Mb ({:.1f}% reduction)'.format(end_mem, 100 * (start_mem - end_mem) / start_mem))\n \n    return df","metadata":{"execution":{"iopub.status.busy":"2022-01-02T18:58:22.870821Z","iopub.execute_input":"2022-01-02T18:58:22.871626Z","iopub.status.idle":"2022-01-02T18:58:22.882198Z","shell.execute_reply.started":"2022-01-02T18:58:22.871582Z","shell.execute_reply":"2022-01-02T18:58:22.881265Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = reduce_mem_usage(train_df)\ntest_df = reduce_mem_usage(test_df)","metadata":{"execution":{"iopub.status.busy":"2022-01-02T18:58:23.325023Z","iopub.execute_input":"2022-01-02T18:58:23.325322Z","iopub.status.idle":"2022-01-02T18:58:23.356274Z","shell.execute_reply.started":"2022-01-02T18:58:23.325288Z","shell.execute_reply":"2022-01-02T18:58:23.355375Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"IGNORE_COLS = [ID, DATE, 'year', 'month', 'dayofweek']\nFEATURES = [col for col in train_df.columns if col not in IGNORE_COLS+[TARGET]]\n\nNUM_FEATURES = ['date_day_sin', 'date_day_cos', 'date_dayofweek_sin', 'date_dayofweek_cos',\n                'date_month_sin', 'date_month_cos', 'date_year', 'time_series',\n                'week', 'day', 'dayofyear', 'dayofmonth', 'days_till_next_holiday', 'gdp']\nCAT_FEATURES = [feature for feature in FEATURES if feature not in NUM_FEATURES]","metadata":{"execution":{"iopub.status.busy":"2022-01-02T18:58:26.420892Z","iopub.execute_input":"2022-01-02T18:58:26.421203Z","iopub.status.idle":"2022-01-02T18:58:26.426896Z","shell.execute_reply.started":"2022-01-02T18:58:26.421173Z","shell.execute_reply":"2022-01-02T18:58:26.426059Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<a id=\"baseline-model\"></a>\n<div class=\"list-group\" id=\"list-tab\" role=\"tablist\">\n<h1 id=\"baseline-model\" class=\"list-group-item list-group-item-action active\" data-toggle=\"list\" style='background:#20BEFF; border:0; color:white' role=\"tab\" aria-controls=\"home\"><center>Baseline Model</center></h1>\n    \n<a href=\"#toc\" class=\"btn btn-primary btn-sm\" role=\"button\" aria-pressed=\"true\" style=\"color:white\" data-toggle=\"popover\" title=\"Go to TableOfContents\">Go to TOC</a>","metadata":{}},{"cell_type":"markdown","source":"<div class=\"alert alert-block alert-danger\">  \nThis is baseline (dummy) prediction with constant predicted value set to '387'.\n</div>","metadata":{}},{"cell_type":"code","source":"num_sold_mean = int(train_df[TARGET].mean())","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"baseline_pred = []\n\nfor id in test_ids:\n    baseline_pred.append((id, num_sold_mean))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<a id=\"train-models\"></a>\n<div class=\"list-group\" id=\"list-tab\" role=\"tablist\">\n<h1 id=\"train-models\" class=\"list-group-item list-group-item-action active\" data-toggle=\"list\" style='background:#20BEFF; border:0; color:white' role=\"tab\" aria-controls=\"home\"><center>Train Models</center></h1>\n    \n<a href=\"#toc\" class=\"btn btn-primary btn-sm\" role=\"button\" aria-pressed=\"true\" style=\"color:white\" data-toggle=\"popover\" title=\"Go to TableOfContents\">Go to TOC</a>","metadata":{"execution":{"iopub.status.busy":"2021-12-31T09:01:46.700952Z","iopub.execute_input":"2021-12-31T09:01:46.701285Z","iopub.status.idle":"2021-12-31T09:01:46.707806Z","shell.execute_reply.started":"2021-12-31T09:01:46.701243Z","shell.execute_reply":"2021-12-31T09:01:46.707132Z"}}},{"cell_type":"markdown","source":"<a id=\"pycaret\"></a>\n## **<span style=\"color:#58355E;\">PyCaret</span>**\n<a href=\"#toc\" class=\"btn btn-primary btn-sm\" role=\"button\" aria-pressed=\"true\" style=\"color:white\" data-toggle=\"popover\" title=\"Go to TableOfContents\">Go to TOC</a>","metadata":{}},{"cell_type":"code","source":"setup(data = train_df,\n      target=TARGET,\n      transform_target=True,\n      transform_target_method='box-cox',  # https://www.statisticshowto.com/box-cox-transformation/\n      silent=True,\n      ignore_features=IGNORE_COLS,\n      categorical_features=CAT_FEATURES,\n      numeric_features=NUM_FEATURES,\n      feature_interaction = True,\n      normalize=True,\n      normalize_method='robust',\n      session_id = RANDOM_STATE,  # It is equivalent to 'random_state' in scikit-learn.\n      data_split_shuffle = False,  # When set to False, prevents shuffling of rows during 'train_test_split'.\n      fold=10);","metadata":{"execution":{"iopub.status.busy":"2022-01-02T19:21:02.641469Z","iopub.execute_input":"2022-01-02T19:21:02.641869Z","iopub.status.idle":"2022-01-02T19:21:03.796757Z","shell.execute_reply.started":"2022-01-02T19:21:02.641832Z","shell.execute_reply":"2022-01-02T19:21:03.795802Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"add_metric('smape', 'SMAPE', smape, greater_is_better=False)","metadata":{"execution":{"iopub.status.busy":"2022-01-02T19:21:08.330249Z","iopub.execute_input":"2022-01-02T19:21:08.330574Z","iopub.status.idle":"2022-01-02T19:21:08.340324Z","shell.execute_reply.started":"2022-01-02T19:21:08.330535Z","shell.execute_reply":"2022-01-02T19:21:08.339341Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"N = 3\ntop = compare_models(sort = 'smape', n_select = N)","metadata":{"execution":{"iopub.status.busy":"2022-01-02T19:21:13.253727Z","iopub.execute_input":"2022-01-02T19:21:13.253992Z","iopub.status.idle":"2022-01-02T19:22:06.68345Z","shell.execute_reply.started":"2022-01-02T19:21:13.253964Z","shell.execute_reply":"2022-01-02T19:22:06.68268Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_selected = 0\nmodel = top[model_selected]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tuned_model = tune_model(model, optimize='smape', n_iter=100)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"The following function [finalize_model](https://pycaret.org/finalize-model/) takes trained model object and returns a model that has been trained on the entire dataset. \n> once the predictions are generated on hold-out set using predict_model and you have chosen to deploy the specific model,\n> you want to train your model for one final time on the entire dataset including hold-out","metadata":{}},{"cell_type":"code","source":"final_model = finalize_model(tuned_model)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"gc.collect()\npred_final_model = predict_model(final_model, test_df)\npycaret_pred = list(zip(test_ids, pred_final_model['Label']))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<a id=\"pycaret-blend\"></a>\n## **<span style=\"color:#58355E;\">PyCaret blend top models</span>**\n<a href=\"#toc\" class=\"btn btn-primary btn-sm\" role=\"button\" aria-pressed=\"true\" style=\"color:white\" data-toggle=\"popover\" title=\"Go to TableOfContents\">Go to TOC</a>","metadata":{}},{"cell_type":"code","source":"tuned_top = [tuned_model, top[1], top[2]]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"blend_model = blend_models(tuned_top, optimize='smape')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"final_blend = finalize_model(blend_model)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"gc.collect()\npred_final_blend = predict_model(final_blend, test_df)\npycaret_pred_blend = list(zip(test_ids, pred_final_blend['Label']))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<a id=\"blend-of-blend\"></a>\n<div class=\"list-group\" id=\"list-tab\" role=\"tablist\">\n<h1 id=\"submission\" class=\"list-group-item list-group-item-action active\" data-toggle=\"list\" style='background:#20BEFF; border:0; color:white' role=\"tab\" aria-controls=\"home\"><center>Blend of blend</center></h1>\n    \n<a href=\"#toc\" class=\"btn btn-primary btn-sm\" role=\"button\" aria-pressed=\"true\" style=\"color:white\" data-toggle=\"popover\" title=\"Go to TableOfContents\">Go to TOC</a>","metadata":{"execution":{"iopub.status.busy":"2022-01-02T08:03:30.068659Z","iopub.execute_input":"2022-01-02T08:03:30.069032Z","iopub.status.idle":"2022-01-02T08:03:30.07723Z","shell.execute_reply.started":"2022-01-02T08:03:30.068994Z","shell.execute_reply":"2022-01-02T08:03:30.075951Z"}}},{"cell_type":"code","source":"# Import any number of public notebooks to automatically update the ensemble prediction\n\npreds = [pred_final_blend['Label']]\nfor dirname, _, filenames in os.walk('../input'):\n    for filename in filenames:\n        if (dirname != DIRECTORY_PATH) & ('.csv' in filename):\n            df = pd.read_csv(os.path.join(dirname, filename))\n            if len(df) == len(submission_df):\n                try:\n                    preds.append(df[TARGET])\n                except Exception:\n                    pass","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pred_blend_of_blend = list(zip(test_ids, np.array(preds).mean(axis=0).transpose()))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<a id=\"submission\"></a>\n<div class=\"list-group\" id=\"list-tab\" role=\"tablist\">\n<h1 id=\"submission\" class=\"list-group-item list-group-item-action active\" data-toggle=\"list\" style='background:#20BEFF; border:0; color:white' role=\"tab\" aria-controls=\"home\"><center>Submission</center></h1>\n    \n<a href=\"#toc\" class=\"btn btn-primary btn-sm\" role=\"button\" aria-pressed=\"true\" style=\"color:white\" data-toggle=\"popover\" title=\"Go to TableOfContents\">Go to TOC</a>","metadata":{}},{"cell_type":"code","source":"# final_pred = baseline_pred\n# final_pred = pycaret_pred\n# final_pred = pycaret_pred_blend\nfinal_pred = pred_blend_of_blend\nsubmission_df = pd.DataFrame(final_pred, columns=[ID, TARGET])\nsubmission_df[TARGET] = np.round(submission_df[TARGET]).astype(int)\nsubmission_df.to_csv(\"submission.csv\", index=False)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pd.DataFrame(pycaret_pred, columns=[ID, TARGET]).to_csv(\"submission-tunedCatboost.csv\", index=False)\npd.DataFrame(pycaret_pred_blend, columns=[ID, TARGET]).to_csv(\"submission-tunedTop3.csv\", index=False)\npd.DataFrame(pred_blend_of_blend, columns=[ID, TARGET]).to_csv(\"submission-BOBwithCatboostAndTop3.csv\", index=False)\npd.DataFrame(baseline_pred, columns=[ID, TARGET]).to_csv(\"submission-baseline.csv\", index=False)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"***","metadata":{}},{"cell_type":"markdown","source":"<div class=\"alert alert-block alert-success\">  \nYupi! We are done with EDA, baseline model, training & submission 💪 <br>Hope you like this notebook 😊\n</div>","metadata":{}},{"cell_type":"markdown","source":"<div style=\"color:white;\n           display:fill;\n           border-radius:5px;\n           background-color:#58355E;\n           font-size:110%;\n           font-family:Verdana;\n           letter-spacing:0.5px\">\n    <p style=\"padding: 10px; color:white;\">\nIf you find this notebook useful or you just like it, please upvote ▲.<br>\n        Use this link <a href=https://www.kaggle.com/fergusfindley/tpsjan22-eda-baseline-train-submission>TPSJan22:EDA,baseline,train&submission</a> to cite.\n        Questions/feedback? → <a href=https://www.kaggle.com/fergusfindley/tpsjan22-eda-baseline-train-submission/comments>comment</a>.\n    </p>\n</div>","metadata":{}},{"cell_type":"markdown","source":"***\n***","metadata":{}}]}