{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":7391,"databundleVersionId":44328,"sourceType":"competition"},{"sourceId":14197283,"sourceType":"datasetVersion","datasetId":9053752},{"sourceId":14197359,"sourceType":"datasetVersion","datasetId":9053811},{"sourceId":14198076,"sourceType":"datasetVersion","datasetId":9054401}],"dockerImageVersionId":31193,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))","metadata":{"_uuid":"59df9e2a-e2ff-4fcc-ab94-9765225388c0","_cell_guid":"113a7de5-d572-4056-abfc-62aacddafeb7","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2025-12-17T19:20:30.102666Z","iopub.execute_input":"2025-12-17T19:20:30.103248Z","iopub.status.idle":"2025-12-17T19:20:30.130637Z","shell.execute_reply.started":"2025-12-17T19:20:30.103217Z","shell.execute_reply":"2025-12-17T19:20:30.129897Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install py7zr","metadata":{"_uuid":"a4dc8d02-1df6-449f-a186-1bd16eb18402","_cell_guid":"197c381e-d69a-4d30-b7c9-5cf6a47b4f4f","trusted":true,"collapsed":false,"_kg_hide-output":true,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2025-12-17T19:20:30.459605Z","iopub.execute_input":"2025-12-17T19:20:30.459855Z","iopub.status.idle":"2025-12-17T19:20:37.727185Z","shell.execute_reply.started":"2025-12-17T19:20:30.459833Z","shell.execute_reply":"2025-12-17T19:20:37.726435Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport numpy as np \nimport pandas as pd\nimport py7zr\nfrom subprocess import check_output\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom statsmodels.tsa.seasonal import seasonal_decompose","metadata":{"_uuid":"e3e4ea46-6fa5-47ff-8c00-366176167e58","_cell_guid":"46874f06-08e1-46ec-b65b-d0d28d9d50f8","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:20:37.728656Z","iopub.execute_input":"2025-12-17T19:20:37.728907Z","iopub.status.idle":"2025-12-17T19:20:38.053826Z","shell.execute_reply.started":"2025-12-17T19:20:37.728883Z","shell.execute_reply":"2025-12-17T19:20:38.053256Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Load Data","metadata":{"_uuid":"089a0f0e-ca04-4d34-b216-4fb2a21f67b5","_cell_guid":"9c7938c1-8d54-4060-8525-a5d25181031f","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"for dirname, _, filenames in os.walk('/kaggle/input/favorita-grocery-sales-forecasting'):\n    for filename in filenames:\n        archive = py7zr.SevenZipFile(os.path.join(dirname, filename), mode='r')\n        archive.extractall(path=\"/kaggle/working\")\n        archive.close()\n\nprint(check_output([\"ls\", \"../working\"]).decode(\"utf8\"))","metadata":{"_uuid":"c95b5c09-c835-4630-8610-eb2c78a97440","_cell_guid":"2334c288-75a4-467b-a59f-0e16cbfc8804","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:20:38.054530Z","iopub.execute_input":"2025-12-17T19:20:38.054916Z","iopub.status.idle":"2025-12-17T19:21:49.380569Z","shell.execute_reply.started":"2025-12-17T19:20:38.054891Z","shell.execute_reply":"2025-12-17T19:21:49.379803Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"items = pd.read_csv(\"../working/items.csv\")\nholiday_events = pd.read_csv(\"../working/holidays_events.csv\", parse_dates=['date'])\nstores = pd.read_csv(\"../working/stores.csv\")\noil = pd.read_csv(\"../working/oil.csv\", parse_dates=['date'])\ntransactions = pd.read_csv(\"../working/transactions.csv\", parse_dates=['date'])\ntrain = pd.read_csv('../working/train.csv', parse_dates = ['date'])\ntest = pd.read_csv('../working/test.csv', parse_dates = ['date'])","metadata":{"_uuid":"0bea6c91-1aa0-47f0-a537-3c8c1f1ca505","_cell_guid":"47220817-1a5b-4a97-9412-e80355cf8617","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:21:49.382453Z","iopub.execute_input":"2025-12-17T19:21:49.382934Z","iopub.status.idle":"2025-12-17T19:23:05.627146Z","shell.execute_reply.started":"2025-12-17T19:21:49.382914Z","shell.execute_reply":"2025-12-17T19:23:05.626480Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Data preprocessing + EDA","metadata":{"_uuid":"c8f923a7-6fa0-4eb8-9e2c-03933511b988","_cell_guid":"61172509-1b95-4667-93f7-fde66bf7b05f","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"print(f\"Train: {train.shape}\")\nprint(f\"Items: {items.shape}\")\nprint(f\"Stores: {stores.shape}\")\nprint(f\"Oil: {oil.shape}\")\nprint(f\"Holidays: {holiday_events.shape}\")\nprint(f\"Transactions: {transactions.shape}\")","metadata":{"_uuid":"77ec0224-3c56-4b7e-8f76-6e5caab1cecc","_cell_guid":"3aa229f7-7ac4-4fde-a701-24e83f69b85f","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:23:05.627952Z","iopub.execute_input":"2025-12-17T19:23:05.628243Z","iopub.status.idle":"2025-12-17T19:23:05.633418Z","shell.execute_reply.started":"2025-12-17T19:23:05.628217Z","shell.execute_reply":"2025-12-17T19:23:05.632617Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(f\"Train: {train.info()}\")\nprint(f\"Items: {items.info()}\")\nprint(f\"Stores: {stores.info()}\")\nprint(f\"Oil: {oil.info()}\")\nprint(f\"Holidays: {holiday_events.info()}\")\nprint(f\"Transactions: {transactions.info()}\")","metadata":{"_uuid":"0c2a3d05-d0c6-4ac2-a442-77fc7ec28fbf","_cell_guid":"cc3f2531-dab1-4f9a-8c2a-814fe6cdff4d","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:23:05.634186Z","iopub.execute_input":"2025-12-17T19:23:05.634982Z","iopub.status.idle":"2025-12-17T19:23:05.692054Z","shell.execute_reply.started":"2025-12-17T19:23:05.634966Z","shell.execute_reply":"2025-12-17T19:23:05.691291Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### 1. Train","metadata":{"_uuid":"f6adfe34-a2a5-4391-80cb-81f7f1e3f989","_cell_guid":"01597959-ff5a-487f-a05e-4b54f5425c20","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"train.head()","metadata":{"_uuid":"0d5793ce-fec1-4801-a915-703cc8ba334d","_cell_guid":"e017c93f-8de9-4c46-a0c2-c2a67bc1ad87","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:23:05.693036Z","iopub.execute_input":"2025-12-17T19:23:05.693426Z","iopub.status.idle":"2025-12-17T19:23:05.713424Z","shell.execute_reply.started":"2025-12-17T19:23:05.693402Z","shell.execute_reply":"2025-12-17T19:23:05.712811Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.isnull().sum()","metadata":{"_uuid":"ad4ba82d-4579-4588-b227-ffa965cfd624","_cell_guid":"4c080f13-f535-48cd-a90a-84a4e9561308","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:23:05.714163Z","iopub.execute_input":"2025-12-17T19:23:05.714681Z","iopub.status.idle":"2025-12-17T19:23:11.908078Z","shell.execute_reply.started":"2025-12-17T19:23:05.714664Z","shell.execute_reply":"2025-12-17T19:23:11.907181Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train['onpromotion'] = train['onpromotion'].fillna(False)\ntrain['onpromotion'] = train['onpromotion'].astype(bool).astype(int)\n\ntrain.isnull().sum()","metadata":{"_uuid":"b0e3a7d2-e22d-4ed7-9d49-f224c96f116a","_cell_guid":"8e29bcb3-6da2-4919-98d7-d86de88702eb","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:23:11.909164Z","iopub.execute_input":"2025-12-17T19:23:11.910126Z","iopub.status.idle":"2025-12-17T19:23:24.632541Z","shell.execute_reply.started":"2025-12-17T19:23:11.910094Z","shell.execute_reply":"2025-12-17T19:23:24.631912Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.tail()","metadata":{"_uuid":"db6d330c-63c4-4124-866f-0c3f34fa7b7e","_cell_guid":"15e3167b-0423-4b3f-a87e-53e8cb04c9fe","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:23:24.635066Z","iopub.execute_input":"2025-12-17T19:23:24.635716Z","iopub.status.idle":"2025-12-17T19:23:24.643880Z","shell.execute_reply.started":"2025-12-17T19:23:24.635696Z","shell.execute_reply":"2025-12-17T19:23:24.643191Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.duplicated().sum()","metadata":{"_uuid":"b01de30f-4199-478a-b803-4f751b5c15b1","_cell_guid":"8e5853db-296a-45b9-be42-a9830c095731","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:23:24.644823Z","iopub.execute_input":"2025-12-17T19:23:24.645558Z","iopub.status.idle":"2025-12-17T19:24:18.398534Z","shell.execute_reply.started":"2025-12-17T19:23:24.645531Z","shell.execute_reply":"2025-12-17T19:24:18.397894Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"TOP_STORES = [44, 47, 45, 46, 3, 48, 8, 49, 50, 11]\nYEARS = [2016, 2017]\nOUTPUT_PATH = \"/kaggle/working/\"\n# Filter years & stores\ntrain = train[\n    (train[\"date\"].dt.year.isin(YEARS)) &\n    (train[\"store_nbr\"].isin(TOP_STORES))\n]\n\nprint(\"Sales shape:\", train.shape)\n\ntrain.to_csv(OUTPUT_PATH + \"dashboard_sales.csv\", index=False)","metadata":{"_uuid":"7ef27447-17c2-48da-8adf-26f0fb7b435d","_cell_guid":"89f6a640-772b-4b18-b08e-bec327b0a88f","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:24:18.399246Z","iopub.execute_input":"2025-12-17T19:24:18.399430Z","iopub.status.idle":"2025-12-17T19:25:03.355470Z","shell.execute_reply.started":"2025-12-17T19:24:18.399415Z","shell.execute_reply":"2025-12-17T19:25:03.354803Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Aggregate unit sales by date\ndaily_sales = train.groupby(\"date\")[\"unit_sales\"].sum().reset_index()\n\n# Plot line graph\nplt.figure(figsize=(12, 6))\nplt.plot(daily_sales[\"date\"], daily_sales[\"unit_sales\"], label=\"Total Daily Sales\", color=\"blue\")\n\n# Formatting\nplt.xlabel(\"Date\")\nplt.ylabel(\"Total Sales\")\nplt.title(\"Daily Sales Over Time\")\nplt.xticks(rotation=45)\nplt.legend()\nplt.grid(True, linestyle=\"--\", alpha=0.7)\n\nplt.show()","metadata":{"_uuid":"45d1aacc-f6b5-4659-85f9-eca79bead3db","_cell_guid":"5408a037-1ff4-4c3a-a6e9-3e8e3fb22127","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:25:03.356286Z","iopub.execute_input":"2025-12-17T19:25:03.356491Z","iopub.status.idle":"2025-12-17T19:25:04.058130Z","shell.execute_reply.started":"2025-12-17T19:25:03.356472Z","shell.execute_reply":"2025-12-17T19:25:04.057428Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"daily_sales = train.groupby('date')['unit_sales'].sum().reset_index()\ndaily_sales['rolling_avg'] = daily_sales['unit_sales'].rolling(window=30).mean()\n\n# Plot the trend\nimport matplotlib.pyplot as plt\n\nplt.figure(figsize=(12, 6))\nplt.plot(daily_sales['date'], daily_sales['unit_sales'], label='Daily Sales', alpha=0.5)\nplt.plot(daily_sales['date'], daily_sales['rolling_avg'], label='30-Day Rolling Avg', color='red')\nplt.title('Sales Trend Over Time')\nplt.xlabel('Date')\nplt.ylabel('Sales')\nplt.legend()\nplt.show()","metadata":{"_uuid":"a21a086e-c025-4ba0-a4d9-4675616c2950","_cell_guid":"31c771d2-f164-4622-b798-8e17f7177247","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:25:04.059016Z","iopub.execute_input":"2025-12-17T19:25:04.059276Z","iopub.status.idle":"2025-12-17T19:25:04.633988Z","shell.execute_reply.started":"2025-12-17T19:25:04.059259Z","shell.execute_reply":"2025-12-17T19:25:04.633167Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Filter only 2017 data\ndaily_sales_2017 = daily_sales[daily_sales[\"date\"].dt.year == 2017].copy()\n\n# Set index for decomposition\ndaily_sales_2017 = daily_sales_2017.set_index(\"date\")\n\n# Decompose the time series — weekly seasonality\ndecomposition = seasonal_decompose(\n    daily_sales_2017[\"unit_sales\"],\n    model=\"additive\",\n    period=7\n)\n\nplt.figure(figsize=(50, 8))\ndecomposition.plot()\nplt.show()","metadata":{"_uuid":"cb2eb465-cd2a-4d70-b0cf-e6953398fc2d","_cell_guid":"d00f2e4f-dd9e-4800-87b2-0658bf2dc127","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:25:04.634694Z","iopub.execute_input":"2025-12-17T19:25:04.634952Z","iopub.status.idle":"2025-12-17T19:25:05.464915Z","shell.execute_reply.started":"2025-12-17T19:25:04.634933Z","shell.execute_reply":"2025-12-17T19:25:05.464070Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"* **Trend**: Overall sales start high in January, dip early in the year, and rise again during the year (2017-05) before slightly declining.\n\n* **Seasonality**: Strong weekly pattern where sales consistently rise and fall on the same days each week.\n\n* **Residual**: Irregular spikes and drops caused by factors like holidays, promotions, or unexpected events.","metadata":{"_uuid":"734dc2ae-bc9e-449f-88cc-8d327d05c1ed","_cell_guid":"23ffb5ab-aa9f-4c95-abcf-04a26939dfd5","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"markdown","source":"### 2. Oil","metadata":{"_uuid":"c307c091-6d07-49dd-a4fb-b50677a514a0","_cell_guid":"6e9fd6c8-5bfb-4fa5-89bc-ba1492661b66","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"oil.head()","metadata":{"_uuid":"64a4d812-74ff-43ce-b6c8-d016b299cd7d","_cell_guid":"964ec55b-b250-4e3f-a936-5ac3e071b0c0","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:25:05.465824Z","iopub.execute_input":"2025-12-17T19:25:05.466196Z","iopub.status.idle":"2025-12-17T19:25:05.477836Z","shell.execute_reply.started":"2025-12-17T19:25:05.466170Z","shell.execute_reply":"2025-12-17T19:25:05.477110Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"oil.isnull().sum()","metadata":{"_uuid":"d9ee6ae0-9e1c-4ae7-9ca3-b210af3757ec","_cell_guid":"f3081682-ee1b-4688-b1ee-731c507c5eb9","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:25:05.478707Z","iopub.execute_input":"2025-12-17T19:25:05.478969Z","iopub.status.idle":"2025-12-17T19:25:05.489299Z","shell.execute_reply.started":"2025-12-17T19:25:05.478948Z","shell.execute_reply":"2025-12-17T19:25:05.488646Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"oil['dcoilwtico'] = oil['dcoilwtico'].interpolate()\noil['dcoilwtico'] = oil['dcoilwtico'].fillna(method='bfill')\n\noil.isnull().sum()","metadata":{"_uuid":"d94f6bb8-1b40-4712-8d0a-38604fe0d44e","_cell_guid":"be533333-0369-4992-a594-4bc0f6b23102","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:25:05.489945Z","iopub.execute_input":"2025-12-17T19:25:05.490099Z","iopub.status.idle":"2025-12-17T19:25:05.513012Z","shell.execute_reply.started":"2025-12-17T19:25:05.490087Z","shell.execute_reply":"2025-12-17T19:25:05.512256Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"oil = oil[oil[\"date\"].dt.year.isin(YEARS)]\noil.to_csv(\n    OUTPUT_PATH + \"dashboard_oil.csv\",\n    index=False\n)","metadata":{"_uuid":"cfd7bd4c-7a64-4de8-9ac8-dc9cad327ea7","_cell_guid":"b72e23a8-91cb-430a-8a7d-41a9e2155179","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:25:05.513856Z","iopub.execute_input":"2025-12-17T19:25:05.514298Z","iopub.status.idle":"2025-12-17T19:25:05.520700Z","shell.execute_reply.started":"2025-12-17T19:25:05.514282Z","shell.execute_reply":"2025-12-17T19:25:05.520083Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Aggregate daily sales\nsales_oil = train.groupby(\"date\")[\"unit_sales\"].sum().reset_index()  \nsales_oil = sales_oil.merge(oil, on=\"date\", how=\"left\") \n\nplt.figure(figsize=(14, 6))\n\n# Plot Sales\nplt.plot(sales_oil[\"date\"], sales_oil[\"unit_sales\"], label=\"Total Unit Sales\", color=\"blue\", alpha=0.6)\n\n# Plot Oil Prices on a second y-axis\nplt.twinx()\nplt.plot(sales_oil[\"date\"], sales_oil[\"dcoilwtico\"], label=\"Oil Prices\", color=\"red\", alpha=0.6)\n\nplt.title(\"Daily Sales vs Oil Prices\")\nplt.xlabel(\"Date\")\nplt.legend([\"Unit Sales\", \"Oil Prices\"])\nplt.show()","metadata":{"_uuid":"8ed6c86a-9fb7-4f7a-bf70-05920349a89b","_cell_guid":"35cc1eae-2632-4963-abee-5c31c33d09cd","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:25:05.521465Z","iopub.execute_input":"2025-12-17T19:25:05.521754Z","iopub.status.idle":"2025-12-17T19:25:06.160926Z","shell.execute_reply.started":"2025-12-17T19:25:05.521733Z","shell.execute_reply":"2025-12-17T19:25:06.160202Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"correlation = sales_oil[\"unit_sales\"].corr(sales_oil[\"dcoilwtico\"])\nprint(f\"Correlation between oil price and sales: {correlation:.4f}\")","metadata":{"_uuid":"4ff1bd1c-4cde-4b42-878f-259a774c6caf","_cell_guid":"bfb82212-bd8e-45b7-950f-1f4d34eede62","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:25:06.161731Z","iopub.execute_input":"2025-12-17T19:25:06.162066Z","iopub.status.idle":"2025-12-17T19:25:06.176078Z","shell.execute_reply.started":"2025-12-17T19:25:06.162042Z","shell.execute_reply":"2025-12-17T19:25:06.175200Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Create lag features for oil prices\nsales_oil[\"oil_lag_7\"] = sales_oil[\"dcoilwtico\"].shift(7)  # Lag by 7 days\nsales_oil[\"oil_lag_3\"] = sales_oil[\"dcoilwtico\"].shift(3)  # Lag by 3 days\n\n# Compute correlation with lagged values\ncorrelation_lag_7 = sales_oil[\"unit_sales\"].corr(sales_oil[\"oil_lag_7\"])\ncorrelation_lag_3 = sales_oil[\"unit_sales\"].corr(sales_oil[\"oil_lag_3\"])\n\nprint(f\"Correlation with 7-day lag: {correlation_lag_7:.4f}\")\nprint(f\"Correlation with 3-day lag: {correlation_lag_3:.4f}\")","metadata":{"_uuid":"4749b863-83e7-427c-90e8-f477bf29a85e","_cell_guid":"8754e0c9-5174-43b6-acac-b9d577319736","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:25:06.177114Z","iopub.execute_input":"2025-12-17T19:25:06.177491Z","iopub.status.idle":"2025-12-17T19:25:06.185970Z","shell.execute_reply.started":"2025-12-17T19:25:06.177466Z","shell.execute_reply":"2025-12-17T19:25:06.185039Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### 3. Holiday","metadata":{"_uuid":"92d12214-d541-4db1-b87a-da1ef617ec3d","_cell_guid":"cf51c6da-6b94-4df5-8c6e-813ba6710a4e","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"holiday_events.tail()","metadata":{"_uuid":"7a0a84e8-34a0-48bc-8cbb-5d4bfc70b915","_cell_guid":"8d52e285-f7dc-4270-be3c-10627c818b23","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:25:06.187077Z","iopub.execute_input":"2025-12-17T19:25:06.187394Z","iopub.status.idle":"2025-12-17T19:25:06.210484Z","shell.execute_reply.started":"2025-12-17T19:25:06.187368Z","shell.execute_reply":"2025-12-17T19:25:06.209831Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"holiday_events.isnull().sum()","metadata":{"_uuid":"fec88edc-a454-4fdc-b08e-faf07afe65bf","_cell_guid":"b1846dc8-e3ac-40d6-9558-da80c30bd9cf","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:25:06.211223Z","iopub.execute_input":"2025-12-17T19:25:06.211525Z","iopub.status.idle":"2025-12-17T19:25:06.226375Z","shell.execute_reply.started":"2025-12-17T19:25:06.211503Z","shell.execute_reply":"2025-12-17T19:25:06.225512Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"holiday_events = holiday_events[\n    (holiday_events[\"date\"].dt.year.isin(YEARS)) &\n    (holiday_events[\"transferred\"] == False)\n]\nholiday_events.to_csv(\n    OUTPUT_PATH + \"dashboard_holidays.csv\",\n    index=False\n)","metadata":{"_uuid":"1769c1ad-8d57-468d-bd69-417e2e4d82b4","_cell_guid":"3afafa8a-d17d-4508-8d3b-2716553f5a3f","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:25:06.227230Z","iopub.execute_input":"2025-12-17T19:25:06.227557Z","iopub.status.idle":"2025-12-17T19:25:06.243146Z","shell.execute_reply.started":"2025-12-17T19:25:06.227531Z","shell.execute_reply":"2025-12-17T19:25:06.242391Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"holiday_events['type'].value_counts()","metadata":{"_uuid":"3720ad40-8221-4a01-89c9-0b7bdd16a810","_cell_guid":"669cd46d-348f-4d40-bdf7-893d5a40a310","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:25:06.243873Z","iopub.execute_input":"2025-12-17T19:25:06.244161Z","iopub.status.idle":"2025-12-17T19:25:06.250703Z","shell.execute_reply.started":"2025-12-17T19:25:06.244121Z","shell.execute_reply":"2025-12-17T19:25:06.250171Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"holiday_events['description'].value_counts()","metadata":{"_uuid":"5d958095-0602-4223-b2c3-41387b3a98fa","_cell_guid":"c2bb87ad-8825-4a2b-b10f-7f27f55d5df4","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:25:06.251312Z","iopub.execute_input":"2025-12-17T19:25:06.251474Z","iopub.status.idle":"2025-12-17T19:25:06.267833Z","shell.execute_reply.started":"2025-12-17T19:25:06.251460Z","shell.execute_reply":"2025-12-17T19:25:06.267306Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sns.set_theme(style=\"whitegrid\")\ncolName=\"type\"\nval = holiday_events[colName].value_counts().sort_values(ascending=False)\nf, axs = plt.subplots(1, 1, figsize=(10, 5))\nax = sns.countplot(holiday_events, x=colName # or y\n                   , palette=\"pastel\"\n                   , order=val.index\n                   ,ax=axs\n                   )\n\nsumm = val.sum()\n\ntitle = val.index\nlbls = [f'{p[0] * 100 / summ:.1f}%' for p in zip(val)]\n\n\n# hor label\nfor p, label in zip(ax.patches, lbls):\n    ax.annotate(label, (p.get_x(), p.get_height() + 0.15))\n    \nplt.title(\"holiday distribution\",\n          fontsize = 20)    \n\nplt.tight_layout()\nplt.show()","metadata":{"_uuid":"9527b301-180f-4285-b3d1-61ab281bca2a","_cell_guid":"7d9cb97a-7d13-46e1-8145-8a4b502d62ad","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:25:06.271294Z","iopub.execute_input":"2025-12-17T19:25:06.271488Z","iopub.status.idle":"2025-12-17T19:25:06.514533Z","shell.execute_reply.started":"2025-12-17T19:25:06.271473Z","shell.execute_reply":"2025-12-17T19:25:06.513913Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Ensure date column is datetime\nholiday_events['date'] = pd.to_datetime(holiday_events['date'])\n\n# Keep only relevant holiday types\n# Exclude transferred days (these are not actually celebrated on this day)\nholidays_actual = holiday_events[\n    (holiday_events['type'].isin(['Holiday', 'Additional', 'Bridge'])) & \n    (holiday_events['transferred'] == False)\n].copy()\n\n# simplify description\nholidays_actual['holiday_flag'] = 1","metadata":{"_uuid":"fec58f3a-5557-4984-a523-ef208de5bfdd","_cell_guid":"988ab5ce-084e-4b14-ad86-a2b876f9c19a","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:25:06.515217Z","iopub.execute_input":"2025-12-17T19:25:06.515475Z","iopub.status.idle":"2025-12-17T19:25:06.524809Z","shell.execute_reply.started":"2025-12-17T19:25:06.515458Z","shell.execute_reply":"2025-12-17T19:25:06.524169Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"holidays_actual.head()","metadata":{"_uuid":"91d01017-ba65-470e-b2f7-7872e2c682fd","_cell_guid":"bc98149f-2506-45d0-96f9-18a392899f89","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:25:06.525637Z","iopub.execute_input":"2025-12-17T19:25:06.526063Z","iopub.status.idle":"2025-12-17T19:25:06.546723Z","shell.execute_reply.started":"2025-12-17T19:25:06.526039Z","shell.execute_reply":"2025-12-17T19:25:06.546173Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Aggregate total unit sales per day\ndaily_sales = train.groupby('date')['unit_sales'].sum().reset_index()\n\ndaily_sales = daily_sales.merge(\n    holidays_actual[['date', 'holiday_flag']],\n    on='date',\n    how='left'\n)\n\n# Fill NaN (non-holiday) with 0\ndaily_sales['holiday_flag'].fillna(0, inplace=True)","metadata":{"_uuid":"bbd311f4-cf43-4579-bb05-de749e458b33","_cell_guid":"be35bf52-6f2c-4fb9-90e9-f02882a5289a","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:25:06.547572Z","iopub.execute_input":"2025-12-17T19:25:06.547820Z","iopub.status.idle":"2025-12-17T19:25:06.864342Z","shell.execute_reply.started":"2025-12-17T19:25:06.547799Z","shell.execute_reply":"2025-12-17T19:25:06.863465Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"daily_sales['holiday_label'] = daily_sales['holiday_flag'].map({1: 'Holiday', 0: 'Non-Holiday'})\navg_sales = daily_sales.groupby('holiday_label')['unit_sales'].mean().reset_index()\n\nplt.figure(figsize=(6,4))\nsns.barplot(x='holiday_label', y='unit_sales', data=avg_sales, palette=['skyblue','lightgreen'])\nplt.title(\"Average Daily Sales: Holidays vs Non-Holidays (All Stores, All Years)\")\nplt.ylabel(\"Average Unit Sales\")\nplt.xlabel(\"\")\nplt.show()","metadata":{"_uuid":"af19800f-0b1a-4a74-828b-5502f78137a7","_cell_guid":"33433513-c6a0-4e3c-969b-9f3ecec2a879","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:25:06.865129Z","iopub.execute_input":"2025-12-17T19:25:06.865447Z","iopub.status.idle":"2025-12-17T19:25:07.026918Z","shell.execute_reply.started":"2025-12-17T19:25:06.865426Z","shell.execute_reply":"2025-12-17T19:25:07.026206Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### 4. Stores","metadata":{"_uuid":"5850071d-1b84-426b-b733-e1eddb16c8fb","_cell_guid":"254d6924-8a9c-45c9-a106-fa1c60a4f0cb","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"stores.tail(11)","metadata":{"_uuid":"3dc608f6-27d4-4db4-be42-8135dff0777d","_cell_guid":"83c48b89-febe-41e8-a37e-ae35a1096cdd","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:25:07.027714Z","iopub.execute_input":"2025-12-17T19:25:07.027923Z","iopub.status.idle":"2025-12-17T19:25:07.037568Z","shell.execute_reply.started":"2025-12-17T19:25:07.027906Z","shell.execute_reply":"2025-12-17T19:25:07.036745Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"stores.isnull().sum()","metadata":{"_uuid":"69262330-71e1-4352-93e3-ba6764d99a4c","_cell_guid":"cc776baa-f067-4266-90cb-c390fcce308c","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:25:07.039236Z","iopub.execute_input":"2025-12-17T19:25:07.039513Z","iopub.status.idle":"2025-12-17T19:25:07.052603Z","shell.execute_reply.started":"2025-12-17T19:25:07.039496Z","shell.execute_reply":"2025-12-17T19:25:07.052001Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"stores = stores[stores[\"store_nbr\"].isin(TOP_STORES)]\n\nstores.to_csv(\n    OUTPUT_PATH + \"dashboard_stores.csv\",\n    index=False\n)","metadata":{"_uuid":"8870cee2-a497-45ae-8af6-68eddc300007","_cell_guid":"4e4bfa0b-f3d3-4647-b3f1-9a7d276f3888","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:25:07.053286Z","iopub.execute_input":"2025-12-17T19:25:07.053582Z","iopub.status.idle":"2025-12-17T19:25:07.066855Z","shell.execute_reply.started":"2025-12-17T19:25:07.053565Z","shell.execute_reply":"2025-12-17T19:25:07.066275Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### 5. Items","metadata":{"_uuid":"f6f17568-4bb9-4ae5-a627-692598fe1ac1","_cell_guid":"683da8b3-7780-417b-ae22-9e32d1b0e062","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"items.head()","metadata":{"_uuid":"b7864e55-0447-4ce8-a214-5cf8884e86a6","_cell_guid":"2778f46f-ba94-4686-9fde-b4df3eb3b514","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:25:07.067614Z","iopub.execute_input":"2025-12-17T19:25:07.067896Z","iopub.status.idle":"2025-12-17T19:25:07.083727Z","shell.execute_reply.started":"2025-12-17T19:25:07.067879Z","shell.execute_reply":"2025-12-17T19:25:07.083153Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"items.isnull().sum()","metadata":{"_uuid":"7fec549a-2f81-42d3-a146-797d766eb549","_cell_guid":"3a7fb1de-471d-4956-9eb6-f63ae18160c2","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:25:07.084546Z","iopub.execute_input":"2025-12-17T19:25:07.084748Z","iopub.status.idle":"2025-12-17T19:25:07.098876Z","shell.execute_reply.started":"2025-12-17T19:25:07.084727Z","shell.execute_reply":"2025-12-17T19:25:07.098313Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"items.to_csv(\n    OUTPUT_PATH + \"dashboard_items.csv\",\n    index=False\n)","metadata":{"_uuid":"1618aa9f-d530-48d7-8e12-4c9a947acb3b","_cell_guid":"ef7234f7-ede6-4410-8eb0-cfc8b0b20923","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:25:07.099536Z","iopub.execute_input":"2025-12-17T19:25:07.099779Z","iopub.status.idle":"2025-12-17T19:25:07.116979Z","shell.execute_reply.started":"2025-12-17T19:25:07.099758Z","shell.execute_reply":"2025-12-17T19:25:07.116428Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"items['family'].value_counts()","metadata":{"_uuid":"5d8ad791-ac7a-40d5-8072-ff6fdd179e94","_cell_guid":"bae6d02c-2306-4206-8332-51234b25e5d5","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:25:07.117582Z","iopub.execute_input":"2025-12-17T19:25:07.118673Z","iopub.status.idle":"2025-12-17T19:25:07.124110Z","shell.execute_reply.started":"2025-12-17T19:25:07.118657Z","shell.execute_reply":"2025-12-17T19:25:07.123577Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"colName=\"family\"\n\nsns.set_theme(style=\"whitegrid\")\nval = items[colName].value_counts().sort_values(ascending=False)\nplt.figure(figsize=(8, 10))\n\nax = sns.countplot(items, y=colName # or y\n                   , palette=\"pastel\"\n                   ,hue =\"perishable\"\n                   # , stat=\"percent\"\n                   , order=val.index\n                   )\nplt.rcParams[\"figure.figsize\"] = (20,25)\nsumm = val.sum()\n\ntitle = val.index\nlbls = [f'{p[0] * 100 / summ:.1f}%' for p in zip(val)]\n\n#vetical label\nax.bar_label(container=ax.containers[0], labels=lbls)\n\nplt.legend([\"not perishable\", \"perishable\"],loc='center left', bbox_to_anchor=(1, 0.5))#out\nplt.title(\"Distribution of perishable item\",\n          fontsize = 18)\nplt.tight_layout()\nplt.show()","metadata":{"_uuid":"822405d8-e723-4298-a8a3-5f1175074771","_cell_guid":"79f3f35d-8c99-48e3-83a4-00a91f91f81a","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:25:07.125010Z","iopub.execute_input":"2025-12-17T19:25:07.125223Z","iopub.status.idle":"2025-12-17T19:25:07.741904Z","shell.execute_reply.started":"2025-12-17T19:25:07.125207Z","shell.execute_reply":"2025-12-17T19:25:07.741039Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### 6. Transactions","metadata":{"_uuid":"9faade8a-d985-44b3-9e97-74d21034f7b2","_cell_guid":"2547d925-e6be-4ff7-a521-5110b25953ae","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"transactions.head()","metadata":{"_uuid":"0481dbec-1195-4d26-a736-2bf5605c2819","_cell_guid":"f216b121-96fb-4c49-97c2-0024c150d41a","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:25:07.742879Z","iopub.execute_input":"2025-12-17T19:25:07.743117Z","iopub.status.idle":"2025-12-17T19:25:07.750798Z","shell.execute_reply.started":"2025-12-17T19:25:07.743099Z","shell.execute_reply":"2025-12-17T19:25:07.750187Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"transactions.isnull().sum()","metadata":{"_uuid":"b80ad118-6a38-428e-b814-6d53ce1262c4","_cell_guid":"fcd0a5e7-04f6-400f-b024-daaf00e0cf86","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:25:07.752233Z","iopub.execute_input":"2025-12-17T19:25:07.752468Z","iopub.status.idle":"2025-12-17T19:25:07.767054Z","shell.execute_reply.started":"2025-12-17T19:25:07.752450Z","shell.execute_reply":"2025-12-17T19:25:07.766409Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"transactions = transactions[\n    (transactions[\"date\"].dt.year.isin(YEARS)) &\n    (transactions[\"store_nbr\"].isin(TOP_STORES))\n]\n\ntransactions.to_csv(\n    OUTPUT_PATH + \"dashboard_transactions.csv\",\n    index=False\n)","metadata":{"_uuid":"fb458f13-8d29-4351-951f-8f9d12e4f443","_cell_guid":"64acbc97-5bff-4e47-849d-6b9ef428303a","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:25:07.767773Z","iopub.execute_input":"2025-12-17T19:25:07.768071Z","iopub.status.idle":"2025-12-17T19:25:07.795197Z","shell.execute_reply.started":"2025-12-17T19:25:07.768049Z","shell.execute_reply":"2025-12-17T19:25:07.794701Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"grouped = (\n    transactions.groupby(\"store_nbr\")[\"transactions\"]\n    .sum()\n    .sort_values(ascending=False)\n)\n\nplt.figure(figsize=(12, 10))\n\nplt.barh(grouped.index.astype(str), grouped.values)\n\nplt.gca().invert_yaxis()\n\nplt.xlabel(\"Total Transactions\", fontsize=12)\nplt.ylabel(\"Store Number (ID)\", fontsize=12)\nplt.title(\"Total Transactions per Store\", fontsize=14)\n\nplt.tight_layout()\nplt.show()","metadata":{"_uuid":"cb25d498-50c9-45b7-a0a4-4095ad002f4c","_cell_guid":"d5cd7ff3-a8d4-4129-b3ea-16fae7159ad7","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:25:07.795945Z","iopub.execute_input":"2025-12-17T19:25:07.796206Z","iopub.status.idle":"2025-12-17T19:25:08.072467Z","shell.execute_reply.started":"2025-12-17T19:25:07.796184Z","shell.execute_reply":"2025-12-17T19:25:08.071766Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"store_id = 44\n\n# Filter by store AND by year 2017\nstore_2017 = train[\n    (train[\"store_nbr\"] == store_id) &\n    (train[\"date\"].dt.year == 2017)\n]\n\n# Aggregate unit sales by date\ndaily_sales = (\n    store_2017.groupby(\"date\")[\"unit_sales\"]\n    .sum()\n    .reset_index()\n)\n\n# Plot\nplt.figure(figsize=(12, 6))\nplt.plot(\n    daily_sales[\"date\"],\n    daily_sales[\"unit_sales\"],\n    label=f\"Store {store_id} — Daily Sales (2017)\"\n)\n\n# Formatting\nplt.xlabel(\"Date\")\nplt.ylabel(\"Total Sales\")\nplt.title(f\"Daily Sales Over Time — Store {store_id} in 2017\")\nplt.xticks(rotation=45)\nplt.legend()\nplt.grid(True, linestyle=\"--\", alpha=0.7)\n\nplt.tight_layout()\nplt.show()","metadata":{"_uuid":"8994299b-10dc-475b-8139-3b8ae171fb86","_cell_guid":"3740adab-20a2-4ce1-9a65-f32422f848a9","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:25:08.073368Z","iopub.execute_input":"2025-12-17T19:25:08.073992Z","iopub.status.idle":"2025-12-17T19:25:08.849515Z","shell.execute_reply.started":"2025-12-17T19:25:08.073973Z","shell.execute_reply":"2025-12-17T19:25:08.848907Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"--------------------------------","metadata":{"_uuid":"59a790fc-a588-411f-81fe-235fd498f03c","_cell_guid":"3ae7f5a2-d2e0-43d2-a8be-66e9b2a43d97","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"markdown","source":"### Process Train Data","metadata":{"_uuid":"96906480-f9d4-4215-80c5-1074eedde8e2","_cell_guid":"fea4fc9b-a88d-4af1-a8c4-801bdcce217d","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"train_df['date'] = pd.to_datetime(train_df['date'])\ntrain_df = train_df[(train_df['date'].dt.year >= 2016) & (train_df['date'].dt.year <= 2017)]\n\ntrain_df = train_df.reset_index(drop=True)\ntrain_df['id'] = train_df.index + 1","metadata":{"_uuid":"aa342be1-4a7c-42e4-83b0-d79d688ac6b9","_cell_guid":"8178763c-85e0-45a2-ba79-a2f2265bb175","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T15:35:12.174120Z","iopub.execute_input":"2025-12-17T15:35:12.174302Z","iopub.status.idle":"2025-12-17T15:35:12.291946Z","shell.execute_reply.started":"2025-12-17T15:35:12.174288Z","shell.execute_reply":"2025-12-17T15:35:12.291070Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df['month'] = train_df['date'].dt.month\ntrain_df['day'] = train_df['date'].dt.day\ntrain_df['weekday'] = train_df['date'].dt.dayofweek  # Monday=0, Sunday=6\ntrain_df['is_weekend'] = train_df['weekday'].isin([5, 6]).astype(int)","metadata":{"_uuid":"dafa2377-0afa-4260-be7d-e22bfc50cd2b","_cell_guid":"854daf21-05a8-4664-b3b3-2bcbca63d2ae","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2025-12-17T15:35:12.292345Z","iopub.status.idle":"2025-12-17T15:35:12.292554Z","shell.execute_reply.started":"2025-12-17T15:35:12.292447Z","shell.execute_reply":"2025-12-17T15:35:12.292457Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"holiday_simple = holidays_actual.groupby(\"date\").agg({\n    \"holiday_flag\": \"max\"   \n}).reset_index()\n\ntrain_df = train_df.merge(holiday_simple,on=\"date\",how=\"left\")","metadata":{"_uuid":"aebe6f25-21fa-43db-ac95-cc20b98b3586","_cell_guid":"7b8eec0d-bcd7-49ab-b31c-7f7552087248","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T15:35:12.293409Z","iopub.status.idle":"2025-12-17T15:35:12.293685Z","shell.execute_reply.started":"2025-12-17T15:35:12.293571Z","shell.execute_reply":"2025-12-17T15:35:12.293586Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df['holiday_flag'] = train_df['holiday_flag'].fillna(0)","metadata":{"_uuid":"09cb0755-fde1-40bd-bf27-4f6a77dc7303","_cell_guid":"f7d6213b-5656-4513-a142-a5b6030edb6f","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T15:35:12.294617Z","iopub.status.idle":"2025-12-17T15:35:12.294933Z","shell.execute_reply.started":"2025-12-17T15:35:12.294762Z","shell.execute_reply":"2025-12-17T15:35:12.294775Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df = pd.merge(train_df, items[['item_nbr', 'family','class', 'perishable']], on='item_nbr', how='left')\n\ntrain_df = pd.merge(train_df, oil[['date', 'dcoilwtico']], on='date', how='left')","metadata":{"_uuid":"afa31b3f-5c2a-465f-9d4f-72162ba2bae7","_cell_guid":"20ec1d8e-bf32-4e78-8e2c-fd803322a93f","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T15:35:12.295590Z","iopub.status.idle":"2025-12-17T15:35:12.295826Z","shell.execute_reply.started":"2025-12-17T15:35:12.295720Z","shell.execute_reply":"2025-12-17T15:35:12.295729Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"tx_44 = transactions[transactions[\"store_nbr\"] == 44]\n\ntrain_df = train_df.merge(tx_44[['date', 'transactions']], on=['date'], how='left')","metadata":{"_uuid":"153e17ea-188f-4001-8e99-4e402a495590","_cell_guid":"8f241c3b-4843-454d-8ab5-265c0d6de05d","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T15:35:12.296952Z","iopub.status.idle":"2025-12-17T15:35:12.297270Z","shell.execute_reply.started":"2025-12-17T15:35:12.297112Z","shell.execute_reply":"2025-12-17T15:35:12.297129Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Forward fill missing values \ntrain_df['dcoilwtico'] = train_df['dcoilwtico'].fillna(method='ffill')\n\n# Fill missing transaction counts by interpolation\ntrain_df[\"transactions\"] = train_df.groupby(\"store_nbr\")[\"transactions\"].transform(\n    lambda x: x.interpolate().bfill().ffill()\n)","metadata":{"_uuid":"d04b8038-d812-4488-8313-6e5750f50596","_cell_guid":"7c0fb4af-3c4b-415d-a93e-f1bda0a26d77","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T15:35:12.298974Z","iopub.status.idle":"2025-12-17T15:35:12.299181Z","shell.execute_reply.started":"2025-12-17T15:35:12.299083Z","shell.execute_reply":"2025-12-17T15:35:12.299092Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df.isnull().sum()","metadata":{"_uuid":"8a78855b-6a13-4775-b595-0cb0ae270f40","_cell_guid":"d5f7ab11-2b30-4dae-9453-2a21199c5e88","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T15:35:12.300071Z","iopub.status.idle":"2025-12-17T15:35:12.300411Z","shell.execute_reply.started":"2025-12-17T15:35:12.300216Z","shell.execute_reply":"2025-12-17T15:35:12.300234Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df.info()","metadata":{"_uuid":"fbae9766-bd4a-47a4-91f4-3ecf25aa6ffb","_cell_guid":"c2ef673d-f9ea-4496-96d7-d34e8904fe82","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T15:35:12.301334Z","iopub.status.idle":"2025-12-17T15:35:12.301642Z","shell.execute_reply.started":"2025-12-17T15:35:12.301486Z","shell.execute_reply":"2025-12-17T15:35:12.301501Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df.drop(columns=['store_nbr','id'], inplace=True)\ntrain_df.head()","metadata":{"_uuid":"9b404be1-da73-4ed2-aa29-5055dcdb96ad","_cell_guid":"8e599b81-c45b-4d50-8152-6364b07b96fb","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T15:35:12.303013Z","iopub.status.idle":"2025-12-17T15:35:12.303274Z","shell.execute_reply.started":"2025-12-17T15:35:12.303139Z","shell.execute_reply":"2025-12-17T15:35:12.303151Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df.shape","metadata":{"_uuid":"bc547700-f488-4f25-850e-badf53a851e3","_cell_guid":"0f674df7-f1cb-4a02-a2da-b149f4bb1c05","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T15:35:12.304983Z","iopub.status.idle":"2025-12-17T15:35:12.305291Z","shell.execute_reply.started":"2025-12-17T15:35:12.305136Z","shell.execute_reply":"2025-12-17T15:35:12.305149Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#train_df.to_pickle(\"train_df.pkl\")","metadata":{"_uuid":"7a4aa399-1d4b-46fc-8d00-cede9c6c8ef0","_cell_guid":"64a78898-db2f-458d-b788-65e0502362e7","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-11-30T17:57:08.939947Z","iopub.execute_input":"2025-11-30T17:57:08.940584Z","iopub.status.idle":"2025-11-30T17:57:09.266152Z","shell.execute_reply.started":"2025-11-30T17:57:08.940551Z","shell.execute_reply":"2025-11-30T17:57:09.265232Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Process Test Data","metadata":{"_uuid":"bea06cd0-2c4d-402b-bc12-329e2260242b","_cell_guid":"2894c0ec-b7bb-4822-87be-9e168e7c2969","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"test.head()","metadata":{"_uuid":"e87717cd-0649-4e4e-bd1f-69ada96bb94d","_cell_guid":"e8b31262-c92f-432f-a847-332d99c3717e","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-11-30T17:33:37.394590Z","iopub.execute_input":"2025-11-30T17:33:37.395352Z","iopub.status.idle":"2025-11-30T17:33:37.403949Z","shell.execute_reply.started":"2025-11-30T17:33:37.395328Z","shell.execute_reply":"2025-11-30T17:33:37.403206Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_df = test[test[\"store_nbr\"] == 44].reset_index(drop=True)","metadata":{"_uuid":"f23733e1-894d-4684-be6a-531f2b678979","_cell_guid":"42aa5696-7b67-4cef-a36d-4c670cd0dbf2","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-11-30T17:33:37.755441Z","iopub.execute_input":"2025-11-30T17:33:37.755940Z","iopub.status.idle":"2025-11-30T17:33:37.765217Z","shell.execute_reply.started":"2025-11-30T17:33:37.755918Z","shell.execute_reply":"2025-11-30T17:33:37.764571Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_df['month'] = test_df['date'].dt.month\ntest_df['day'] = test_df['date'].dt.day\ntest_df['weekday'] = test_df['date'].dt.dayofweek  # Monday=0, Sunday=6\ntest_df['is_weekend'] = test_df['weekday'].isin([5, 6]).astype(int)","metadata":{"_uuid":"a1f91c86-7284-4efd-9679-c2ccd7d14420","_cell_guid":"6e6a1988-c0d5-49dc-9c32-aa2c336be9ce","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-11-30T17:33:38.207692Z","iopub.execute_input":"2025-11-30T17:33:38.208276Z","iopub.status.idle":"2025-11-30T17:33:38.221957Z","shell.execute_reply.started":"2025-11-30T17:33:38.208253Z","shell.execute_reply":"2025-11-30T17:33:38.221344Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_df = test_df.merge(\n    items[['item_nbr', 'family', 'class', 'perishable']],\n    on='item_nbr',\n    how='left'\n)\n\ntest_df = test_df.merge(holiday_simple[['date', 'holiday_flag']],on='date',how='left')\ntest_df['holiday_flag'] = test_df['holiday_flag'].fillna(0)\n\ntest_df = test_df.merge(oil[['date', 'dcoilwtico']], on='date', how='left')\ntest_df['dcoilwtico'] = test_df['dcoilwtico'].fillna(method='ffill')","metadata":{"_uuid":"56a59685-ad70-4090-9312-e8ee94a29693","_cell_guid":"fcb97a33-553b-47f2-87d4-076a05225f02","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-11-30T17:33:39.157069Z","iopub.execute_input":"2025-11-30T17:33:39.157866Z","iopub.status.idle":"2025-11-30T17:33:39.185853Z","shell.execute_reply.started":"2025-11-30T17:33:39.157840Z","shell.execute_reply":"2025-11-30T17:33:39.184857Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_df.drop(columns=['store_nbr','id'], inplace=True)\ntest_df.head()","metadata":{"_uuid":"336784a6-b3f6-4b14-83ab-c40353301ab0","_cell_guid":"b0a0eab6-864a-4a92-83db-3f912d79b80c","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-11-30T17:33:41.129251Z","iopub.execute_input":"2025-11-30T17:33:41.129817Z","iopub.status.idle":"2025-11-30T17:33:41.144996Z","shell.execute_reply.started":"2025-11-30T17:33:41.129791Z","shell.execute_reply":"2025-11-30T17:33:41.144412Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_df.shape","metadata":{"_uuid":"5b9e5873-0c8a-4c15-bbd3-f4c84cea1cf2","_cell_guid":"8314a299-1bc2-41eb-b6b5-b46f892b40c8","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-11-30T17:33:41.876848Z","iopub.execute_input":"2025-11-30T17:33:41.877664Z","iopub.status.idle":"2025-11-30T17:33:41.882092Z","shell.execute_reply.started":"2025-11-30T17:33:41.877638Z","shell.execute_reply":"2025-11-30T17:33:41.881426Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#test_df.to_pickle(\"test_df.pkl\")","metadata":{"_uuid":"bd1bcd92-9cab-4190-a0c5-af334518893c","_cell_guid":"222eaf5a-36f8-4b09-ac92-342468f515d1","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-11-30T17:57:28.928742Z","iopub.execute_input":"2025-11-30T17:57:28.929436Z","iopub.status.idle":"2025-11-30T17:57:28.940120Z","shell.execute_reply.started":"2025-11-30T17:57:28.929411Z","shell.execute_reply":"2025-11-30T17:57:28.938256Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#test_df = pd.read_pickle(\"test_df.pkl\")","metadata":{"_uuid":"50afe301-991e-4a04-bb55-2ffcd7e927d0","_cell_guid":"6faee928-296f-4044-ae58-e5dcccf962f1","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Dashboard","metadata":{"_uuid":"b5067b7c-af2c-49c1-acaa-4f184abaa011","_cell_guid":"2e4a5699-ed1c-4a32-8e4c-6cf7a1af2261","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"trainre= pd.read_csv(\"/kaggle/input/trainre/FlowXTransformer Reduced Train Data.csv\")\ntrainre.head()","metadata":{"_uuid":"46f62a78-a262-4e56-926e-52b6282d130a","_cell_guid":"b7a3624c-9f7b-4974-8f1c-38b9ae3d6b0c","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T19:12:39.030660Z","iopub.execute_input":"2025-12-17T19:12:39.031035Z","iopub.status.idle":"2025-12-17T19:12:41.594042Z","shell.execute_reply.started":"2025-12-17T19:12:39.031014Z","shell.execute_reply":"2025-12-17T19:12:41.593356Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"trainre.info()","metadata":{"_uuid":"69c1787e-38fd-4a29-94e7-ecef1527fdb1","_cell_guid":"57211f50-e074-475b-ac12-1c538a944077","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T15:43:15.583506Z","iopub.execute_input":"2025-12-17T15:43:15.584118Z","iopub.status.idle":"2025-12-17T15:43:15.600944Z","shell.execute_reply.started":"2025-12-17T15:43:15.584096Z","shell.execute_reply":"2025-12-17T15:43:15.600235Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"trainre.columns","metadata":{"_uuid":"cd5dd08f-d0f3-477a-8836-2c3148482873","_cell_guid":"865bd6d6-4ece-4534-85f3-52dde2aaf3b2","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T15:44:30.987537Z","iopub.execute_input":"2025-12-17T15:44:30.988111Z","iopub.status.idle":"2025-12-17T15:44:30.993265Z","shell.execute_reply.started":"2025-12-17T15:44:30.988085Z","shell.execute_reply":"2025-12-17T15:44:30.992647Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"categorical_cols = [\"family\", \"holiday_type\", \"description\"]\nnumerical_cols = [\"item_nbr\", \"onpromotion\", \"class\", \"perishable\",\n                  \"dcoilwtico\", \"day_of_week\", \"day_of_month\", \"month\", \"year\"]","metadata":{"_uuid":"97c644f7-c4a8-4ee2-b804-5428b7232316","_cell_guid":"f214dfca-194f-4e55-a6b4-74bea92681fe","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T15:49:17.993545Z","iopub.execute_input":"2025-12-17T15:49:17.994242Z","iopub.status.idle":"2025-12-17T15:49:17.997750Z","shell.execute_reply.started":"2025-12-17T15:49:17.994219Z","shell.execute_reply":"2025-12-17T15:49:17.997055Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"Categorical Columns Info:\\n\")\nfor col in categorical_cols:\n    unique_vals = sorted(trainre[col].dropna().unique())\n    print(f\"Column: {col}\")\n    print(f\"Unique Values ({len(unique_vals)}): {unique_vals}\\n\")\n\n# Extract min-max for numerical columns\nprint(\"Numerical Columns Info:\\n\")\nfor col in numerical_cols:\n    col_min = trainre[col].min()\n    col_max = trainre[col].max()\n    print(f\"Column: {col}\")\n    print(f\"Min: {col_min}, Max: {col_max}\\n\")","metadata":{"_uuid":"2898628e-8d91-4f83-a093-d74ae21ea953","_cell_guid":"41854664-5c89-4db0-b5e1-f8b2c9c00161","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-12-17T16:29:43.367333Z","iopub.execute_input":"2025-12-17T16:29:43.367600Z","iopub.status.idle":"2025-12-17T16:29:43.891221Z","shell.execute_reply.started":"2025-12-17T16:29:43.367580Z","shell.execute_reply":"2025-12-17T16:29:43.890405Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport json\n\n# --------------------------\n# Load your datasets\n# --------------------------\nsales = pd.read_csv(\"/kaggle/working/dashboard_sales.csv\")        # your sales file\nstores = pd.read_csv(\"/kaggle/working/dashboard_stores.csv\")      # stores file\n\n# --------------------------\n# Filter data for Top-10 stores and 2016-2017\n# --------------------------\nTOP_STORES = [44, 47, 45, 46, 3, 48, 8, 49, 50, 11]\n\n# Ensure 'date' column is datetime\nsales['date'] = pd.to_datetime(sales['date'])\nsales = sales[(sales['date'].dt.year.isin([2016, 2017])) & (sales['store_nbr'].isin(TOP_STORES))]\n\n# --------------------------\n# Compute KPIs\n# --------------------------\n\n# 1. Total Sales\ntotal_sales = sales['unit_sales'].sum()\n\n# 2. Number of Active Stores\nnum_stores = sales['store_nbr'].nunique()\n\n# 3. Number of Products (SKUs)\nnum_products = sales['item_nbr'].nunique()\n\n# 4. Average Daily Sales\navg_daily_sales = sales.groupby('date')['unit_sales'].sum().mean()\n\n# 5. Promotion Sales Ratio\npromo_ratio = sales[sales['onpromotion'] == True]['unit_sales'].sum() / sales['unit_sales'].sum()\n\n# 6. Sales Volatility (Std Dev)\nsales_volatility = sales.groupby('date')['unit_sales'].sum().std()\n\n# 7. Average Sales per Store\navg_sales_per_store = sales.groupby('store_nbr')['unit_sales'].sum().mean()\n\n# 8. Top Product Contribution (%)\ntop_product_share = sales.groupby('item_nbr')['unit_sales'].sum().sort_values(ascending=False).iloc[0] / sales['unit_sales'].sum()\n\n# --------------------------\n# Prepare JSON\n# --------------------------\nkpis = {\n    \"total_sales\": round(total_sales, 2),\n    \"num_stores\": int(num_stores),\n    \"num_products\": int(num_products),\n    \"avg_daily_sales\": round(avg_daily_sales, 2),\n    \"promo_ratio\": round(promo_ratio, 4),  # 4 decimals for ratio\n    \"sales_volatility\": round(sales_volatility, 2),\n    \"avg_sales_per_store\": round(avg_sales_per_store, 2),\n    \"top_product_share\": round(top_product_share, 4)\n}\n\n# Save to JSON\nwith open('kpis.json', 'w') as f:\n    json.dump(kpis, f, indent=4)\n\nprint(\"✅ KPIs JSON file created successfully!\")\n","metadata":{"_uuid":"3f0a0c38-71af-4f68-ab33-a68122631dc9","_cell_guid":"1aaea2e9-0702-4394-af9f-74f29d33fbdf","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2025-12-17T19:41:50.084761Z","iopub.execute_input":"2025-12-17T19:41:50.085049Z","iopub.status.idle":"2025-12-17T19:42:00.268901Z","shell.execute_reply.started":"2025-12-17T19:41:50.085029Z","shell.execute_reply":"2025-12-17T19:42:00.268174Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# ============================================\n# FlowX Model Insights JSON (Dashboard Version)\n# ============================================\n\nimport pandas as pd\nimport json\n\n# Load reduced training dataset\ntrain = pd.read_csv(\"/kaggle/input/trainre/FlowXTransformer Reduced Train Data.csv\")\n\n# Convert date column\ntrain['date'] = pd.to_datetime(train['date'])\n\n# Filter years 2016–2017\ntrain = train[\n    (train['date'].dt.year >= 2016) &\n    (train['date'].dt.year <= 2017)\n]\n\n# Select top 10 stores by total transactions\ntop_10_stores = (\n    train.groupby('store_nbr')['transactions']\n    .sum()\n    .sort_values(ascending=False)\n    .head(10)\n    .index\n    .tolist()\n)\n\ntrain = train[train['store_nbr'].isin(top_10_stores)]\n\n# Dataset size information\ndataset_size = {\n    \"rows\": int(train.shape[0]),\n    \"columns\": int(train.shape[1]),\n    \"years_used\": [2016, 2017],\n    \"stores_used\": sorted(train['store_nbr'].unique().tolist()),\n    \"number_of_stores\": train['store_nbr'].nunique(),\n    \"number_of_products\": train['item_nbr'].nunique()\n}\n\n# Target statistics\nsales_statistics = train['unit_sales'].describe().to_dict()\n\n# Final Model Insights JSON\nmodel_insights = {\n    \"project\": {\n        \"title\": \"FlowX – Transformer-Based Grocery Sales Forecasting\",\n        \"description\": (\n            \"FlowX is an AI-driven demand forecasting system designed to predict daily \"\n            \"product sales in grocery stores. The project focuses on capturing complex \"\n            \"temporal patterns and external influences to support inventory planning \"\n            \"and decision-making.\"\n        )\n    },\n\n    \"dataset\": {\n        \"name\": \"Corporación Favorita Grocery Sales Forecasting\",\n        \"source\": \"Kaggle Competition Dataset\",\n        \"competition_data\": True,\n        \"overview\": (\n            \"The dataset originates from a Kaggle competition hosted by Corporación \"\n            \"Favorita, Ecuador’s largest grocery retailer. It contains historical daily \"\n            \"sales enriched with promotions, holidays, oil prices, and store transaction data.\"\n        ),\n        \"time_scope\": {\n            \"start_year\": 2016,\n            \"end_year\": 2017\n        },\n        \"store_selection\": {\n            \"strategy\": \"Top 10 stores with highest transaction volume\",\n            \"store_ids\": dataset_size[\"stores_used\"]\n        },\n        \"size\": {\n            \"rows\": dataset_size[\"rows\"],\n            \"columns\": dataset_size[\"columns\"],\n            \"unique_products\": dataset_size[\"number_of_products\"],\n            \"unique_stores\": dataset_size[\"number_of_stores\"]\n        },\n        \"target_variable\": {\n            \"name\": \"unit_sales\",\n            \"statistics\": sales_statistics\n        }\n    },\n\n    \"model\": {\n        \"name\": \"FlowX Transformer\",\n        \"strategy\": (\n            \"FlowX adopts a multimodal learning strategy, combining numerical, categorical, \"\n            \"temporal, and textual data to model sales dynamics more accurately.\"\n        ),\n\n        \"inputs\": {\n            \"numerical_features\": [\n                \"historical sales\",\n                \"oil prices\",\n                \"store transactions\"\n            ],\n            \"categorical_features\": [\n                \"store\",\n                \"product family\",\n                \"holiday type\"\n            ],\n            \"text_features\": {\n                \"source\": \"holiday descriptions\",\n                \"embedding_model\": \"MiniLM\",\n                \"embedding_dimension\": 384\n            },\n            \"temporal_features\": [\n                \"day of week (cyclical encoding)\",\n                \"month (cyclical encoding)\"\n            ]\n        },\n\n        \"architecture\": {\n            \"type\": \"Transformer (Built from Scratch)\",\n            \"attention_mechanism\": \"Scaled Dot-Product Attention (QKᵀ / √dₖ)\",\n            \"multi_head_attention\": {\n                \"number_of_heads\": 8,\n                \"purpose\": \"Capture multiple temporal patterns in parallel\"\n            },\n            \"encoder\": {\n                \"layers\": 4,\n                \"input_window\": \"30-day historical sequence\"\n            },\n            \"decoder\": {\n                \"layers\": 2,\n                \"forecast_horizon\": \"15 days\"\n            },\n            \"fusion_module\": \"Gated Residual Network for adaptive multimodal fusion\",\n            \"positional_encoding\": \"Sinusoidal positional encoding\"\n        },\n\n        \"output\": {\n            \"type\": \"Quantile Regression\",\n            \"quantiles\": [0.1, 0.5, 0.9],\n            \"description\": (\n                \"The model predicts multiple quantiles to estimate uncertainty and provide \"\n                \"confidence intervals for future sales.\"\n            )\n        }\n    },\n\n    \"explainability\": {\n        \"methods\": [\n            \"Attention heatmaps\",\n            \"Cross-attention analysis\"\n        ],\n        \"description\": (\n            \"Explainability is achieved through attention visualization, highlighting \"\n            \"which past days and events most influence future predictions.\"\n        )\n    },\n\n    \"training\": {\n        \"optimization\": {\n            \"mixed_precision\": \"Automatic Mixed Precision (AMP)\",\n            \"learning_rate_schedule\": \"Cosine annealing\",\n            \"gradient_clipping\": True\n        },\n        \"regularization\": {\n            \"early_stopping\": \"Enabled with patience\"\n        },\n        \"goal\": (\n            \"Ensure stable training, faster convergence, and improved generalization.\"\n        )\n    }\n}\n\n# Save JSON file\nwith open(\"model_insights.json\", \"w\") as f:\n    json.dump(model_insights, f, indent=4)\n\nprint(\"✅ model_insights.json generated successfully for the dashboard!\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-17T20:43:45.146019Z","iopub.execute_input":"2025-12-17T20:43:45.146829Z","iopub.status.idle":"2025-12-17T20:43:47.844436Z","shell.execute_reply.started":"2025-12-17T20:43:45.146802Z","shell.execute_reply":"2025-12-17T20:43:47.843777Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# ============================================================\n# FlowX Dashboard Data Generation (2016–2017, Top-10 Stores)\n# ============================================================\n\nimport pandas as pd\nimport numpy as np\n\n# -----------------------------\n# CONFIG\n# -----------------------------\nTOP_STORES = [44, 47, 45, 46, 3, 48, 8, 49, 50, 11]\nOUTPUT_PATH = \"/kaggle/working/\"\n\n# -----------------------------\n# LOAD DATA\n# -----------------------------\ndf = pd.read_csv(\n    \"/kaggle/input/trainre/FlowXTransformer Reduced Train Data.csv\",\n    parse_dates=[\"date\"]\n)\n\n# -----------------------------\n# FILTER DATA\n# -----------------------------\ndf = df[\n    (df[\"date\"].dt.year >= 2016) &\n    (df[\"date\"].dt.year <= 2017) &\n    (df[\"store_nbr\"].isin(TOP_STORES))\n].copy()\n\n# Safety\ndf[\"unit_sales\"] = df[\"unit_sales\"].clip(lower=0)\n\nprint(f\"Filtered data shape: {df.shape}\")\n\n# ============================================================\n# 1️⃣ TOTAL SALES OVER TIME\n# ============================================================\ntotal_sales_time = (\n    df.groupby(\"date\", as_index=False)[\"unit_sales\"]\n      .sum()\n)\n\ntotal_sales_time.to_csv(\n    OUTPUT_PATH + \"dashboard_total_sales_over_time.csv\",\n    index=False\n)\n\n# ============================================================\n# 2️⃣ SALES VS OIL PRICE\n# ============================================================\nsales_oil = (\n    df.groupby(\"date\", as_index=False)\n      .agg({\n          \"unit_sales\": \"sum\",\n          \"dcoilwtico\": \"mean\"\n      })\n)\n\nsales_oil.to_csv(\n    OUTPUT_PATH + \"dashboard_sales_vs_oil_price.csv\",\n    index=False\n)\n\n# ============================================================\n# 3️⃣ SALES VS HOLIDAYS\n# ============================================================\nsales_holiday = (\n    df.groupby(\"holiday_type\", as_index=False)[\"unit_sales\"]\n      .sum()\n      .sort_values(\"unit_sales\", ascending=False)\n)\n\nsales_holiday.to_csv(\n    OUTPUT_PATH + \"dashboard_sales_vs_holidays.csv\",\n    index=False\n)\n\n# ============================================================\n# 4️⃣ SALES PER PRODUCT PER STORE (INTERACTIVE)\n# ============================================================\nsales_product_store = (\n    df.groupby(\n        [\"date\", \"store_nbr\", \"item_nbr\"],\n        as_index=False\n    )[\"unit_sales\"]\n    .sum()\n)\n\nsales_product_store.to_csv(\n    OUTPUT_PATH + \"dashboard_sales_product_store.csv\",\n    index=False\n)\n\n# ============================================================\n# 5️⃣ TOP PRODUCTS\n# ============================================================\ntop_products = (\n    df.groupby(\"item_nbr\", as_index=False)[\"unit_sales\"]\n      .sum()\n      .sort_values(\"unit_sales\", ascending=False)\n      .head(100)\n)\n\ntop_products.to_csv(\n    OUTPUT_PATH + \"dashboard_top100_products.csv\",\n    index=False\n)\n\n# ============================================================\n#  STORE PERFORMANCE\n# ============================================================\nstore_performance = (\n    df.groupby(\"store_nbr\", as_index=False)[\"unit_sales\"]\n      .sum()\n      .sort_values(\"unit_sales\", ascending=False)\n)\n\nstore_performance.to_csv(\n    OUTPUT_PATH + \"dashboard_store_performance.csv\",\n    index=False\n)\n\n# ============================================================\n#  WEEKLY SEASONALITY\n# ============================================================\nweekly_pattern = (\n    df.groupby(\"day_of_week\", as_index=False)[\"unit_sales\"]\n      .mean()\n)\n\nweekly_pattern[\"day_name\"] = weekly_pattern[\"day_of_week\"].map({\n    0: \"Monday\",\n    1: \"Tuesday\",\n    2: \"Wednesday\",\n    3: \"Thursday\",\n    4: \"Friday\",\n    5: \"Saturday\",\n    6: \"Sunday\"\n})\n\nweekly_pattern.to_csv(\n    OUTPUT_PATH + \"dashboard_weekly_pattern.csv\",\n    index=False\n)\n\nprint(\"✅ All dashboard CSV files generated successfully!\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-17T21:20:12.259783Z","iopub.execute_input":"2025-12-17T21:20:12.260570Z","iopub.status.idle":"2025-12-17T21:20:19.121642Z","shell.execute_reply.started":"2025-12-17T21:20:12.260541Z","shell.execute_reply":"2025-12-17T21:20:19.120715Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}