{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.12.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[],"dockerImageVersionId":28755,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session\n\n# Use the kagglehub client library to attach Kaggle resources like competitions, datasets, and models to your session\n# Learn more about kagglehub: https://github.com/Kaggle/kagglehub/blob/main/README.md\n\nimport kagglehub\n# kagglehub.dataset_download('<owner>/<dataset-slug>')","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:50.357246Z","iopub.execute_input":"2026-07-24T08:14:50.357536Z","iopub.status.idle":"2026-07-24T08:14:50.366907Z","shell.execute_reply.started":"2026-07-24T08:14:50.357511Z","shell.execute_reply":"2026-07-24T08:14:50.366205Z"}},"outputs":[{"name":"stdout","text":"/kaggle/input/competitions/Store-Sales-Forecasting/oil.csv\n/kaggle/input/competitions/Store-Sales-Forecasting/sample_submission.csv\n/kaggle/input/competitions/Store-Sales-Forecasting/holidays_events.csv\n/kaggle/input/competitions/Store-Sales-Forecasting/stores.csv\n/kaggle/input/competitions/Store-Sales-Forecasting/train.csv\n/kaggle/input/competitions/Store-Sales-Forecasting/test.csv\n/kaggle/input/competitions/Store-Sales-Forecasting/transactions.csv\n","output_type":"stream"}],"execution_count":107},{"cell_type":"code","source":"path = '/kaggle/input/store-sales-time-series-forecasting/'\ntrain = pd.read_csv('/kaggle/input/competitions/Store-Sales-Forecasting/train.csv')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:50.379759Z","iopub.execute_input":"2026-07-24T08:14:50.380082Z","iopub.status.idle":"2026-07-24T08:14:51.429194Z","shell.execute_reply.started":"2026-07-24T08:14:50.380058Z","shell.execute_reply":"2026-07-24T08:14:51.428465Z"}},"outputs":[],"execution_count":108},{"cell_type":"code","source":"train['date'] = pd.to_datetime(train['date'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:51.431022Z","iopub.execute_input":"2026-07-24T08:14:51.431284Z","iopub.status.idle":"2026-07-24T08:14:51.628587Z","shell.execute_reply.started":"2026-07-24T08:14:51.431261Z","shell.execute_reply":"2026-07-24T08:14:51.628006Z"}},"outputs":[],"execution_count":109},{"cell_type":"code","source":"train['dayofweek'] = train['date'].dt.dayofweek","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:51.629329Z","iopub.execute_input":"2026-07-24T08:14:51.629504Z","iopub.status.idle":"2026-07-24T08:14:51.699858Z","shell.execute_reply.started":"2026-07-24T08:14:51.629487Z","shell.execute_reply":"2026-07-24T08:14:51.699243Z"}},"outputs":[],"execution_count":110},{"cell_type":"code","source":"train['day_name'] = train['date'].dt.day_name()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:51.700649Z","iopub.execute_input":"2026-07-24T08:14:51.700849Z","iopub.status.idle":"2026-07-24T08:14:52.159064Z","shell.execute_reply.started":"2026-07-24T08:14:51.70081Z","shell.execute_reply":"2026-07-24T08:14:52.158173Z"}},"outputs":[],"execution_count":111},{"cell_type":"code","source":"train['day_name'] = train['date'].dt.day_name()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:52.160897Z","iopub.execute_input":"2026-07-24T08:14:52.161135Z","iopub.status.idle":"2026-07-24T08:14:52.620136Z","shell.execute_reply.started":"2026-07-24T08:14:52.161114Z","shell.execute_reply":"2026-07-24T08:14:52.619191Z"}},"outputs":[],"execution_count":112},{"cell_type":"code","source":"print(train[['date', 'day_name', 'dayofweek', 'sales']].head())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:52.621034Z","iopub.execute_input":"2026-07-24T08:14:52.621297Z","iopub.status.idle":"2026-07-24T08:14:52.680942Z","shell.execute_reply.started":"2026-07-24T08:14:52.621271Z","shell.execute_reply":"2026-07-24T08:14:52.679736Z"}},"outputs":[{"name":"stdout","text":"        date day_name  dayofweek  sales\n0 2013-01-01  Tuesday          1    0.0\n1 2013-01-01  Tuesday          1    0.0\n2 2013-01-01  Tuesday          1    0.0\n3 2013-01-01  Tuesday          1    0.0\n4 2013-01-01  Tuesday          1    0.0\n","output_type":"stream"}],"execution_count":113},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport seaborn as sns","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:52.682042Z","iopub.execute_input":"2026-07-24T08:14:52.682351Z","iopub.status.idle":"2026-07-24T08:14:52.686449Z","shell.execute_reply.started":"2026-07-24T08:14:52.682321Z","shell.execute_reply":"2026-07-24T08:14:52.685701Z"}},"outputs":[],"execution_count":114},{"cell_type":"code","source":"day_order = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:52.687714Z","iopub.execute_input":"2026-07-24T08:14:52.687991Z","iopub.status.idle":"2026-07-24T08:14:52.704032Z","shell.execute_reply.started":"2026-07-24T08:14:52.687968Z","shell.execute_reply":"2026-07-24T08:14:52.702995Z"}},"outputs":[],"execution_count":115},{"cell_type":"code","source":"plt.figure(figsize=(10, 6))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:52.704895Z","iopub.execute_input":"2026-07-24T08:14:52.705137Z","iopub.status.idle":"2026-07-24T08:14:52.725939Z","shell.execute_reply.started":"2026-07-24T08:14:52.705115Z","shell.execute_reply":"2026-07-24T08:14:52.724754Z"}},"outputs":[{"execution_count":116,"output_type":"execute_result","data":{"text/plain":"<Figure size 1000x600 with 0 Axes>"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<Figure size 1000x600 with 0 Axes>"},"metadata":{}}],"execution_count":116},{"cell_type":"code","source":"sns.barplot(data=train, x='day_name', y='sales', order=day_order, errorbar=None)\nplt.title('Average Sales by Day of Week')\nplt.xlabel('Day of Week')\nplt.ylabel('Average Sales')\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:52.727148Z","iopub.execute_input":"2026-07-24T08:14:52.728028Z","iopub.status.idle":"2026-07-24T08:14:55.499939Z","shell.execute_reply.started":"2026-07-24T08:14:52.727965Z","shell.execute_reply":"2026-07-24T08:14:55.498708Z"}},"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 640x480 with 1 Axes>","image/png":"iVBORw0KGgoAAAANSUhEUgAAAjsAAAHHCAYAAABZbpmkAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAVP5JREFUeJzt3XdUFGf7PvBraUsvohQDYhewiw0bAY3Y4xuMGo1iN4qxvRL1jdHEElusEWNiDBYwlqiJGjsBKzZsWGMjGgXsIqiAcP/+8Md8XQFlFQTH63POnuM888zMPbO77OXMM7saEREQERERqZRBYRdAREREVJAYdoiIiEjVGHaIiIhI1Rh2iIiISNUYdoiIiEjVGHaIiIhI1Rh2iIiISNUYdoiIiEjVGHaIiIhI1Rh2iKjARUVFQaPRICoq6o1t8+uvv4ZGo8GtW7fe2DbfVlu2bEGNGjVgamoKjUaDe/fuFXZJecLnmPKKYYfeWfPnz4dGo0G9evUKu5QiJy0tDXPmzEHNmjVhbW0NW1tbVK5cGf369cPZs2cLu7wi5f3334dGo4FGo4GBgQGsra1RqVIldOvWDdu3by/s8l7q9u3b6NixI8zMzBASEoJly5bBwsIiW79Vq1ZBo9Fg3bp12eZVr14dGo0GkZGR2eaVKlUKDRo0KJDaifLKqLALICos4eHhKF26NA4ePIgLFy6gfPnyhV1SkREQEIDNmzfjk08+Qd++fZGeno6zZ89i48aNaNCgAdzd3Qu7xCLFxcUFkydPBgCkpKTgwoULWLt2LcLCwtCxY0eEhYXB2Ni4kKvM2aFDh/DgwQNMmDABzZo1y7Vfo0aNAAB79uzBf/7zH6U9KSkJJ0+ehJGREfbu3QtfX19l3tWrV3H16lV07ty54HaAKA8YduiddPnyZezbtw9r165F//79ER4ejnHjxr3RGjIzM5GWlgZTU9M3ut2XOXToEDZu3IhJkybhf//7n868efPmvTWXON4kGxsbfPrppzptU6ZMweDBgzF//nyULl0aU6dOLaTqXuzGjRsAAFtb2xf2K1myJMqUKYM9e/botEdHR0NE8PHHH2eblzWdFZSICgsvY9E7KTw8HHZ2dmjdujU6dOiA8PBwZV56ejqKFSuGnj17ZlsuKSkJpqamGDFihNKWmpqKcePGoXz58tBqtXB1dcUXX3yB1NRUnWU1Gg0GDRqE8PBwVK5cGVqtFlu2bAEAfPfdd2jQoAHs7e1hZmYGLy8v/Pbbb9m2/+jRIwwePBjFixeHlZUV2rVrh2vXrkGj0eDrr7/W6Xvt2jX06tULjo6O0Gq1qFy5Mn755ZeXHpuLFy8CABo2bJhtnqGhIezt7ZXpf/75BwMHDkSlSpVgZmYGe3t7fPzxx4iLi3vpdgDgwIEDaNGiBWxsbGBubg4fHx/s3btXp8+DBw8wdOhQlC5dGlqtFg4ODvjggw9w5MiRPG3j1q1b6NixI6ytrWFvb48hQ4bg8ePHynwfHx9Ur149x2UrVaoEf3//PG3neYaGhpg7dy48PT0xb9483L9/X5kXGhoKPz8/ODg4QKvVwtPTEz/88IPO8oGBgShevDjS09Ozrbt58+aoVKnSS2tYvXo1vLy8YGZmhuLFi+PTTz/FtWvXlPnvv/8+AgMDAQB16tSBRqNBjx49cl1fo0aNcPToUTx69Ehp27t3LypXroyWLVti//79yMzM1Jmn0Wh0XkthYWFKTcWKFUPnzp1x9erVbNvKy2sjJ//88w/Kly+PKlWqIDEx8aX96R0hRO8gd3d36d27t4iI7Nq1SwDIwYMHlfm9evUSW1tbSU1N1VluyZIlAkAOHTokIiIZGRnSvHlzMTc3l6FDh8qPP/4ogwYNEiMjI/nwww91lgUgHh4eUqJECfnmm28kJCREjh49KiIiLi4uMnDgQJk3b57MnDlT6tatKwBk48aNOuvo2LGjAJBu3bpJSEiIdOzYUapXry4AZNy4cUq/hIQEcXFxEVdXVxk/frz88MMP0q5dOwEgs2bNeuGx2bdvnwCQvn37Snp6+gv7rl69WqpXry5jx46Vn376Sf73v/+JnZ2duLm5SUpKitIvMjJSAEhkZKTSFhERISYmJuLt7S0zZsyQWbNmSbVq1cTExEQOHDig9OvSpYuYmJjI8OHD5eeff5apU6dK27ZtJSws7IW1jRs3TgBI1apVpW3btjJv3jz59NNPleOXZeHChQJAYmNjdZY/ePCgAJClS5e+cDs+Pj5SuXLlXOdPmDAh23NZp04d6dGjh8yaNUu+//57ad68uQCQefPmKX22b98uAGTDhg0664uPjxdDQ0MZP378C+sKDQ0VAFKnTh2ZNWuWjBo1SszMzKR06dJy9+5dERHZtm2b9OvXTwDI+PHjZdmyZbJv375c1/njjz9mex79/PykX79+cuHCBQEgx48fV+bVqFFDPDw8lOmJEyeKRqORTp06yfz58+Wbb76R4sWL69QkkvfXRtZzfPPmTRERuXDhgpQqVUpq1KihtBGJiDDs0Dvn8OHDAkC2b98uIiKZmZni4uIiQ4YMUfps3bo1xw+aVq1aSdmyZZXpZcuWiYGBgezevVun34IFCwSA7N27V2kDIAYGBnLq1KlsNT18+FBnOi0tTapUqSJ+fn5KW0xMjACQoUOH6vTt0aNHtrDTu3dvcXZ2llu3bun07dy5s9jY2GTb3rMyMzPFx8dHAIijo6N88sknEhISIv/8889L6xYRiY6OzhYSng87mZmZUqFCBfH395fMzEyd9ZUpU0Y++OADpc3GxkaCgoJyrTc3WR+E7dq102kfOHCgzofyvXv3xNTUVEaOHKnTb/DgwWJhYSHJyckv3M7Lws66desEgMyZM0dpy+m4+fv767y2MjIyxMXFRTp16qTTb+bMmaLRaOTSpUu5bjMtLU0cHBykSpUq8ujRI6V948aNAkDGjh2rtGWFoqwA/yKnTp0SADJhwgQREUlPTxcLCwtZsmSJiIg4OjpKSEiIiIgkJSWJoaGh9O3bV0RE4uLixNDQUCZNmqSzztjYWDEyMlLa9XltPBt2zpw5IyVLlpQ6derInTt3Xrov9G7hZSx654SHh8PR0VEZSKnRaNCpUyesWLECGRkZAAA/Pz8UL14cK1euVJa7e/cutm/fjk6dOiltq1evhoeHB9zd3XHr1i3l4efnBwDZ7k7x8fGBp6dntprMzMx0tnP//n00btxY51JN1iWvgQMH6iz7+eef60yLCNasWYO2bdtCRHTq8vf3x/379194CUij0WDr1q2YOHEi7Ozs8OuvvyIoKAhubm7o1KmTzpidZ+tOT0/H7du3Ub58edja2r5wG8eOHcP58+fRpUsX3L59W6kvJSUFTZs2xa5du5TLIba2tjhw4ACuX7+e6/peJCgoSGc663ht2rQJwNPxNh9++CF+/fVXiAgAICMjAytXrkT79u1zvDNJH5aWlgCeXo7L8uxxu3//Pm7dugUfHx9cunRJudxlYGCArl27Yv369TrLhoeHo0GDBihTpkyu2zx8+DBu3LiBgQMH6owJa926Ndzd3fHnn3++0r54eHjA3t5eGYtz/PhxpKSkKHdbNWjQQLnUFB0djYyMDGW8ztq1a5GZmYmOHTvqvCadnJxQoUIF5b2iz2sjy8mTJ+Hj44PSpUtjx44dsLOze6X9IxUr5LBF9EY9efJEnJ2dpXPnznL+/HnlsWrVKgEgW7duVfr2799frKys5PHjxyIi8vPPPwsAOXbsmNLHw8NDAOT6GDx4sNIXgPTq1SvHujZs2CD16tUTrVars7xGo1H69OvXTwwMDLJdWrp//77OmZ3ExMQX1gRA1q5dm+djdv36dfn111+lfv36AkC6du2qzHv48KF89dVX4uLiIhqNRmcbPXv2VPo9f2Zn5cqVL60x63/nK1euFFNTUzEwMJA6derIuHHj5OLFiy+tO+t//c+fAUlLSxMDAwPp37+/0vbnn38KANm5c6eIiGzZskUAyJYtW166nVc5s7Nnzx5p2rSpmJubZ9vvZ8+gZZ1JyTpzcvbsWQEgCxYseGFNv/76qwCQiIiIbPPat28vxYsXV6b1ObMjItK2bVuxsbGRjIwMmTNnjjg4OCjzpk+fLm5ubiIiMnbsWAGgPFcDBgx44fNdrVo1EdHvtZH1HFtaWkq5cuXkwYMHedoHevfwbix6p/z111+Ij4/HihUrsGLFimzzw8PD0bx5cwBA586d8eOPP2Lz5s1o3749Vq1aBXd3d53BrJmZmahatSpmzpyZ4/ZcXV11pp/9H32W3bt3o127dmjSpAnmz58PZ2dnGBsbIzQ0FMuXL9d7H7P+1/vpp58qg0+fV61atTyvz9nZGZ07d0ZAQAAqV66MVatWYfHixTAyMsLnn3+O0NBQDB06FN7e3rCxsYFGo0Hnzp2z/e87pxqnT5+OGjVq5Ngn64xIx44d0bhxY6xbtw7btm3D9OnTMXXqVKxduxYtW7bM835k0Wg02dr8/f3h6OiIsLAwNGnSBGFhYXBycnrhrdh5dfLkSQBQvtrg4sWLaNq0Kdzd3TFz5ky4urrCxMQEmzZtwqxZs3SOm6enJ7y8vBAWFobu3bsjLCwMJiYm6Nix42vX9aoaNWqEDRs2IDY2Fnv37tX5Dp0GDRogODgY165dw549e1CyZEmULVsWwNPnXKPRYPPmzTA0NMy23qznW5/XRpaAgAAsWbIE4eHh6N+/f37sJqkMww69U8LDw+Hg4ICQkJBs89auXYt169ZhwYIFMDMzQ5MmTeDs7IyVK1eiUaNG+Ouvv/Dll1/qLFOuXDkcP34cTZs2zfFDNC/WrFkDU1NTbN26FVqtVmkPDQ3V6efm5obMzExcvnwZFSpUUNovXLig069EiRKwsrJCRkZGvnxYZzE2Nka1atVw/vx55fLDb7/9hsDAQMyYMUPp9/jx45fenl6uXDkAgLW1dZ5qdHZ2xsCBAzFw4EDcuHEDtWrVwqRJk/IUds6fP69zyefChQvIzMxE6dKllTZDQ0N06dIFixcvxtSpU/H777+jb9++OX4o6yMjIwPLly+Hubm5cjlnw4YNSE1Nxfr161GqVCmlb05fyAcA3bt3x/DhwxEfH4/ly5ejdevWL71M4+bmBgA4d+6cckk1y7lz55T5r+LZ79vZu3cvhg4dqszz8vKCVqtFVFQUDhw4gFatWinzypUrBxFBmTJlULFixVzXr+9rA3gajIyMjDBw4EBYWVmhS5cur7BnpGYcs0PvjEePHmHt2rVo06YNOnTokO0xaNAgPHjwAOvXrwfwdMxEhw4dsGHDBixbtgxPnjzRGa8DPD3rcO3aNSxcuDDH7aWkpLy0LkNDQ2g0GmW8EADExcXh999/1+mXdQv0/Pnzddq///77bOsLCAjAmjVrlLMKz7p58+YL6zl//jyuXLmSrf3evXuIjo6GnZ0dSpQooWxL/v84l2freXZfcuLl5YVy5crhu+++Q3Jycq41ZmRk6NyyDQAODg4oWbJktlv7c/N8sM06Xs8HpW7duuHu3bvo378/kpOTs31vjr4yMjIwePBgnDlzBoMHD4a1tTUAKAHq2eN2//79bOE2yyeffAKNRoMhQ4bg0qVLeaqrdu3acHBwwIIFC3SO0+bNm3HmzBm0bt36lferdu3aMDU1RXh4OK5du6ZzZker1aJWrVoICQlBSkqKzvfrfPTRRzA0NMQ333yT7TUjIrh9+zaAvL82nqXRaPDTTz+hQ4cOCAwMVN7DRFl4ZofeGVkDPdu1a5fj/Pr166NEiRIIDw9XQk2nTp3w/fffY9y4cahatSo8PDx0lunWrRtWrVqFzz77DJGRkWjYsCEyMjJw9uxZrFq1Clu3bkXt2rVfWFfr1q0xc+ZMtGjRAl26dMGNGzcQEhKC8uXL48SJE0o/Ly8vBAQEYPbs2bh9+zbq16+PnTt34u+//wage3lmypQpiIyMRL169dC3b194enrizp07OHLkCHbs2IE7d+7kWs/x48fRpUsXtGzZEo0bN0axYsVw7do1LFmyBNevX8fs2bOVD+w2bdpg2bJlsLGxgaenJ6Kjo7Fjxw6d7+LJiYGBAX7++We0bNkSlStXRs+ePfHee+/h2rVriIyMhLW1NTZs2IAHDx7AxcUFHTp0QPXq1WFpaYkdO3bg0KFDOmeTXuTy5cto164dWrRogejoaISFhaFLly7ZvlunZs2aqFKlijLovFatWnlaP/A0rISFhQEAHj58qHyD8sWLF9G5c2dMmDBB6du8eXOYmJigbdu2SrBauHAhHBwcEB8fn23dJUqUQIsWLbB69WrY2trmKagYGxtj6tSp6NmzJ3x8fPDJJ58gMTERc+bMQenSpTFs2LA879vzTExMUKdOHezevRtarRZeXl468xs0aKA8N8+GnXLlymHixIkYPXo04uLi0L59e1hZWeHy5ctYt24d+vXrhxEjRuT5tfE8AwMDhIWFoX379ujYsSM2bdqU7awWvcMKdcQQ0RvUtm1bMTU11fn+l+f16NFDjI2NlVu2MzMzxdXVVQDIxIkTc1wmLS1Npk6dKpUrVxatVit2dnbi5eUl33zzjdy/f1/pByDXW6gXLVokFSpUEK1WK+7u7hIaGqoMvnxWSkqKBAUFSbFixcTS0lLat28v586dEwAyZcoUnb6JiYkSFBQkrq6uYmxsLE5OTtK0aVP56aefXnicEhMTZcqUKeLj4yPOzs5iZGQkdnZ24ufnJ7/99ptO37t370rPnj2lePHiYmlpKf7+/nL27Flxc3OTwMBApV9O37MjInL06FH56KOPxN7eXrRarbi5uUnHjh2VgbWpqakSHBws1atXFysrK7GwsJDq1avL/PnzX7gPIv83ePX06dPSoUMHsbKyEjs7Oxk0aJDO7djPmjZtmgCQb7/99qXrz5J1m37Ww9LSUipUqCCffvqpbNu2Lcdl1q9fL9WqVRNTU1MpXbq0TJ06VX755RcBIJcvX87WP2sAfb9+/fJcl8jTwb41a9YUrVYrxYoVk65du8q///6r00ffAcoiIqNHjxYA0qBBg2zz1q5dKwDEyspKnjx5km3+mjVrpFGjRmJhYSEWFhbi7u4uQUFBcu7cOZ1+L3ttiGT/nh2Rp4PmfXx8xNLSUvbv35/nfSJ104g8dz6RiN4qx44dQ82aNREWFoauXbsWdjlvtTlz5mDYsGGIi4vTGU9T2P744w+0b98eu3btQuPGjQu7HKK3DsMO0Vvk0aNH2e7o6tGjB5YtW4a4uLhsd39R3okIqlevDnt7+1wHCxeWNm3a4MyZM7hw4cIrD4QnepdxzA7RW2TatGmIiYmBr68vjIyMsHnzZmzevBn9+vVj0HlFKSkpWL9+PSIjIxEbG4s//vijsEtSrFixAidOnMCff/6JOXPmMOgQvSKe2SF6i2zfvh3ffPMNTp8+jeTkZJQqVQrdunXDl19+CSMj/t/lVcTFxaFMmTKwtbXFwIEDMWnSpMIuSaHRaGBpaYlOnTphwYIFfI6JXhHDDhEREakav2eHiIiIVI1hh4iIiFSNF4Dx9LdYrl+/DisrKw4AJCIiekuICB48eICSJUvCwCD38zcMOwCuX7/OO1mIiIjeUlevXoWLi0uu8xl2AFhZWQF4erCyfr+GiIiIirakpCS4uroqn+O5YdjB//2mkLW1NcMOERHRW+ZlQ1A4QJmIiIhUjWGHiIiIVI1hh4iIiFSNYYeIiIhUjWGHiIiIVI1hh4iIiFSNYYeIiIhUjWGHiIiIVI1hh4iIiFSNYYeIiIhUjWGHiIiIVI1hh4iIiFSNYYeIiIhUjWGHiIiIVI1hh4iIiFTNqLALICIiolfnFby0sEsocDHTu7/W8jyzQ0RERKrGsENERESqxrBDREREqsawQ0RERKrGsENERESqxrBDREREqsawQ0RERKrGsENERESqxrBDREREqsawQ0RERKrGsENERESqxrBDREREqsawQ0RERKrGsENERESqxrBDREREqsawQ0RERKrGsENERESqxrBDREREqsawQ0RERKrGsENERESqxrBDREREqmZU2AUQERG9jFfw0sIuocDFTO9e2CWoFs/sEBERkaox7BAREZGqMewQERGRqjHsEBERkaox7BAREZGqMewQERGRqjHsEBERkaox7BAREZGqMewQERGRqjHsEBERkaox7BAREZGqMewQERGRqjHsEBERkaox7BAREZGqMewQERGRqjHsEBERkaox7BAREZGqMewQERGRqjHsEBERkaox7BAREZGqFZmwM2XKFGg0GgwdOlRpe/z4MYKCgmBvbw9LS0sEBAQgMTFRZ7krV66gdevWMDc3h4ODA4KDg/HkyZM3XD0REREVVUUi7Bw6dAg//vgjqlWrptM+bNgwbNiwAatXr8bOnTtx/fp1fPTR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IkHvMzvx8fF48uRJtvYnT54o36BcsmRJPHjw4PWrIyIiInpNeocdX19f9O/fH0ePHlXajh49igEDBsDPzw8AEBsbizJlyuRflURERESvSO+ws2jRIhQrVgxeXl7QarXQarWoXbs2ihUrhkWLFgEALC0tMWPGjHwvloiIiEhfeo/ZcXJywvbt23H27Fn8/fffAIBKlSqhUqVKSh9fX9/8q5CIiIjoNbzylwq6u7vD3d09P2shIiIiynevFHb+/fdfrF+/HleuXEFaWprOvJkzZ+ZLYURERET5Qe+wExERgXbt2qFs2bI4e/YsqlSpgri4OIgIatWqVRA1EhEREb0yvQcojx49GiNGjEBsbCxMTU2xZs0aXL16FT4+Pvj4448LokYiIiKiV6Z32Dlz5gy6d+8OADAyMsKjR49gaWmJ8ePHY+rUqfleIBEREdHr0DvsWFhYKON0nJ2dcfHiRWXerVu38q8yIiIionyg95id+vXrY8+ePfDw8ECrVq3w3//+F7GxsVi7di3q169fEDUSERERvTK9w87MmTORnJwMAPjmm2+QnJyMlStXokKFCrwTi4iIiIocvcJORkYG/v33X1SrVg3A00taCxYsKJDCiIiIiPKDXmN2DA0N0bx5c9y9e7eg6iEiIiLKV3oPUK5SpQouXbpUELUQERER5Tu9w87EiRMxYsQIbNy4EfHx8UhKStJ5EBERERUleg9QbtWqFQCgXbt20Gg0SruIQKPRICMjI/+qIyIiInpNeoedyMjIgqiDiIiIqEDoHXZ8fHwKog4iIiKiAqH3mB0A2L17Nz799FM0aNAA165dAwAsW7YMe/bsydfiiIiIiF6X3mFnzZo18Pf3h5mZGY4cOYLU1FQAwP379/Htt9/me4FEREREr+OV7sZasGABFi5cCGNjY6W9YcOGOHLkSL4WR0RERPS69A47586dQ5MmTbK129jY4N69e3qta/LkyahTpw6srKzg4OCA9u3b49y5czp9Hj9+jKCgINjb28PS0hIBAQFITEzU6XPlyhW0bt0a5ubmcHBwQHBwMJ48eaLvrhEREZEK6R12nJyccOHChWzte/bsQdmyZfVa186dOxEUFIT9+/dj+/btSE9PR/PmzZGSkqL0GTZsGDZs2IDVq1dj586duH79Oj766CNlfkZGBlq3bo20tDTs27cPS5YsweLFizF27Fh9d42IiIhUSO+7sfr27YshQ4bgl19+gUajwfXr1xEdHY0RI0bgq6++0mtdW7Zs0ZlevHgxHBwcEBMTgyZNmuD+/ftYtGgRli9fDj8/PwBAaGgoPDw8sH//ftSvXx/btm3D6dOnsWPHDjg6OqJGjRqYMGECRo4cia+//homJib67iIRERGpiN5ndkaNGoUuXbqgadOmSE5ORpMmTdCnTx/0798fn3/++WsVc//+fQBAsWLFAAAxMTFIT09Hs2bNlD7u7u4oVaoUoqOjAQDR0dGoWrUqHB0dlT7+/v5ISkrCqVOnXqseIiIievvpfWZHo9Hgyy+/RHBwMC5cuIDk5GR4enrC0tLytQrJzMzE0KFD0bBhQ1SpUgUAkJCQABMTE9ja2ur0dXR0REJCgtLn2aCTNT9rXk5SU1OVu8gA8GcuiIiIVEzvMzthYWF4+PAhTExM4Onpibp167520AGAoKAgnDx5EitWrHjtdb3M5MmTYWNjozxcXV0LfJtERERUOPQOO8OGDYODgwO6dOmCTZs25ctvYQ0aNAgbN25EZGQkXFxclHYnJyekpaVlu8srMTERTk5OSp/n787Kms7q87zRo0fj/v37yuPq1auvvQ9ERERUNOkdduLj47FixQpoNBp07NgRzs7OCAoKwr59+/TeuIhg0KBBWLduHf766y+UKVNGZ76XlxeMjY0RERGhtJ07dw5XrlyBt7c3AMDb2xuxsbG4ceOG0mf79u2wtraGp6dnjtvVarWwtrbWeRAREZE66T1mx8jICG3atEGbNm3w8OFDrFu3DsuXL4evry9cXFxw8eLFPK8rKCgIy5cvxx9//AErKytljI2NjQ3MzMxgY2OD3r17Y/jw4ShWrBisra3x+eefw9vbG/Xr1wcANG/eHJ6enujWrRumTZuGhIQEjBkzBkFBQdBqtfruHhEREamM3mHnWebm5vD398fdu3fxzz//4MyZM3ot/8MPPwAA3n//fZ320NBQ9OjRAwAwa9YsGBgYICAgAKmpqfD398f8+fOVvoaGhti4cSMGDBgAb29vWFhYIDAwEOPHj3+dXSMiIiKVeKWwk3VGJzw8HBEREXB1dcUnn3yC3377Ta/1iMhL+5iamiIkJAQhISG59nFzc8OmTZv02jYRERG9G/QOO507d8bGjRthbm6Ojh074quvvlLGzxAREREVNXqHHUNDQ6xatQr+/v4wNDTUmXfy5EnlO3KIiIiIigK9w054eLjO9IMHD/Drr7/i559/RkxMTL7cik5ERESUX/S+9TzLrl27EBgYCGdnZ3z33Xfw8/PD/v3787M2IiIiotem15mdhIQELF68GIsWLUJSUhI6duyI1NRU/P7777l+pw0RERFRYcrzmZ22bduiUqVKOHHiBGbPno3r16/j+++/L8jaiIiIiF5bns/sbN68GYMHD8aAAQNQoUKFgqyJiIiIKN/k+czOnj178ODBA3h5eaFevXqYN28ebt26VZC1EREREb22PIed+vXrY+HChYiPj0f//v2xYsUKlCxZEpmZmdi+fTsePHhQkHUSERERvRK978aysLBAr169sGfPHsTGxuK///0vpkyZAgcHB7Rr164gaiQiIiJ6Za986zkAVKpUCdOmTcO///6LX3/9Nb9qIiIiIso3rxV2shgaGqJ9+/ZYv359fqyOiIiIKN/kS9ghIiIiKqoYdoiIiEjVGHaIiIhI1Rh2iIiISNUYdoiIiEjVGHaIiIhI1Rh2iIiISNUYdoiIiEjVGHaIiIhI1Rh2iIiISNUYdoiIiEjVGHaIiIhI1Rh2iIiISNUYdoiIiEjVGHaIiIhI1Rh2iIiISNUYdoiIiEjVGHaIiIhI1Rh2iIiISNUYdoiIiEjVGHaIiIhI1Rh2iIiISNUYdoiIiEjVGHaIiIhI1Rh2iIiISNUYdoiIiEjVGHaIiIhI1Rh2iIiISNUYdoiIiEjVGHaIiIhI1Rh2iIiISNUYdoiIiEjVGHaIiIhI1Rh2iIiISNUYdoiIiEjVGHaIiIhI1Rh2iIiISNUYdoiIiEjVGHaIiIhI1Rh2iIiISNUYdoiIiEjVGHaIiIhI1Rh2iIiISNUYdoiIiEjVGHaIiIhI1Rh2iIiISNUYdoiIiEjVGHaIiIhI1Rh2iIiISNUYdoiIiEjVGHaIiIhI1Rh2iIiISNUYdoiIiEjVCjXs7Nq1C23btkXJkiWh0Wjw+++/68wXEYwdOxbOzs4wMzNDs2bNcP78eZ0+d+7cQdeuXWFtbQ1bW1v07t0bycnJb3AviIiIqCgr1LCTkpKC6tWrIyQkJMf506ZNw9y5c7FgwQIcOHAAFhYW8Pf3x+PHj5U+Xbt2xalTp7B9+3Zs3LgRu3btQr9+/d7ULhAREVERZ1SYG2/ZsiVatmyZ4zwRwezZszFmzBh8+OGHAIClS5fC0dERv//+Ozp37owzZ85gy5YtOHToEGrXrg0A+P7779GqVSt89913KFmy5BvbFyIiIiqaiuyYncuXLyMhIQHNmjVT2mxsbFCvXj1ER0cDAKKjo2Fra6sEHQBo1qwZDAwMcODAgTdeMxERERU9hXpm50USEhIAAI6Ojjrtjo6OyryEhAQ4ODjozDcyMkKxYsWUPjlJTU1FamqqMp2UlJRfZRMREVERU2TP7BSkyZMnw8bGRnm4uroWdklERERUQIps2HFycgIAJCYm6rQnJiYq85ycnHDjxg2d+U+ePMGdO3eUPjkZPXo07t+/rzyuXr2az9UTERFRUVFkw06ZMmXg5OSEiIgIpS0pKQkHDhyAt7c3AMDb2xv37t1DTEyM0uevv/5CZmYm6tWrl+u6tVotrK2tdR5ERESkToU6Zic5ORkXLlxQpi9fvoxjx46hWLFiKFWqFIYOHYqJEyeiQoUKKFOmDL766iuULFkS7du3BwB4eHigRYsW6Nu3LxYsWID09HQMGjQInTt35p1YREREBKCQw87hw4fh6+urTA8fPhwAEBgYiMWLF+OLL75ASkoK+vXrh3v37qFRo0bYsmULTE1NlWXCw8MxaNAgNG3aFAYGBggICMDcuXPf+L4QERFR0VSoYef999+HiOQ6X6PRYPz48Rg/fnyufYoVK4bly5cXRHlERESkAkV2zA4RERFRfmDYISIiIlVj2CEiIiJVY9ghIiIiVWPYISIiIlVj2CEiIiJVY9ghIiIiVWPYISIiIlVj2CEiIiJVY9ghIiIiVWPYISIiIlVj2CEiIiJVY9ghIiIiVWPYISIiIlVj2CEiIiJVY9ghIiIiVWPYISIiIlVj2CEiIiJVY9ghIiIiVWPYISIiIlVj2CEiIiJVY9ghIiIiVWPYISIiIlVj2CEiIiJVY9ghIiIiVWPYISIiIlVj2CEiIiJVY9ghIiIiVWPYISIiIlVj2CEiIiJVY9ghIiIiVWPYISIiIlVj2CEiIiJVY9ghIiIiVWPYISIiIlVj2CEiIiJVY9ghIiIiVWPYISIiIlVj2CEiIiJVY9ghIiIiVWPYISIiIlVj2CEiIiJVY9ghIiIiVWPYISIiIlVj2CEiIiJVY9ghIiIiVWPYISIiIlVj2CEiIiJVY9ghIiIiVWPYISIiIlVj2CEiIiJVY9ghIiIiVWPYISIiIlVj2CEiIiJVY9ghIiIiVWPYISIiIlVj2CEiIiJVY9ghIiIiVWPYISIiIlVj2CEiIiJVY9ghIiIiVWPYISIiIlVj2CEiIiJVY9ghIiIiVWPYISIiIlVTTdgJCQlB6dKlYWpqinr16uHgwYOFXRIREREVAaoIOytXrsTw4cMxbtw4HDlyBNWrV4e/vz9u3LhR2KURERFRIVNF2Jk5cyb69u2Lnj17wtPTEwsWLIC5uTl++eWXwi6NiIiICtlbH3bS0tIQExODZs2aKW0GBgZo1qwZoqOjC7EyIiIiKgqMCruA13Xr1i1kZGTA0dFRp93R0RFnz57NcZnU1FSkpqYq0/fv3wcAJCUl5dg/I/VRPlVbNOW233nBY5MztR8XgMfmRXhscsdjkzsem9zldmyy2kXkxSuQt9y1a9cEgOzbt0+nPTg4WOrWrZvjMuPGjRMAfPDBBx988MGHCh5Xr159YVZ468/sFC9eHIaGhkhMTNRpT0xMhJOTU47LjB49GsOHD1emMzMzcefOHdjb20Oj0RRovS+TlJQEV1dXXL16FdbW1oVaS1HDY5M7Hpvc8djkjscmZzwuuStqx0ZE8ODBA5QsWfKF/d76sGNiYgIvLy9ERESgffv2AJ6Gl4iICAwaNCjHZbRaLbRarU6bra1tAVeqH2tr6yLxQiqKeGxyx2OTOx6b3PHY5IzHJXdF6djY2Ni8tM9bH3YAYPjw4QgMDETt2rVRt25dzJ49GykpKejZs2dhl0ZERESFTBVhp1OnTrh58ybGjh2LhIQE1KhRA1u2bMk2aJmIiIjePaoIOwAwaNCgXC9bvU20Wi3GjRuX7TIb8di8CI9N7nhscsdjkzMel9y9rcdGI/Ky+7WIiIiI3l5v/ZcKEhEREb0Iww4RERGpGsMOERERqRrDzlvm66+/Ro0aNQq7jCJNo9Hg999/L+wyXllUVBQ0Gg3u3btXqHW8yeNYVPY5S+nSpTF79uzCLiNfvOx5jIuLg0ajwbFjx95YTWrUo0cP5bve3lVF+fOJYUcPPXr0gEajwWeffZZtXlBQEDQaDXr06PHmCytEGo3mhY+vv/66sEvMNwsWLICVlRWePHmitCUnJ8PY2Bjvv/++Tt+sD++LFy++4SqLnnfpNfImZP0dev5x4cKFHPvHx8ejZcuWb7jK/HXz5k0MGDAApUqVglarhZOTE/z9/bF37948Lb948eIi98WxBel1j5caqebW8zfF1dUVK1aswKxZs2BmZgYAePz4MZYvX45SpUoVcnVvXnx8vPLvlStXYuzYsTh37pzSZmlpWRhlFQhfX18kJyfj8OHDqF+/PgBg9+7dcHJywoEDB/D48WOYmpoCACIjI1GqVCmUK1euMEsuEvLyGjl8+HCBbDstLQ0mJiYFsu7C1KJFC4SGhuq0lShRQmc6a99z+9mct0lAQADS0tKwZMkSlC1bFomJiYiIiMDt27ffeC3p6ekwNjZ+49vVR1E6XkUFz+zoqVatWnB1dcXatWuVtrVr16JUqVKoWbOm0paamorBgwfDwcEBpqamaNSoEQ4dOqTMz/qff0REBGrXrg1zc3M0aNBA50MAAKZMmQJHR0dYWVmhd+/eePz4sc78Q4cO4YMPPkDx4sVhY2MDHx8fHDlyRJnfq1cvtGnTRmeZ9PR0ODg4YNGiRa99PJycnJSHjY0NNBqNMr1gwQI0atRIp//s2bNRunRpnbaff/4ZHh4eMDU1hbu7O+bPn6/MS0tLw6BBg+Ds7AxTU1O4ublh8uTJyvzz58+jSZMmMDU1haenJ7Zv356txpEjR6JixYowNzdH2bJl8dVXXyE9PR3A01P4BgYG2T5sZ8+eDTc3N2RmZiptlSpVgrOzM6KiopS2qKgofPjhhyhTpgz279+v0+7r64vMzExMnjwZZcqUgZmZGapXr47ffvtNZ1ubNm1CxYoVYWZmBl9fX8TFxenMz/pf6datW+Hh4QFLS0u0aNFCJ0QU5eNYr149ODg45PgacXJy0gnEMTExub4fcrpMMHToUJ2zau+//z4GDRqEoUOHonjx4vD394eI4Ouvv1b+l1uyZEkMHjxYWebGjRto27YtzMzMUKZMGYSHh2fb95kzZ6Jq1aqwsLCAq6srBg4ciOTkZABASkoKrK2tsz2vv//+OywsLPDgwYNs63tdWf9bf/bRtGnTbPsOZL+MdfDgQdSsWROmpqaoXbs2jh49qrPujIwM9O7dW3nNVqpUCXPmzFHm79q1C8bGxkhISNBZbujQoWjcuHG+7+u9e/ewe/duTJ06Fb6+vnBzc0PdunUxevRotGvXDsCLn5+oqCj07NkT9+/fz3Y2MadLfLa2tli8eDGA/7vEt3LlSvj4+MDU1BTh4eHIyMjA8OHDYWtrC3t7e3zxxRfZfnV7y5YtaNSokdKnTZs2Omd6/fz8sn033M2bN2FiYoKIiIgCO145Xba8d+8eNBqN8rdNLZ9POvLjl8ffFYGBgfLhhx/KzJkzpWnTpkp706ZNZdasWfLhhx9KYGCgiIgMHjxYSpYsKZs2bZJTp05JYGCg2NnZye3bt0VEJDIyUgBIvXr1JCoqSk6dOiWNGzeWBg0aKOtduXKlaLVa+fnnn+Xs2bPy5ZdfipWVlVSvXl3pExERIcuWLZMzZ87I6dOnpXfv3uLo6ChJSUkiIrJ3714xNDSU69evK8usXbtWLCws5MGDB/l6fEJDQ8XGxkaZHjdunE6tIiKzZs0SNzc3ZTosLEycnZ1lzZo1cunSJVmzZo0UK1ZMFi9eLCIi06dPF1dXV9m1a5fExcXJ7t27Zfny5SIikpGRIVWqVJGmTZvKsWPHZOfOnVKzZk0BIOvWrVO2MWHCBNm7d69cvnxZ1q9fL46OjjJ16lRl/gcffCADBw7UqbNatWoyduzYbPvYpUsXad68uTJdp04dWb16tXz22WdK/4cPH4pWq5XFixfLxIkTxd3dXbZs2SIXL16U0NBQ0Wq1EhUVJSIiV65cEa1WK8OHD5ezZ89KWFiYODo6CgC5e/euclyNjY2lWbNmcujQIYmJiREPDw/p0qXLW3ccn3+NZMnL+yHr/fesIUOGiI+PjzLt4+MjlpaWEhwcLGfPnpWzZ8/K6tWrxdraWjZt2iT//POPHDhwQH766SdlmZYtW0r16tUlOjpaDh8+LA0aNBAzMzOZNWuW0mfWrFny119/yeXLlyUiIkIqVaokAwYMUOb37dtXWrVqpVNbu3btpHv37tn29XXldBxy23cR0XkeHzx4ICVKlJAuXbrIyZMnZcOGDVK2bFkBIEePHhURkbS0NBk7dqwcOnRILl26JGFhYWJubi4rV65UtlWxYkWZNm2aMp2WlibFixeXX375Jd/3Nz09XSwtLWXo0KHy+PHjHPu86PlJTU2V2bNni7W1tcTHx0t8fLzyt+/517iIiI2NjYSGhoqIyOXLlwWAlC5dWnlvXb9+XaZOnSp2dnayZs0a5e+ulZWVzvPy22+/yZo1a+T8+fNy9OhRadu2rVStWlUyMjJERCQ8PFzs7Ox09mnmzJlSunRpyczMLLDjlbVPWc+3iMjdu3cFgERGRoqIOj+fGHb0kPVH5saNG6LVaiUuLk7i4uLE1NRUbt68qYSd5ORkMTY2lvDwcGXZtLQ0KVmypPIHIuvFtGPHDqXPn3/+KQDk0aNHIiLi7e2d7cOjXr162QLEszIyMsTKyko2bNigtHl6eup8KLVt21Z69OjxWsciJ68SdsqVK6d86GaZMGGCeHt7i4jI559/Ln5+fjm++bdu3SpGRkZy7do1pW3z5s05/gF71vTp08XLy0uZXrlypc4fnZiYGNFoNHL58uVsyy5cuFAsLCwkPT1dkpKSxMjISG7cuCHLly+XJk2aiMjTNzgAiYuLE3Nzc9m3b5/OOnr37i2ffPKJiIiMHj1aPD09deaPHDkyW9gBIBcuXFD6hISEiKOjozL9thzHl4WdF70f8hp2atasqdNnxowZUrFiRUlLS8u23XPnzgkAOXjwoNJ25swZAaATdp63evVqsbe3V6YPHDig80c7MTFRjIyMlFCbnwIDA8XQ0FAsLCyUR4cOHXLcdxHdD/Qff/xR7O3tlWMqIvLDDz9k+/B7XlBQkAQEBCjTU6dOFQ8PD2V6zZo1YmlpKcnJya+/gzn47bffxM7OTkxNTaVBgwYyevRoOX78eK79n39+cnvd5TXszJ49W6ePs7OzTthLT08XFxeXHENolps3bwoAiY2NFRGRR48eiZ2dnU6IrFatmnz99de5riOvXnS89Ak7avp84mWsV1CiRAm0bt0aixcvRmhoKFq3bo3ixYsr8y9evIj09HQ0bNhQaTM2NkbdunVx5swZnXVVq1ZN+bezszOAp6fVAeDMmTOoV6+eTn9vb2+d6cTERPTt2xcVKlSAjY0NrK2tkZycjCtXrih9+vTpo1zfT0xMxObNm9GrV6/XOQT5IiUlBRcvXkTv3r1haWmpPCZOnKic7u3RoweOHTuGSpUqYfDgwdi2bZuy/JkzZ+Dq6oqSJUsqbc8fH+DpOJGGDRsql0zGjBmjc3zat28PQ0NDrFu3DsDTy0a+vr7ZLrcBTy+TpKSk4NChQ9i9ezcqVqyIEiVKwMfHRxm3ExUVhbJlyyI5ORkPHz7EBx98oLN/S5cuVfYvL88xAJibm+uM/3F2dlZeJ2/jcczNi94PeeXl5aUz/fHHH+PRo0coW7Ys+vbti3Xr1imDzM+cOQMjIyOdZdzd3bMNZt2xYweaNm2K9957D1ZWVujWrRtu376Nhw8fAgDq1q2LypUrY8mSJQCAsLAwuLm5oUmTJnrVnle+vr44duyY8pg7d26O+/68M2fOoFq1asrYMiDn5zokJAReXl4oUaIELC0t8dNPP+k81z169MCFCxeUS7eLFy9Gx44dYWFhkR+7l01AQACuX7+O9evXo0WLFoiKikKtWrWUy00ve35eV+3atZV/379/H/Hx8TrvWyMjI50+wNNLw5988gnKli0La2tr5X2QdRxNTU3RrVs3/PLLLwCAI0eO4OTJk/lyk8vLjldeqenziWHnFfXq1QuLFy/GkiVLXuuJeXagm0ajAQCdcSIvExgYiGPHjmHOnDnYt28fjh07Bnt7e6SlpSl9unfvjkuXLiE6OhphYWEoU6ZMgVxbf56BgUG269hZYzwAKNfUFy5cqPOH++TJk8of0Vq1auHy5cuYMGECHj16hI4dO6JDhw55riE6Ohpdu3ZFq1atsHHjRhw9ehRffvmlzvExMTFB9+7dERoairS0NCxfvjzX57R8+fJwcXFBZGQkIiMj4ePjAwAoWbIkXF1dsW/fPkRGRsLPz0/Zvz///FNn/06fPp1tfMfLPD8gUqPRKMf2bTyOednP598PL3s9ZXn+A9fV1RXnzp3D/PnzYWZmhoEDB6JJkyY5LpuTuLg4tGnTBtWqVcOaNWsQExODkJAQANDZ/z59+igfJqGhoejZs6eyD/nNwsIC5cuXVx5ZH0T5ETZWrFiBESNGoHfv3ti2bRuOHTuGnj176uyrg4MD2rZti9DQ0Df2HyhTU1N88MEH+Oqrr7Bv3z706NED48aNy/Pzk5Nn30dZ8vKayou2bdvizp07WLhwIQ4cOIADBw5kq6lPnz7Yvn07/v33X4SGhsLPzw9ubm56bysnuR0vA4OnH/vP7ndu7wU1fT7xbqxX1KJFC6SlpUGj0SgDAbOUK1cOJiYm2Lt3r/LCTU9Px6FDhzB06NA8b8PDwwMHDhxA9+7dlbZnB8ECwN69ezF//ny0atUKAHD16lXcunVLp4+9vT3at2+P0NBQREdHo2fPnvrs6isrUaIEEhISICLKG+XZQXGOjo4oWbIkLl26hK5du+a6Hmtra3Tq1AmdOnVChw4d0KJFC9y5cwceHh64evUq4uPjlT/2zx+fffv2wc3NDV9++aXS9s8//2TbRp8+fVClShXMnz8fT548wUcffZRrPb6+voiKisLdu3cRHBystDdp0gSbN2/GwYMHMWDAAHh6ekKr1eLKlStKKHqeh4cH1q9fr9P2/D68zNt6HPVVokQJnDx5Uqft2LFjebozxszMDG3btkXbtm0RFBQEd3d3xMbGwt3dHU+ePEFMTAzq1KkDADh37pzO9/3ExMQgMzMTM2bMUD4oVq1alW0bn376Kb744gvMnTsXp0+fRmBg4GvsbcHw8PDAsmXLdO4czOlvSoMGDTBw4EClLaevUOjTpw8++eQTuLi4oFy5cjpnst8ET09P/P7773l6fkxMTJCRkZFtHSVKlNAZ6H/+/PmXng2ysbGBs7MzDhw4oJy5y3oN1apVCwBw+/ZtnDt3DgsXLlQ+uPfs2ZNtXVWrVkXt2rWxcOFCLF++HPPmzdPjCOgn63hl3bUXHx+v3FTzKt+x9LZ9PjHsvCJDQ0PlkpShoaHOPAsLCwwYMADBwcEoVqwYSpUqhWnTpuHhw4fo3bt3nrcxZMgQ9OjRA7Vr10bDhg0RHh6OU6dOoWzZskqfChUqYNmyZahduzaSkpIQHBys3BL/rD59+qBNmzbIyMh4Y3+E33//fdy8eRPTpk1Dhw4dsGXLFmzevBnW1tZKn2+++QaDBw+GjY0NWrRogdTUVBw+fBh3797F8OHDMXPmTDg7O6NmzZowMDDA6tWr4eTkBFtbWzRr1gwVK1ZEYGAgpk+fjqSkJJ0PY+Dp8bly5QpWrFiBOnXq4M8//1QuszzLw8MD9evXx8iRI9GrV68cj2EWX19fBAUFIT09XSfE+Pj4YNCgQUhLS4Ovry+srKwwYsQIDBs2DJmZmWjUqBHu37+PvXv3wtraGoGBgfjss88wY8YMBAcHo0+fPoiJidH7VPPbehz15efnh+nTp2Pp0qXw9vZGWFgYTp48qXMXZE4WL16MjIwM1KtXD+bm5ggLC4OZmRnc3Nxgb2+PFi1aoH///vjhhx9gZGSEoUOH6tRdvnx5pKen4/vvv0fbtm2xd+9eLFiwINt27Ozs8NFHHyE4OBjNmzeHi4tLvu17funSpQu+/PJL9O3bF6NHj0ZcXBy+++47nT4VKlTA0qVLsXXrVpQpUwbLli3DoUOHUKZMGZ1+/v7+sLa2xsSJEzF+/PgCq/n27dv4+OOP0atXL1SrVg1WVlY4fPgwpk2bhg8//DBPz0/p0qWRnJyMiIgIVK9eHebm5jA3N4efnx/mzZsHb29vZGRkYOTIkXkKz0OGDMGUKVNQoUIFuLu7Y+bMmToB2c7ODvb29vjpp5/g7OyMK1euYNSoUTmuq0+fPhg0aBAsLCzwn//857WOFfDy42VmZob69etjypQpKFOmDG7cuIExY8bovZ237vMp30cBqVhud0FkefZurEePHsnnn38uxYsXF61WKw0bNtQZBJk1ACxrEKqIyNGjRwWAzoDOSZMmSfHixcXS0lICAwPliy++0BkAduTIEaldu7aYmppKhQoVZPXq1eLm5pZtcGVmZqa4ubllu2MkP+U0CPCHH34QV1dXsbCwkO7du8ukSZN0BiiLPL0roUaNGmJiYiJ2dnbSpEkTWbt2rYiI/PTTT1KjRg2xsLAQa2tradq0qRw5ckRZ9ty5c9KoUSMxMTGRihUrypYtW7INOgwODhZ7e3uxtLSUTp06yaxZs3IcrLho0aJsg1VzkjXAz93dXac9Li5OAEilSpWUtszMTJk9e7ZUqlRJjI2NpUSJEuLv7y87d+5U+mzYsEHKly8vWq1WGjduLL/88ku2AcrP17tu3Tp5/u37NhzHlw1Qftn7YezYseLo6Cg2NjYybNgwGTRoULYBykOGDMl2rOrVqyfW1tZiYWEh9evX1xl4GR8fL61btxatViulSpWSpUuXZnsPzZw5U5ydncXMzEz8/f1l6dKl2eoV+b/B6atWrcq2j/nlRXdjPb/vItkH4UZHR0v16tXFxMREatSoIWvWrNEZsPr48WPp0aOH2NjYiK2trQwYMEBGjRqV48DTr776KtvdNPnt8ePHMmrUKKlVq5bY2NiIubm5VKpUScaMGSMPHz4Ukbw9P5999pnY29sLABk3bpyIiFy7dk2aN28uFhYWUqFCBdm0aVOOA5SfH7ydnp4uQ4YMEWtra7G1tZXhw4dL9+7ddZ6X7du3i4eHh2i1WqlWrZpERUXlOCD6wYMHYm5unm2wb0Eer9OnT4u3t7eYmZlJjRo1ZNu2bTkOUFbT55NG5LkLlqRKycnJeO+99xAaGpqvlxbUZMKECVi9ejVOnDhR2KW81d7l47hs2TIMGzYM169fV+WXGT6vd+/euHnzZrZLsZR3cXFxKFeuHA4dOqRcBnvXvInPJ17GUrnMzEzcunULM2bMgK2trfIlXPR/kpOTERcXh3nz5mHixImFXc5b610+jg8fPkR8fDymTJmC/v37qz7o3L9/H7GxsVi+fDmDzitKT0/H7du3MWbMGNSvX/+dDDpv9POpwM4ZUZGQdRrWxcVF59Q9/Z/AwEAxMTGRjh07ypMnTwq7nLfWu3wcx40bJ0ZGRuLn55fvX4ZWFPn4+IiZmZkMHTq0sEt5a2VdKqpYsaKcOHGisMspFG/y84mXsYiIiEjV+D07REREpGoMO0RERKRqDDtERESkagw7REREpGoMO0SkWnv37kXVqlVhbGyM9u3bF3Y5OkqXLo3Zs2cXdhlE7wSGHSJ6JT169IBGo4FGo4GxsTEcHR3xwQcf4JdfftHrxwIL0vDhw1GjRg1cvnw5x5/hGDVqFNzd3XXazp49C41Gk+3XpxcvXgytVotHjx4VYMVEVBAYdojolbVo0QLx8fGIi4vD5s2b4evriyFDhqBNmzZ48uRJYZeHixcvws/PDy4uLrC1tc0239fXF+fOnUNCQoLSFhkZCVdXV0RFRen0jYyMRP369fP1976I6M1g2CGiV6bVauHk5IT33nsPtWrVwv/+9z/88ccf2Lx5s86ZlJkzZ6Jq1aqwsLCAq6srBg4ciOTkZABASkoKrK2t8dtvv+ms+/fff4eFhQUePHiQ47ZTU1MxePBgODg4wNTUFI0aNcKhQ4cAPP0Kfo1Gg9u3b6NXr17QaDQ5ntlp1KgRjI2NdYJNVFQUgoKCcOfOHcTFxem0+/r6KtseMWIE3nvvPVhYWKBevXrZwtGePXvQuHFjmJmZwdXVFYMHD0ZKSkqux/Lnn3+Gra0tIiIicu1DRK+GYYeI8pWfnx+qV6+OtWvXKm0GBgaYO3cuTp06hSVLluCvv/7CF198AQCwsLBA586dERoaqrOe0NBQdOjQAVZWVjlu54svvsCaNWuwZMkSHDlyBOXLl4e/vz/u3LkDV1dXxMfHw9raGrNnz0Z8fDw6deqUbR0WFhaoU6cOIiMjlbaoqCg0bdoUDRs2VNovXbqEK1euKGFn0KBBiI6OxooVK3DixAl8/PHHaNGiBc6fPw/g6RmlFi1aICAgACdOnMDKlSuxZ88eDBo0KMd9mTZtGkaNGoVt27ahadOmeT3URJRXBfr9zESkWrn9+raISKdOncTDwyPXZVevXi329vbK9IEDB3R+PTsxMVGMjIwkKioqx+WTk5PF2NhYwsPDlba0tDQpWbKkTJs2TWl79hesc/Pll19KxYoVRUTk1KlTYm1tLU+ePJFvv/1WunfvLiJPf8nd1NRUHj9+LP/8848YGhrKtWvXdNbTtGlTGT16tIiI9O7dW/r166czf/fu3WJgYCCPHj0SEVF+/fmLL74QZ2dnOXny5AvrJKJXxx8CJaJ8JyLQaDTK9I4dOzB58mScPXsWSUlJePLkCR4/foyHDx/C3NwcdevWReXKlbFkyRKMGjUKYWFhcHNzQ5MmTXJc/8WLF5Geno6GDRsqbcbGxqhbty7OnDmjV63vv/8+Jk2ahPj4eERFRaFRo0YwNDSEj48PFixYAODp2Z4GDRpAq9UiNjYWGRkZqFixos56UlNTYW9vDwA4fvw4Tpw4gfDwcJ1jkpmZicuXL8PDwwMAMGPGDKSkpODw4cMoW7asXnUTUd7xMhYR5bszZ86gTJkyAJ6On2nTpg2qVauGNWvWICYmBiEhIQCAtLQ0ZZk+ffoo42pCQ0PRs2dPncBUUBo2bAgTExNERkYiMjISPj4+AIA6derg1q1buHTpEqKiouDn5wfg6a+7GxoaIiYmBseOHVMeZ86cwZw5c5Q+/fv315l//PhxnD9/HuXKlVO23bhxY2RkZGDVqlUFvp9E7zKe2SGifPXXX38hNjYWw4YNAwDExMQgMzMTM2bMgIHB0/9f5fTh/umnn+KLL77A3Llzcfr0aQQGBua6jXLlysHExAR79+6Fm5sbACA9PR2HDh3C0KFD9arXzMxMGWC8c+dOBAcHA3h6pqh+/fpYtGgRrl69qozXqVmzJjIyMnDjxg00btw4x3XWqlULp0+fRvny5V+47bp162LQoEFo0aIFjIyMMGLECL1qJ6K8YdgholeWmpqKhIQEZGRkIDExEVu2bMHkyZPRpk0bdO/eHQBQvnx5pKen4/vvv0fbtm2xd+9e5fLQs+zs7PDRRx8hODgYzZs3h4uLS67btbCwwIABAxAcHIxixYqhVKlSmDZtGh4+fIjevXvrvR++vr6YNWsWgKdBJYuPjw++++47ZSAzAFSsWBFdu3ZF9+7dMWPGDNSsWRM3b95EREQEqlWrhtatW2PkyJGoX78+Bg0ahD59+sDCwgKnT5/G9u3bMW/ePJ1tN2jQAJs2bULLli1hZGSkd1gjojwo7EFDRPR2CgwMFAACQIyMjKREiRLSrFkz+eWXXyQjI0On78yZM8XZ2VnMzMzE399fli5dKgDk7t27Ov0iIiIEgKxateql23/06JF8/vnnUrx4cdFqtdKwYUM5ePCgTp+8DFAWEYmMjBQA0qJFC532qKgoASD+/v467WlpaTJ27FgpXbq0GBsbi7Ozs/znP/+REydOKH0OHjwoH3zwgVhaWoqFhYVUq1ZNJk2apMzPGqCcZefOnWJhYSFz5859ab1EpB+NiEhhhi0ioizLli3DsGHDcP36dZiYmBR2OUSkEryMRUSF7uHDh4iPj8eUKVPQv39/Bh0iyle8G4uICt20adPg7u4OJycnjB49urDLISKV4WUsIiIiUjWe2SEiIiJVY9ghIiIiVWPYISIiIlVj2CEiIiJVY9ghIiIiVWPYISIiIlVj2CEiIiJVY9ghIiIiVWPYISIiIlX7f5lJpRUCjetIAAAAAElFTkSuQmCC\n"},"metadata":{}}],"execution_count":117},{"cell_type":"code","source":"holidays_events = pd.read_csv(\"/kaggle/input/competitions/Store-Sales-Forecasting/holidays_events.csv\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:55.500893Z","iopub.execute_input":"2026-07-24T08:14:55.5011Z","iopub.status.idle":"2026-07-24T08:14:55.508562Z","shell.execute_reply.started":"2026-07-24T08:14:55.501079Z","shell.execute_reply":"2026-07-24T08:14:55.507809Z"}},"outputs":[],"execution_count":118},{"cell_type":"code","source":"holiday = holidays_events[[\"date\", \"type\", \"transferred\"]].copy()\n\nholiday[\"date\"] = pd.to_datetime(holiday[\"date\"])\n\ntrain = train.merge(\n    holiday,\n    on=\"date\",\n    how=\"left\"\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:55.509509Z","iopub.execute_input":"2026-07-24T08:14:55.509743Z","iopub.status.idle":"2026-07-24T08:14:56.121267Z","shell.execute_reply.started":"2026-07-24T08:14:55.509723Z","shell.execute_reply":"2026-07-24T08:14:56.120612Z"}},"outputs":[],"execution_count":119},{"cell_type":"code","source":"train[\"is_holiday\"] = train[\"type\"].notnull().astype(int)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:56.122013Z","iopub.execute_input":"2026-07-24T08:14:56.12222Z","iopub.status.idle":"2026-07-24T08:14:56.185928Z","shell.execute_reply.started":"2026-07-24T08:14:56.122195Z","shell.execute_reply":"2026-07-24T08:14:56.184906Z"}},"outputs":[],"execution_count":120},{"cell_type":"code","source":"train.groupby(\n    [\"dayofweek\", \"is_holiday\"]\n)[\"sales\"].mean()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:56.189273Z","iopub.execute_input":"2026-07-24T08:14:56.18957Z","iopub.status.idle":"2026-07-24T08:14:56.284787Z","shell.execute_reply.started":"2026-07-24T08:14:56.189546Z","shell.execute_reply":"2026-07-24T08:14:56.283816Z"}},"outputs":[{"execution_count":121,"output_type":"execute_result","data":{"text/plain":"dayofweek  is_holiday\n0          0             334.494254\n           1             408.273676\n1          0             313.748039\n           1             353.545989\n2          0             326.828892\n           1             355.932299\n3          0             276.573533\n           1             344.912565\n4          0             314.283771\n           1             380.044810\n5          0             431.325567\n           1             452.002636\n6          0             469.124798\n           1             443.860750\nName: sales, dtype: float64"},"metadata":{}}],"execution_count":121},{"cell_type":"code","source":"import pandas as pd\n\npivot = train.pivot_table(\n    values=\"sales\",\n    index=\"dayofweek\",\n    columns=\"is_holiday\",\n    aggfunc=\"mean\"\n)\n\npivot.plot(kind=\"bar\")\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:56.285631Z","iopub.execute_input":"2026-07-24T08:14:56.285887Z","iopub.status.idle":"2026-07-24T08:14:56.488645Z","shell.execute_reply.started":"2026-07-24T08:14:56.285857Z","shell.execute_reply":"2026-07-24T08:14:56.488072Z"}},"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 640x480 with 1 Axes>","image/png":"iVBORw0KGgoAAAANSUhEUgAAAigAAAGrCAYAAADqwWxuAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAK69JREFUeJzt3XtcVfWe//H35q5yExWQAtQ0ldIsNd2VSkqROY6WUzaZillOHigNsw4zjTp6Gh27aBfSOWcUPB0v1XlUlplpdKSLKIp5Sc2y7MBkGywDlBSQvX5/+HNPO8VEkfUFXs/HYz0eZ6/vd3/3Z33Po3j3XTeHZVmWAAAADOJjdwEAAAC/RkABAADGIaAAAADjEFAAAIBxCCgAAMA4BBQAAGAcAgoAADCOn90FXAi3261Dhw4pJCREDofD7nIAAMB5sCxLR48eVUxMjHx8zr1G0igDyqFDhxQbG2t3GQAA4AIUFRXp8ssvP2efRhlQQkJCJJ06wNDQUJurAQAA56O8vFyxsbGev+Pn0igDyunTOqGhoQQUAAAamfO5PIOLZAEAgHEIKAAAwDgEFAAAYJxGeQ0KgPpRU1Oj6upqu8toNPz9/eXr62t3GUCzQEABmiHLsuRyuVRaWmp3KY1OeHi4oqOjeQYTcIkRUIBm6HQ4iYyMVMuWLfljex4sy9LPP/+skpISSVL79u1trgho2ggoQDNTU1PjCSdt2rSxu5xGpUWLFpKkkpISRUZGcroHuIS4SBZoZk5fc9KyZUubK2mcTs8b1+4AlxYBBWimOK1zYZg3oGEQUAAAgHEIKAAAwDgEFABeEhMTNXXqVNvHmDVrlnr16uX5nJKSopEjR17y3wVgBu7iAeDljTfekL+/v91lnOH555+XZVl2lwGggRBQAHiJiIiwu4SzCgsLs7sEAA2IUzwAvPzyNMnLL7+sLl26KCgoSFFRUfqnf/qn8x7H7Xbr8ccfV0REhKKjozVr1iyv9sLCQo0YMULBwcEKDQ3V3XffreLi4lrH+/UpnoqKCo0bN07BwcFq3769nn322TO+88orr6hPnz4KCQlRdHS07r33Xs+D1izLUufOnfXMM894fWfHjh1yOBw6cODAeR8rgPrHCgqAs9q2bZseeeQRvfLKK7rhhht05MgRffzxx+f9/WXLlik9PV1btmxRXl6eUlJSdOONN+qWW26R2+32hJPc3FydPHlSqampGj16tDZu3Hhe40+fPl25ublavXq1IiMj9a//+q/avn2713Ur1dXVmjNnjrp27aqSkhKlp6crJSVFa9eulcPh0P3336+srCw99thjnu9kZWVp4MCB6ty583kfK3CpdPj9u/UyzrfzhtXLOA2JgALgrAoLC9WqVSv9wz/8g0JCQhQfH69rr732vL/fs2dPzZw5U5LUpUsXvfTSS8rJydEtt9yinJwc7d69WwcPHlRsbKwk6c9//rOuuuoqbd26VX379j3n2MeOHdOSJUv0l7/8RUOGDJF0KhBdfvnlXv3uv/9+z//u1KmTXnjhBfXt21fHjh1TcHCwUlJSNGPGDOXn5+v6669XdXW1VqxYccaqCoCGxykeAGd1yy23KD4+Xp06ddLYsWO1fPly/fzzz+f9/Z49e3p9bt++vef0yr59+xQbG+sJJ5KUkJCg8PBw7du37zfH/vrrr1VVVaV+/fp59kVERKhr165e/QoKCjR8+HDFxcUpJCREgwYNknQqfElSTEyMhg0bpqVLl0qS3nnnHVVWVuquu+467+MEcGkQUACcVUhIiLZv366VK1eqffv2mjFjhq655przfgPyr+8Ecjgccrvdl6DSs6uoqFBycrJCQ0O1fPlybd26VW+++aYkqaqqytPvgQce0KpVq3T8+HFlZWVp9OjRvAYAMAABBUCt/Pz8lJSUpPnz52vXrl369ttv9eGHH170uN27d1dRUZGKioo8+/bu3avS0lIlJCT85vevuOIK+fv7a8uWLZ59P/30k7788kvP5y+++EI//vij5s2bpwEDBqhbt26eFZxfuv3229WqVSstWrRI69at8zotBMA+XIMC4KzWrFmjb775RgMHDlTr1q21du1aud3uM06jXIikpCT16NFDY8aM0cKFC3Xy5En97ne/06BBg9SnT5/f/H5wcLAmTpyo6dOnq02bNoqMjNS//du/ycfn//6bKy4uTgEBAXrxxRf10EMP6fPPP9ecOXPOGMvX11cpKSnKyMhQly5d5HQ6L/r4AFw8VlAAnFV4eLjeeOMNDR48WN27d9fixYu1cuVKXXXVVRc9tsPh0OrVq9W6dWsNHDhQSUlJ6tSpk1599dXzHuPpp5/WgAEDNHz4cCUlJemmm25S7969Pe3t2rVTdna2Xn/9dSUkJGjevHm1Xvw6ceJEVVVVacKE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o/rss88kSbm5uWrbtq1XoMjNzVViYqIk6euvv9Ztt92mUaNGadeuXXr11Vf1ySefKC0tzdM/LS1NeXl5WrVqlXbt2qW77rpLt912m7766qsz5qSoqEgDBgzQ1Vdfrb/+9a8KDAy86HkGUAe2vqoQgO2OHj1qBQQEWK+99ppn348//mi1aNHCmjJlylm/s3XrVkuSdfToUcuyLOu7776zfH19rS1btliWZVlVVVVW27ZtrezsbMuyLGv9+vWWr6+vVVhY6Bljz549liQrPz/fsizL+uyzzyxJ1sGDBz19rrvuOuvpp5+2LMuyRo4caT311FNWQECAdfToUet///d/LUnWl19+aVmWZU2cONGaNGmSV50ff/yx5ePjYx0/ftz6+9//bvn6+lrfffedV58hQ4ZYGRkZlmVZVlZWlhUWFmZ98cUXVmxsrPXII49Ybre7TvMJoH6wggI0c19//bWqqqrUr18/z76IiAh17drV87mgoEDDhw9XXFycQkJCNGjQIEmnTttIp97/MWzYMC1dulTSqXehVFZW6q677pIk7du3T7GxsYqNjfWMmZCQoPDwcO3bt6/W2gYNGqSNGzfKsix9/PHHuvPOO9W9e3d98sknys3NVUxMjLp06SJJ2rlzp7KzsxUcHOzZkpOT5Xa7dfDgQe3evVs1NTW68sorvfrk5ubq66+/9vzm8ePHNWDAAN155516/vnneXswYBMukgVwThUVFUpOTlZycrKWL1+udu3aqbCwUMnJyaqqqvL0e+CBBzR27FgtWLBAWVlZGj16tFq2bHlRv52YmKilS5dq586d8vf3V7du3ZSYmKiNGzfqp59+8gQlSTp27Jj+5V/+RY888sgZ48TFxWnXrl3y9fVVQUGBfH19vdp/+bK5wMBAJSUlac2aNZo+fbouu+yyizoGABeGgAI0c1dccYX8/f21ZcsWxcXFSZJ++uknffnllxo0aJC++OIL/fjjj5o3b55nBWTbtm1njHP77berVatWWrRokdatW6ePPvrI09a9e3cVFRWpqKjIM8bevXtVWlqqhISEWmsbMGCAjh49qgULFnjCSGJioubNm6effvpJ06ZN8/S97rrrtHfvXnXu3PmsY1177bWqqalRSUnJOd906+Pjo1deeUX33nuvbr75Zm3cuFExMTG19gdwaXCKB2jmgoODNXHiRE2fPl0ffvihPv/8c6WkpMjH59S/HuLi4hQQEKAXX3xR33zzjd5++23NmTPnjHF8fX2VkpKijIwMdenSRU6n09OWlJSkHj16aMyYMdq+fbvy8/M1btw4DRo06Jyvfm/durV69uyp5cuXey6GHThwoLZv3+4JUKc98cQT2rRpk9LS0rRjxw599dVXWr16teci2SuvvFJjxozRuHHj9MYbb+jgwYPKz8/X3Llz9e67755xLMuXL9c111yjwYMHy+VyXfD8ArgwBBQAevrppzVgwAANHz5cSUlJuummm9S7d29JUrt27ZSdna3XX39dCQkJmjdv3hm3FJ82ceJEVVVVacKECV77HQ6HVq9erdatW2vgwIFKSkpSp06d9Oqrr/5mbYMGDVJNTY0noERERCghIUHR0dFe18n07NlTubm5+vLLLzVgwABde+21mjFjhtfqR1ZWlsaNG6dp06apa9euGjlypLZu3epZOfolPz8/rVy5UldddZUGDx7sua0aQMNwWJZl2V0EgKbh448/1pAhQ1RUVKSoqCi7ywHQiBFQAFy0yspKHT58WOPHj1d0dLSWL19ud0kAGjlO8QC4aCtXrlR8fLxKS0s1f/58u8sB0ASwggIAAIzDCgoAADAOAQUAABiHgAIAAIxDQAEAAMYhoAAAAOMQUAAAgHEIKAAAwDgEFAAAYJz/B7qBrR45Z9NDAAAAAElFTkSuQmCC\n"},"metadata":{}}],"execution_count":122},{"cell_type":"code","source":"train.groupby([\"dayofweek\", \"is_holiday\"]).size()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:56.489778Z","iopub.execute_input":"2026-07-24T08:14:56.490114Z","iopub.status.idle":"2026-07-24T08:14:56.568578Z","shell.execute_reply.started":"2026-07-24T08:14:56.490079Z","shell.execute_reply":"2026-07-24T08:14:56.567791Z"}},"outputs":[{"execution_count":123,"output_type":"execute_result","data":{"text/plain":"dayofweek  is_holiday\n0          0             352836\n           1              80190\n1          0             368874\n           1              67716\n2          0             376002\n           1              58806\n3          0             374220\n           1              64152\n4          0             351054\n           1              81972\n5          0             363528\n           1              73062\n6          0             365310\n           1              76626\ndtype: int64"},"metadata":{}}],"execution_count":123},{"cell_type":"code","source":"train[\"date\"] = pd.to_datetime(train[\"date\"])\n\ntrain_data = train[train[\"date\"] < \"2017-01-01\"]\nvalid_data = train[train[\"date\"] >= \"2017-01-01\"]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:56.569478Z","iopub.execute_input":"2026-07-24T08:14:56.569735Z","iopub.status.idle":"2026-07-24T08:14:56.83839Z","shell.execute_reply.started":"2026-07-24T08:14:56.569699Z","shell.execute_reply":"2026-07-24T08:14:56.83761Z"}},"outputs":[],"execution_count":124},{"cell_type":"code","source":"features = [\"dayofweek\"]\n\nX_train = train_data[features]\ny_train = train_data[\"sales\"]\n\nX_valid = valid_data[features]\ny_valid = valid_data[\"sales\"]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:56.83906Z","iopub.execute_input":"2026-07-24T08:14:56.839213Z","iopub.status.idle":"2026-07-24T08:14:56.849842Z","shell.execute_reply.started":"2026-07-24T08:14:56.839198Z","shell.execute_reply":"2026-07-24T08:14:56.848967Z"}},"outputs":[],"execution_count":125},{"cell_type":"code","source":"from sklearn.tree import DecisionTreeRegressor\n\nmodel = DecisionTreeRegressor(random_state=42)\nmodel.fit(X_train, y_train)\n\npred = model.predict(X_valid)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:56.850712Z","iopub.execute_input":"2026-07-24T08:14:56.850942Z","iopub.status.idle":"2026-07-24T08:14:57.002058Z","shell.execute_reply.started":"2026-07-24T08:14:56.850908Z","shell.execute_reply":"2026-07-24T08:14:57.001401Z"}},"outputs":[],"execution_count":126},{"cell_type":"code","source":"from sklearn.metrics import root_mean_squared_log_error\n\nscore1 = root_mean_squared_log_error(y_valid, pred)\nprint(score1)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:57.002873Z","iopub.execute_input":"2026-07-24T08:14:57.003062Z","iopub.status.idle":"2026-07-24T08:14:57.022042Z","shell.execute_reply.started":"2026-07-24T08:14:57.00304Z","shell.execute_reply":"2026-07-24T08:14:57.020912Z"}},"outputs":[{"name":"stdout","text":"3.3954213047705264\n","output_type":"stream"}],"execution_count":127},{"cell_type":"code","source":"features = [\"dayofweek\", \"is_holiday\"]\n\nX_train = train_data[features]\nX_valid = valid_data[features]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:57.023072Z","iopub.execute_input":"2026-07-24T08:14:57.023388Z","iopub.status.idle":"2026-07-24T08:14:57.039268Z","shell.execute_reply.started":"2026-07-24T08:14:57.023369Z","shell.execute_reply":"2026-07-24T08:14:57.038386Z"}},"outputs":[],"execution_count":128},{"cell_type":"code","source":"model = DecisionTreeRegressor(random_state=42)\nmodel.fit(X_train, y_train)\n\npred = model.predict(X_valid)\n\nscore2 = root_mean_squared_log_error(y_valid, pred)\nprint(score2)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:57.040371Z","iopub.execute_input":"2026-07-24T08:14:57.040647Z","iopub.status.idle":"2026-07-24T08:14:57.258064Z","shell.execute_reply.started":"2026-07-24T08:14:57.040621Z","shell.execute_reply":"2026-07-24T08:14:57.25714Z"}},"outputs":[{"name":"stdout","text":"3.3903168592221413\n","output_type":"stream"}],"execution_count":129},{"cell_type":"code","source":"train[\"month\"] = train[\"date\"].dt.month","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:57.259531Z","iopub.execute_input":"2026-07-24T08:14:57.259948Z","iopub.status.idle":"2026-07-24T08:14:57.313755Z","shell.execute_reply.started":"2026-07-24T08:14:57.259921Z","shell.execute_reply":"2026-07-24T08:14:57.31311Z"}},"outputs":[],"execution_count":130},{"cell_type":"code","source":"monthly_sales = train.groupby(\"month\")[\"sales\"].mean()\nprint(monthly_sales)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:57.31493Z","iopub.execute_input":"2026-07-24T08:14:57.31512Z","iopub.status.idle":"2026-07-24T08:14:57.362007Z","shell.execute_reply.started":"2026-07-24T08:14:57.315102Z","shell.execute_reply":"2026-07-24T08:14:57.361034Z"}},"outputs":[{"name":"stdout","text":"month\n1     341.921554\n2     320.928869\n3     352.009294\n4     341.167844\n5     345.652814\n6     352.511265\n7     376.414091\n8     336.992535\n9     362.297418\n10    362.407132\n11    376.889143\n12    457.383116\nName: sales, dtype: float64\n","output_type":"stream"}],"execution_count":131},{"cell_type":"code","source":"train[\"date\"] = pd.to_datetime(train[\"date\"])\n\ntrain[\"dayofweek\"] = train[\"date\"].dt.dayofweek\ntrain[\"month\"] = train[\"date\"].dt.month\n\ntrain_data = train[train[\"date\"] < \"2017-01-01\"]\nvalid_data = train[train[\"date\"] >= \"2017-01-01\"]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:57.362901Z","iopub.execute_input":"2026-07-24T08:14:57.363185Z","iopub.status.idle":"2026-07-24T08:14:57.91969Z","shell.execute_reply.started":"2026-07-24T08:14:57.363161Z","shell.execute_reply":"2026-07-24T08:14:57.919098Z"}},"outputs":[],"execution_count":132},{"cell_type":"code","source":"features = [\n    \"dayofweek\",\n    \"is_holiday\",\n    \"month\"\n]\n\nX_train = train_data[features]\ny_train = train_data[\"sales\"]\n\nX_valid = valid_data[features]\ny_valid = valid_data[\"sales\"]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:57.920438Z","iopub.execute_input":"2026-07-24T08:14:57.920619Z","iopub.status.idle":"2026-07-24T08:14:57.940795Z","shell.execute_reply.started":"2026-07-24T08:14:57.920601Z","shell.execute_reply":"2026-07-24T08:14:57.939792Z"}},"outputs":[],"execution_count":133},{"cell_type":"code","source":"from sklearn.tree import DecisionTreeRegressor\nfrom sklearn.metrics import root_mean_squared_log_error\n\nmodel = DecisionTreeRegressor(random_state=42)\nmodel.fit(X_train, y_train)\n\npred = model.predict(X_valid)\n\nscore3 = root_mean_squared_log_error(y_valid, pred)\nprint(\"RMSLE:\", score3)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:57.941802Z","iopub.execute_input":"2026-07-24T08:14:57.942091Z","iopub.status.idle":"2026-07-24T08:14:58.466384Z","shell.execute_reply.started":"2026-07-24T08:14:57.942059Z","shell.execute_reply":"2026-07-24T08:14:58.46552Z"}},"outputs":[{"name":"stdout","text":"RMSLE: 3.3432074440298147\n","output_type":"stream"}],"execution_count":134},{"cell_type":"code","source":"oil = pd.read_csv(\"/kaggle/input/competitions/Store-Sales-Forecasting/oil.csv\")\noil.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:58.467506Z","iopub.execute_input":"2026-07-24T08:14:58.467927Z","iopub.status.idle":"2026-07-24T08:14:58.478599Z","shell.execute_reply.started":"2026-07-24T08:14:58.467899Z","shell.execute_reply":"2026-07-24T08:14:58.477971Z"}},"outputs":[{"execution_count":135,"output_type":"execute_result","data":{"text/plain":"         date  dcoilwtico\n0  2013-01-01         NaN\n1  2013-01-02       93.14\n2  2013-01-03       92.97\n3  2013-01-04       93.12\n4  2013-01-07       93.20","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>date</th>\n      <th>dcoilwtico</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>2013-01-01</td>\n      <td>NaN</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>2013-01-02</td>\n      <td>93.14</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>2013-01-03</td>\n      <td>92.97</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>2013-01-04</td>\n      <td>93.12</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>2013-01-07</td>\n      <td>93.20</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}],"execution_count":135},{"cell_type":"code","source":"oil[\"date\"] = pd.to_datetime(oil[\"date\"])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:58.479541Z","iopub.execute_input":"2026-07-24T08:14:58.479761Z","iopub.status.idle":"2026-07-24T08:14:58.485848Z","shell.execute_reply.started":"2026-07-24T08:14:58.47974Z","shell.execute_reply":"2026-07-24T08:14:58.485219Z"}},"outputs":[],"execution_count":136},{"cell_type":"code","source":"train = train.merge(oil, on=\"date\", how=\"left\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:58.486784Z","iopub.execute_input":"2026-07-24T08:14:58.487024Z","iopub.status.idle":"2026-07-24T08:14:58.815967Z","shell.execute_reply.started":"2026-07-24T08:14:58.487006Z","shell.execute_reply":"2026-07-24T08:14:58.815243Z"}},"outputs":[],"execution_count":137},{"cell_type":"code","source":"train.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:58.816744Z","iopub.execute_input":"2026-07-24T08:14:58.81702Z","iopub.status.idle":"2026-07-24T08:14:58.827975Z","shell.execute_reply.started":"2026-07-24T08:14:58.817001Z","shell.execute_reply":"2026-07-24T08:14:58.826941Z"}},"outputs":[{"execution_count":138,"output_type":"execute_result","data":{"text/plain":"   id       date  store_nbr      family  sales  onpromotion  dayofweek  \\\n0   0 2013-01-01          1  AUTOMOTIVE    0.0            0          1   \n1   1 2013-01-01          1   BABY CARE    0.0            0          1   \n2   2 2013-01-01          1      BEAUTY    0.0            0          1   \n3   3 2013-01-01          1   BEVERAGES    0.0            0          1   \n4   4 2013-01-01          1       BOOKS    0.0            0          1   \n\n  day_name     type transferred  is_holiday  month  dcoilwtico  \n0  Tuesday  Holiday       False           1      1         NaN  \n1  Tuesday  Holiday       False           1      1         NaN  \n2  Tuesday  Holiday       False           1      1         NaN  \n3  Tuesday  Holiday       False           1      1         NaN  \n4  Tuesday  Holiday       False           1      1         NaN  ","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>id</th>\n      <th>date</th>\n      <th>store_nbr</th>\n      <th>family</th>\n      <th>sales</th>\n      <th>onpromotion</th>\n      <th>dayofweek</th>\n      <th>day_name</th>\n      <th>type</th>\n      <th>transferred</th>\n      <th>is_holiday</th>\n      <th>month</th>\n      <th>dcoilwtico</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>0</td>\n      <td>2013-01-01</td>\n      <td>1</td>\n      <td>AUTOMOTIVE</td>\n      <td>0.0</td>\n      <td>0</td>\n      <td>1</td>\n      <td>Tuesday</td>\n      <td>Holiday</td>\n      <td>False</td>\n      <td>1</td>\n      <td>1</td>\n      <td>NaN</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>1</td>\n      <td>2013-01-01</td>\n      <td>1</td>\n      <td>BABY CARE</td>\n      <td>0.0</td>\n      <td>0</td>\n      <td>1</td>\n      <td>Tuesday</td>\n      <td>Holiday</td>\n      <td>False</td>\n      <td>1</td>\n      <td>1</td>\n      <td>NaN</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>2</td>\n      <td>2013-01-01</td>\n      <td>1</td>\n      <td>BEAUTY</td>\n      <td>0.0</td>\n      <td>0</td>\n      <td>1</td>\n      <td>Tuesday</td>\n      <td>Holiday</td>\n      <td>False</td>\n      <td>1</td>\n      <td>1</td>\n      <td>NaN</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>3</td>\n      <td>2013-01-01</td>\n      <td>1</td>\n      <td>BEVERAGES</td>\n      <td>0.0</td>\n      <td>0</td>\n      <td>1</td>\n      <td>Tuesday</td>\n      <td>Holiday</td>\n      <td>False</td>\n      <td>1</td>\n      <td>1</td>\n      <td>NaN</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>4</td>\n      <td>2013-01-01</td>\n      <td>1</td>\n      <td>BOOKS</td>\n      <td>0.0</td>\n      <td>0</td>\n      <td>1</td>\n      <td>Tuesday</td>\n      <td>Holiday</td>\n      <td>False</td>\n      <td>1</td>\n      <td>1</td>\n      <td>NaN</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}],"execution_count":138},{"cell_type":"code","source":"train[\"dcoilwtico\"] = train[\"dcoilwtico\"].ffill()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:58.828856Z","iopub.execute_input":"2026-07-24T08:14:58.829307Z","iopub.status.idle":"2026-07-24T08:14:58.851534Z","shell.execute_reply.started":"2026-07-24T08:14:58.829283Z","shell.execute_reply":"2026-07-24T08:14:58.850932Z"}},"outputs":[],"execution_count":139},{"cell_type":"code","source":"train[\"dcoilwtico\"] = train[\"dcoilwtico\"].bfill()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:58.852574Z","iopub.execute_input":"2026-07-24T08:14:58.852878Z","iopub.status.idle":"2026-07-24T08:14:58.866444Z","shell.execute_reply.started":"2026-07-24T08:14:58.852845Z","shell.execute_reply":"2026-07-24T08:14:58.865806Z"}},"outputs":[],"execution_count":140},{"cell_type":"code","source":"features = [\n    \"dayofweek\",\n    \"is_holiday\",\n    \"month\",\n    \"dcoilwtico\"\n]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:58.867292Z","iopub.execute_input":"2026-07-24T08:14:58.867535Z","iopub.status.idle":"2026-07-24T08:14:58.871326Z","shell.execute_reply.started":"2026-07-24T08:14:58.867512Z","shell.execute_reply":"2026-07-24T08:14:58.870679Z"}},"outputs":[],"execution_count":141},{"cell_type":"code","source":"train[\"dcoilwtico\"] = train[\"dcoilwtico\"].bfill()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:58.872072Z","iopub.execute_input":"2026-07-24T08:14:58.872745Z","iopub.status.idle":"2026-07-24T08:14:58.896763Z","shell.execute_reply.started":"2026-07-24T08:14:58.872703Z","shell.execute_reply":"2026-07-24T08:14:58.896093Z"}},"outputs":[],"execution_count":142},{"cell_type":"code","source":"print(oil.columns)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:58.898072Z","iopub.execute_input":"2026-07-24T08:14:58.898291Z","iopub.status.idle":"2026-07-24T08:14:58.902082Z","shell.execute_reply.started":"2026-07-24T08:14:58.898264Z","shell.execute_reply":"2026-07-24T08:14:58.901385Z"}},"outputs":[{"name":"stdout","text":"Index(['date', 'dcoilwtico'], dtype='object')\n","output_type":"stream"}],"execution_count":143},{"cell_type":"code","source":"print(train.columns)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:58.903251Z","iopub.execute_input":"2026-07-24T08:14:58.903467Z","iopub.status.idle":"2026-07-24T08:14:58.917581Z","shell.execute_reply.started":"2026-07-24T08:14:58.903448Z","shell.execute_reply":"2026-07-24T08:14:58.916797Z"}},"outputs":[{"name":"stdout","text":"Index(['id', 'date', 'store_nbr', 'family', 'sales', 'onpromotion',\n       'dayofweek', 'day_name', 'type', 'transferred', 'is_holiday', 'month',\n       'dcoilwtico'],\n      dtype='object')\n","output_type":"stream"}],"execution_count":144},{"cell_type":"code","source":"train_data = train[train[\"date\"] < \"2017-01-01\"]\nvalid_data = train[train[\"date\"] >= \"2017-01-01\"]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:58.91852Z","iopub.execute_input":"2026-07-24T08:14:58.918773Z","iopub.status.idle":"2026-07-24T08:14:59.145015Z","shell.execute_reply.started":"2026-07-24T08:14:58.918746Z","shell.execute_reply":"2026-07-24T08:14:59.144336Z"}},"outputs":[],"execution_count":145},{"cell_type":"code","source":"features = [\n    \"dayofweek\",\n    \"is_holiday\",\n    \"month\",\n    \"dcoilwtico\"\n]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:59.14569Z","iopub.execute_input":"2026-07-24T08:14:59.145872Z","iopub.status.idle":"2026-07-24T08:14:59.149588Z","shell.execute_reply.started":"2026-07-24T08:14:59.145843Z","shell.execute_reply":"2026-07-24T08:14:59.148816Z"}},"outputs":[],"execution_count":146},{"cell_type":"code","source":"X_train = train_data[features]\nX_valid = valid_data[features]\n\nmodel.fit(X_train, y_train)\npred = model.predict(X_valid)\n\nscore = root_mean_squared_log_error(y_valid, pred)\nprint(score)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:14:59.150688Z","iopub.execute_input":"2026-07-24T08:14:59.15101Z","iopub.status.idle":"2026-07-24T08:15:00.359105Z","shell.execute_reply.started":"2026-07-24T08:14:59.150985Z","shell.execute_reply":"2026-07-24T08:15:00.358505Z"}},"outputs":[{"name":"stdout","text":"3.40358096757237\n","output_type":"stream"}],"execution_count":147},{"cell_type":"code","source":"features = [\n    \"dayofweek\",\n    \"is_holiday\",\n    \"month\",\n]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:15:00.362353Z","iopub.execute_input":"2026-07-24T08:15:00.362553Z","iopub.status.idle":"2026-07-24T08:15:00.366971Z","shell.execute_reply.started":"2026-07-24T08:15:00.362535Z","shell.execute_reply":"2026-07-24T08:15:00.365786Z"}},"outputs":[],"execution_count":148},{"cell_type":"code","source":"X_train = train_data[features]\nX_valid = valid_data[features]\n\nmodel.fit(X_train, y_train)\npred = model.predict(X_valid)\n\nscore = root_mean_squared_log_error(y_valid, pred)\nprint(score)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:15:00.3682Z","iopub.execute_input":"2026-07-24T08:15:00.36853Z","iopub.status.idle":"2026-07-24T08:15:00.914508Z","shell.execute_reply.started":"2026-07-24T08:15:00.368498Z","shell.execute_reply":"2026-07-24T08:15:00.913222Z"}},"outputs":[{"name":"stdout","text":"3.3432074440298147\n","output_type":"stream"}],"execution_count":149},{"cell_type":"code","source":"from lightgbm import LGBMRegressor","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:15:00.91561Z","iopub.execute_input":"2026-07-24T08:15:00.915942Z","iopub.status.idle":"2026-07-24T08:15:00.919679Z","shell.execute_reply.started":"2026-07-24T08:15:00.91591Z","shell.execute_reply":"2026-07-24T08:15:00.918895Z"}},"outputs":[],"execution_count":150},{"cell_type":"code","source":"model = LGBMRegressor(\n    n_estimators=800,\n    learning_rate=0.1,\n    random_state=42\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:15:00.920522Z","iopub.execute_input":"2026-07-24T08:15:00.920761Z","iopub.status.idle":"2026-07-24T08:15:00.93779Z","shell.execute_reply.started":"2026-07-24T08:15:00.920735Z","shell.execute_reply":"2026-07-24T08:15:00.936721Z"}},"outputs":[],"execution_count":151},{"cell_type":"code","source":"model.fit(X_train, y_train)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:15:00.938902Z","iopub.execute_input":"2026-07-24T08:15:00.939176Z","iopub.status.idle":"2026-07-24T08:15:29.085071Z","shell.execute_reply.started":"2026-07-24T08:15:00.93915Z","shell.execute_reply":"2026-07-24T08:15:29.084367Z"}},"outputs":[{"name":"stdout","text":"[LightGBM] [Info] Auto-choosing row-wise multi-threading, the overhead of testing was 0.025544 seconds.\nYou can set `force_row_wise=true` to remove the overhead.\nAnd if memory is not enough, you can set `force_col_wise=true`.\n[LightGBM] [Info] Total Bins 22\n[LightGBM] [Info] Number of data points in the train set: 2642706, number of used features: 3\n[LightGBM] [Info] Start training from score 339.994847\n","output_type":"stream"},{"execution_count":152,"output_type":"execute_result","data":{"text/plain":"LGBMRegressor(n_estimators=800, random_state=42)","text/html":"<style>#sk-container-id-3 {\n  /* Definition of color scheme common for light and dark mode */\n  --sklearn-color-text: #000;\n  --sklearn-color-text-muted: #666;\n  --sklearn-color-line: gray;\n  /* Definition of color scheme for unfitted estimators */\n  --sklearn-color-unfitted-level-0: #fff5e6;\n  --sklearn-color-unfitted-level-1: #f6e4d2;\n  --sklearn-color-unfitted-level-2: #ffe0b3;\n  --sklearn-color-unfitted-level-3: chocolate;\n  /* Definition of color scheme for fitted estimators */\n  --sklearn-color-fitted-level-0: #f0f8ff;\n  --sklearn-color-fitted-level-1: #d4ebff;\n  --sklearn-color-fitted-level-2: #b3dbfd;\n  --sklearn-color-fitted-level-3: cornflowerblue;\n\n  /* Specific color for light theme */\n  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n  --sklearn-color-icon: #696969;\n\n  @media (prefers-color-scheme: dark) {\n    /* Redefinition of color scheme for dark theme */\n    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n    --sklearn-color-icon: #878787;\n  }\n}\n\n#sk-container-id-3 {\n  color: var(--sklearn-color-text);\n}\n\n#sk-container-id-3 pre {\n  padding: 0;\n}\n\n#sk-container-id-3 input.sk-hidden--visually {\n  border: 0;\n  clip: rect(1px 1px 1px 1px);\n  clip: rect(1px, 1px, 1px, 1px);\n  height: 1px;\n  margin: -1px;\n  overflow: hidden;\n  padding: 0;\n  position: absolute;\n  width: 1px;\n}\n\n#sk-container-id-3 div.sk-dashed-wrapped {\n  border: 1px dashed var(--sklearn-color-line);\n  margin: 0 0.4em 0.5em 0.4em;\n  box-sizing: border-box;\n  padding-bottom: 0.4em;\n  background-color: var(--sklearn-color-background);\n}\n\n#sk-container-id-3 div.sk-container {\n  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n     but bootstrap.min.css set `[hidden] { display: none !important; }`\n     so we also need the `!important` here to be able to override the\n     default hidden behavior on the sphinx rendered scikit-learn.org.\n     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n  display: inline-block !important;\n  position: relative;\n}\n\n#sk-container-id-3 div.sk-text-repr-fallback {\n  display: none;\n}\n\ndiv.sk-parallel-item,\ndiv.sk-serial,\ndiv.sk-item {\n  /* draw centered vertical line to link estimators */\n  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n  background-size: 2px 100%;\n  background-repeat: no-repeat;\n  background-position: center center;\n}\n\n/* Parallel-specific style estimator block */\n\n#sk-container-id-3 div.sk-parallel-item::after {\n  content: \"\";\n  width: 100%;\n  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n  flex-grow: 1;\n}\n\n#sk-container-id-3 div.sk-parallel {\n  display: flex;\n  align-items: stretch;\n  justify-content: center;\n  background-color: var(--sklearn-color-background);\n  position: relative;\n}\n\n#sk-container-id-3 div.sk-parallel-item {\n  display: flex;\n  flex-direction: column;\n}\n\n#sk-container-id-3 div.sk-parallel-item:first-child::after {\n  align-self: flex-end;\n  width: 50%;\n}\n\n#sk-container-id-3 div.sk-parallel-item:last-child::after {\n  align-self: flex-start;\n  width: 50%;\n}\n\n#sk-container-id-3 div.sk-parallel-item:only-child::after {\n  width: 0;\n}\n\n/* Serial-specific style estimator block */\n\n#sk-container-id-3 div.sk-serial {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  background-color: var(--sklearn-color-background);\n  padding-right: 1em;\n  padding-left: 1em;\n}\n\n\n/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\nclickable and can be expanded/collapsed.\n- Pipeline and ColumnTransformer use this feature and define the default style\n- Estimators will overwrite some part of the style using the `sk-estimator` class\n*/\n\n/* Pipeline and ColumnTransformer style (default) */\n\n#sk-container-id-3 div.sk-toggleable {\n  /* Default theme specific background. It is overwritten whether we have a\n  specific estimator or a Pipeline/ColumnTransformer */\n  background-color: var(--sklearn-color-background);\n}\n\n/* Toggleable label */\n#sk-container-id-3 label.sk-toggleable__label {\n  cursor: pointer;\n  display: flex;\n  width: 100%;\n  margin-bottom: 0;\n  padding: 0.5em;\n  box-sizing: border-box;\n  text-align: center;\n  align-items: start;\n  justify-content: space-between;\n  gap: 0.5em;\n}\n\n#sk-container-id-3 label.sk-toggleable__label .caption {\n  font-size: 0.6rem;\n  font-weight: lighter;\n  color: var(--sklearn-color-text-muted);\n}\n\n#sk-container-id-3 label.sk-toggleable__label-arrow:before {\n  /* Arrow on the left of the label */\n  content: \"▸\";\n  float: left;\n  margin-right: 0.25em;\n  color: var(--sklearn-color-icon);\n}\n\n#sk-container-id-3 label.sk-toggleable__label-arrow:hover:before {\n  color: var(--sklearn-color-text);\n}\n\n/* Toggleable content - dropdown */\n\n#sk-container-id-3 div.sk-toggleable__content {\n  max-height: 0;\n  max-width: 0;\n  overflow: hidden;\n  text-align: left;\n  /* unfitted */\n  background-color: var(--sklearn-color-unfitted-level-0);\n}\n\n#sk-container-id-3 div.sk-toggleable__content.fitted {\n  /* fitted */\n  background-color: var(--sklearn-color-fitted-level-0);\n}\n\n#sk-container-id-3 div.sk-toggleable__content pre {\n  margin: 0.2em;\n  border-radius: 0.25em;\n  color: var(--sklearn-color-text);\n  /* unfitted */\n  background-color: var(--sklearn-color-unfitted-level-0);\n}\n\n#sk-container-id-3 div.sk-toggleable__content.fitted pre {\n  /* unfitted */\n  background-color: var(--sklearn-color-fitted-level-0);\n}\n\n#sk-container-id-3 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n  /* Expand drop-down */\n  max-height: 200px;\n  max-width: 100%;\n  overflow: auto;\n}\n\n#sk-container-id-3 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n  content: \"▾\";\n}\n\n/* Pipeline/ColumnTransformer-specific style */\n\n#sk-container-id-3 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n  color: var(--sklearn-color-text);\n  background-color: var(--sklearn-color-unfitted-level-2);\n}\n\n#sk-container-id-3 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n  background-color: var(--sklearn-color-fitted-level-2);\n}\n\n/* Estimator-specific style */\n\n/* Colorize estimator box */\n#sk-container-id-3 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n  /* unfitted */\n  background-color: var(--sklearn-color-unfitted-level-2);\n}\n\n#sk-container-id-3 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n  /* fitted */\n  background-color: var(--sklearn-color-fitted-level-2);\n}\n\n#sk-container-id-3 div.sk-label label.sk-toggleable__label,\n#sk-container-id-3 div.sk-label label {\n  /* The background is the default theme color */\n  color: var(--sklearn-color-text-on-default-background);\n}\n\n/* On hover, darken the color of the background */\n#sk-container-id-3 div.sk-label:hover label.sk-toggleable__label {\n  color: var(--sklearn-color-text);\n  background-color: var(--sklearn-color-unfitted-level-2);\n}\n\n/* Label box, darken color on hover, fitted */\n#sk-container-id-3 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n  color: var(--sklearn-color-text);\n  background-color: var(--sklearn-color-fitted-level-2);\n}\n\n/* Estimator label */\n\n#sk-container-id-3 div.sk-label label {\n  font-family: monospace;\n  font-weight: bold;\n  display: inline-block;\n  line-height: 1.2em;\n}\n\n#sk-container-id-3 div.sk-label-container {\n  text-align: center;\n}\n\n/* Estimator-specific */\n#sk-container-id-3 div.sk-estimator {\n  font-family: monospace;\n  border: 1px dotted var(--sklearn-color-border-box);\n  border-radius: 0.25em;\n  box-sizing: border-box;\n  margin-bottom: 0.5em;\n  /* unfitted */\n  background-color: var(--sklearn-color-unfitted-level-0);\n}\n\n#sk-container-id-3 div.sk-estimator.fitted {\n  /* fitted */\n  background-color: var(--sklearn-color-fitted-level-0);\n}\n\n/* on hover */\n#sk-container-id-3 div.sk-estimator:hover {\n  /* unfitted */\n  background-color: var(--sklearn-color-unfitted-level-2);\n}\n\n#sk-container-id-3 div.sk-estimator.fitted:hover {\n  /* fitted */\n  background-color: var(--sklearn-color-fitted-level-2);\n}\n\n/* Specification for estimator info (e.g. \"i\" and \"?\") */\n\n/* Common style for \"i\" and \"?\" */\n\n.sk-estimator-doc-link,\na:link.sk-estimator-doc-link,\na:visited.sk-estimator-doc-link {\n  float: right;\n  font-size: smaller;\n  line-height: 1em;\n  font-family: monospace;\n  background-color: var(--sklearn-color-background);\n  border-radius: 1em;\n  height: 1em;\n  width: 1em;\n  text-decoration: none !important;\n  margin-left: 0.5em;\n  text-align: center;\n  /* unfitted */\n  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n  color: var(--sklearn-color-unfitted-level-1);\n}\n\n.sk-estimator-doc-link.fitted,\na:link.sk-estimator-doc-link.fitted,\na:visited.sk-estimator-doc-link.fitted {\n  /* fitted */\n  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n  color: var(--sklearn-color-fitted-level-1);\n}\n\n/* On hover */\ndiv.sk-estimator:hover .sk-estimator-doc-link:hover,\n.sk-estimator-doc-link:hover,\ndiv.sk-label-container:hover .sk-estimator-doc-link:hover,\n.sk-estimator-doc-link:hover {\n  /* unfitted */\n  background-color: var(--sklearn-color-unfitted-level-3);\n  color: var(--sklearn-color-background);\n  text-decoration: none;\n}\n\ndiv.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n.sk-estimator-doc-link.fitted:hover,\ndiv.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n.sk-estimator-doc-link.fitted:hover {\n  /* fitted */\n  background-color: var(--sklearn-color-fitted-level-3);\n  color: var(--sklearn-color-background);\n  text-decoration: none;\n}\n\n/* Span, style for the box shown on hovering the info icon */\n.sk-estimator-doc-link span {\n  display: none;\n  z-index: 9999;\n  position: relative;\n  font-weight: normal;\n  right: .2ex;\n  padding: .5ex;\n  margin: .5ex;\n  width: min-content;\n  min-width: 20ex;\n  max-width: 50ex;\n  color: var(--sklearn-color-text);\n  box-shadow: 2pt 2pt 4pt #999;\n  /* unfitted */\n  background: var(--sklearn-color-unfitted-level-0);\n  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n}\n\n.sk-estimator-doc-link.fitted span {\n  /* fitted */\n  background: var(--sklearn-color-fitted-level-0);\n  border: var(--sklearn-color-fitted-level-3);\n}\n\n.sk-estimator-doc-link:hover span {\n  display: block;\n}\n\n/* \"?\"-specific style due to the `<a>` HTML tag */\n\n#sk-container-id-3 a.estimator_doc_link {\n  float: right;\n  font-size: 1rem;\n  line-height: 1em;\n  font-family: monospace;\n  background-color: var(--sklearn-color-background);\n  border-radius: 1rem;\n  height: 1rem;\n  width: 1rem;\n  text-decoration: none;\n  /* unfitted */\n  color: var(--sklearn-color-unfitted-level-1);\n  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n}\n\n#sk-container-id-3 a.estimator_doc_link.fitted {\n  /* fitted */\n  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n  color: var(--sklearn-color-fitted-level-1);\n}\n\n/* On hover */\n#sk-container-id-3 a.estimator_doc_link:hover {\n  /* unfitted */\n  background-color: var(--sklearn-color-unfitted-level-3);\n  color: var(--sklearn-color-background);\n  text-decoration: none;\n}\n\n#sk-container-id-3 a.estimator_doc_link.fitted:hover {\n  /* fitted */\n  background-color: var(--sklearn-color-fitted-level-3);\n}\n</style><div id=\"sk-container-id-3\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>LGBMRegressor(n_estimators=800, random_state=42)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-3\" type=\"checkbox\" checked><label for=\"sk-estimator-id-3\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>LGBMRegressor</div></div><div><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></div></label><div class=\"sk-toggleable__content fitted\"><pre>LGBMRegressor(n_estimators=800, random_state=42)</pre></div> </div></div></div></div>"},"metadata":{}}],"execution_count":152},{"cell_type":"code","source":"pred = model.predict(X_valid)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:15:29.085787Z","iopub.execute_input":"2026-07-24T08:15:29.086024Z","iopub.status.idle":"2026-07-24T08:15:33.830545Z","shell.execute_reply.started":"2026-07-24T08:15:29.086001Z","shell.execute_reply":"2026-07-24T08:15:33.829843Z"}},"outputs":[],"execution_count":153},{"cell_type":"code","source":"import numpy as np\n\npred = np.maximum(pred, 0)\n\nscore = root_mean_squared_log_error(y_valid, pred)\nprint(score)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-24T08:15:33.831348Z","iopub.execute_input":"2026-07-24T08:15:33.831546Z","iopub.status.idle":"2026-07-24T08:15:33.848294Z","shell.execute_reply.started":"2026-07-24T08:15:33.831528Z","shell.execute_reply":"2026-07-24T08:15:33.847547Z"}},"outputs":[{"name":"stdout","text":"3.335212729922964\n","output_type":"stream"}],"execution_count":154}]}