{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":7391,"databundleVersionId":44328,"sourceType":"competition"}],"dockerImageVersionId":30587,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# 0. Организационное про домашнюю работу\n\n- Сдаем в энитаске. Говорят, вы знаете, что делать со следующей инфой:\n    - https://anytask.org/course/1069\n    - Anytask: NLSAbHd\n- Дедлайн **02.12.2023** в 23.30 (так настроен энитаск сейчас) \n- Пожалуйста, в названии файла укажите префикс задания и свою фамилию и инициалы: **demand_tevanyan_ea**\n- Цель задания - практика по мотивам занятия \"Прогноз спроса\".\n- На задания нет правильных и неправильных ответов. Хочется посмотреть на полноту решения и продуманности с вашей стороны.\n- В квадратных скобках указан вес каждого из пунктов. Необязательной является последняя, шестая часть. Бонусы в вашу карму.\n\n- Данные:\n\n    - (если пользуетесь): kaggle competitions download -c favorita-grocery-transactions-forecasting\n    - простое смертное скачивание: https://www.kaggle.com/competitions/favorita-grocery-transactions-forecasting/data","metadata":{}},{"cell_type":"markdown","source":"# 1. Задача\n\nВ наших руках оказались данные Эквадорского ритейлера с сотнями магазином и более чем 200000 товаров.\nМы довольно подробно обсудили на занятии, почему важно и нужно прогнозировать спрос, напомним основные тейки:\n\n- Если мы привезли в магазин слишком мало товара, потребителем его не хватит.\n- Если мы привезли в магазин слишком много товара, то возникают лишние расходы, связанные с хранением товаров, а также лишние расходы, связанные с просрочкой товаров.\n\n\nХотелось бы уметь избегать всех этих лишних расходов и привозить в каждый магазин ровно столько товара, сколько нужно.\n","metadata":{"slideshow":{"slide_type":"slide"}}},{"cell_type":"markdown","source":"## Цель\n- сделать модель спроса на каждый товар\n\n## NB\n- датасет большой и непростой\n- на это задание нет правильных и неправильных ответов\n- важно обосновывать свои допущения в процессе решения","metadata":{}},{"cell_type":"markdown","source":"# 2. Данные\n\n**Описания файлов и информация о данных**\n\n**train.csv** <br>\n- Обучающие данные, включающие значения целевой переменной <code>unit_transactions</code> по дате, номеру магазина <code>(store_nbr)</code> и номеру товара <code>(item_nbr)</code>, а также уникальный идентификатор для маркировки строк.\n- Целевая переменная <code>unit_transactions </code> может быть целым числом (например, упаковка чипсов) или числом с плавающей запятой (например, 1,5 кг сыра). Отрицательные значения unit_transactions представляют возвраты этого конкретного товара.\n- Столбец <code>onpromotion</code> указывает, был ли товар <code>(item_nbr)</code> на продаже <code>(promotion)</code> на указанную дату и в указанном магазине. Приблизительно 16% значений onpromotion в этом файле равны NaN.\n- ПРИМЕЧАНИЕ: В обучающих данных отсутствуют строки для товаров с нулевыми unit_transactions для комбинации магазин/дата. Нет информации о том, был ли товар в наличии в магазине в указанную дату, и команды должны решить, как лучше всего обработать эту ситуацию. Кроме того, в обучающих данных есть небольшое количество товаров, которые не встречаются в тестовых данных (они отсутствуют).\n\n**stores.csv**  <br>\nМетаданные магазинов, включая город<code>city</code>, штат<code>state</code>, тип<code>type</code> и кластер <code>cluster</code>. Кластер - это группировка похожих магазинов.\n \n**items.csv** <br>\nМетаданные товаров, включая семейство (<code>family</code>), класс <code>class</code> и скоропортящиеся товары (<code>perishable</code>). ПРИМЕЧАНИЕ: Товары, помеченные как perishable, имеют весовой коэффициент 1.25; в противном случае вес равен 1.0.\n\n**transactions.csv** <br>\nКоличество транзакций продаж для каждой даты и комбинации магазин/номер товара. Включено только для временного интервала обучающих данных.\n\n**oil.csv**  <br>\nЕжедневные цены на нефть.(Эквадор - страна, зависящая от нефти, и ее экономическое здоровье чрезвычайно уязвимо для колебаний цен на нефть.)\n\n**holidays_events.csv** <br>\nПраздники и события с метаданными.\n\n- Особое внимание уделяйте столбцу <code>transferred</code>. Праздник, который официально выпадает на этот календарный день, но был перемещен на другую дату правительством. Перемещенный день больше похож на обычный день, чем на праздник. Чтобы найти день, когда он был на самом деле отмечен, поищите соответствующую строку, где тип - Transfer. Например, праздник Independencia de Guayaquil был перемещен с 09.10.2012 на 12.10.2012, что означает, что он был отмечен 12.10.2012. Дни с типом Bridge - это дополнительные дни, добавляемые к празднику (например, для продления выходных на длинные выходные). Их часто компенсирует день типа Work Day, который не является обычным рабочим днем (например, суббота), предназначенным для компенсации Bridge.\n- <code>Additional </code>Дополнительные праздничные дни - это дни, добавленные к обычному календарному празднику, например, как обычно происходит вокруг Рождества (что делает канун Рождества праздником).\n\n\n**Дополнительные заметки**  <br>\nЗаработная плата в общественном секторе выплачивается каждые две недели 15-го числа и в последний день месяца. Пр","metadata":{"slideshow":{"slide_type":"slide"}}},{"cell_type":"code","source":"!pip install pyunpack","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:13:32.865838Z","iopub.execute_input":"2023-12-13T18:13:32.866348Z","iopub.status.idle":"2023-12-13T18:13:49.241229Z","shell.execute_reply.started":"2023-12-13T18:13:32.866312Z","shell.execute_reply":"2023-12-13T18:13:49.240055Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install py7zr","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:13:49.246001Z","iopub.execute_input":"2023-12-13T18:13:49.246582Z","iopub.status.idle":"2023-12-13T18:14:04.918245Z","shell.execute_reply.started":"2023-12-13T18:13:49.246529Z","shell.execute_reply":"2023-12-13T18:14:04.917038Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport zipfile\nfrom py7zr import unpack_7zarchive\nimport shutil\n\nimport pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport datetime\nfrom sklearn.preprocessing import LabelEncoder","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:44:18.079254Z","iopub.execute_input":"2023-12-13T18:44:18.079724Z","iopub.status.idle":"2023-12-13T18:44:22.130555Z","shell.execute_reply.started":"2023-12-13T18:44:18.079678Z","shell.execute_reply":"2023-12-13T18:44:22.129016Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"shutil.register_unpack_format('7zip', ['.7z'], unpack_7zarchive)\nfor i in os.listdir('/kaggle/input/favorita-grocery-sales-forecasting'):\n    print(i)\n#     shutil.register_unpack_format('7zip', ['.7z'], unpack_7zarchive)\n    shutil.unpack_archive('/kaggle/input/favorita-grocery-sales-forecasting/' + i, '/kaggle/working/')","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:14:06.338023Z","iopub.execute_input":"2023-12-13T18:14:06.338786Z","iopub.status.idle":"2023-12-13T18:15:39.825570Z","shell.execute_reply.started":"2023-12-13T18:14:06.338749Z","shell.execute_reply":"2023-12-13T18:15:39.824123Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 3. Задания","metadata":{"slideshow":{"slide_type":"subslide"}}},{"cell_type":"markdown","source":"## 3. 1. [40%] Target\n\nВ этой секции я предлагаю вам продумать, какой таргет вы хотите спрогнозировать:\n- подневной / понедельный / ежемесячный\n- для всех товаров, что есть в items, или на ограниченном наборе\n\nЭтот выбор должен быть обоснован анализом имеющихся данных. \nИдеи для проверки:\n- сколько наблюдений есть на каждый из товаров\n- есть ли товары, которые продаются редко\n- есть ли товары, выведенные из ассортимента (отсутствие продаж в течение долго времени)\n\nВысокая оценка за этот пункт - полнота и глубина вашего ответа.","metadata":{}},{"cell_type":"code","source":"%%time\n\nitems = pd.read_csv(\"items.csv\")\nholiday_events = pd.read_csv(\"holidays_events.csv\", parse_dates=['date'])\nstores = pd.read_csv(\"stores.csv\")\noil = pd.read_csv(\"oil.csv\", parse_dates=['date'])\ntransactions = pd.read_csv(\"transactions.csv\", parse_dates=['date'])","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:15:39.830925Z","iopub.execute_input":"2023-12-13T18:15:39.831373Z","iopub.status.idle":"2023-12-13T18:15:39.967386Z","shell.execute_reply.started":"2023-12-13T18:15:39.831338Z","shell.execute_reply":"2023-12-13T18:15:39.966097Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\n\ntrain = pd.read_csv(\"train.csv\", parse_dates=['date'])","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:15:39.969278Z","iopub.execute_input":"2023-12-13T18:15:39.969669Z","iopub.status.idle":"2023-12-13T18:18:18.064401Z","shell.execute_reply.started":"2023-12-13T18:15:39.969637Z","shell.execute_reply":"2023-12-13T18:18:18.061256Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Ежедневные транзакции","metadata":{}},{"cell_type":"code","source":"stores.type = stores.type.astype('category')\ntransactions = pd.merge(transactions,stores,how='left')\n\nevents=holiday_events.loc[holiday_events.type=='Event']\nholiday_events=holiday_events.loc[holiday_events.type!='Event']\n\ntransactions['year'],transactions['week'],transactions['day']=list(zip(*transactions.date.apply(lambda x: x.isocalendar())))\ntransactions['dayoff']=[x in [6,7] for x in transactions.day]\n\nfor (d,t,l,n) in zip(holiday_events.date,holiday_events.type,holiday_events.locale,holiday_events.locale_name):\n    if t!='Work Day':\n        if l=='National':\n            transactions.loc[transactions.date==d,'dayoff']=True\n        elif l=='Regional':\n            transactions.loc[(transactions.date==d)&(transactions.state==n),'dayoff']=True\n        else:\n            transactions.loc[(transactions.date==d)&(transactions.city==n),'dayoff']=True\n    else:\n        transactions.loc[(transactions.date==d),'dayoff']=False","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:18:18.067723Z","iopub.execute_input":"2023-12-13T18:18:18.068523Z","iopub.status.idle":"2023-12-13T18:18:21.766293Z","shell.execute_reply.started":"2023-12-13T18:18:18.068462Z","shell.execute_reply":"2023-12-13T18:18:21.764867Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"transactions.describe()","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:18:21.769307Z","iopub.execute_input":"2023-12-13T18:18:21.770359Z","iopub.status.idle":"2023-12-13T18:18:21.854206Z","shell.execute_reply.started":"2023-12-13T18:18:21.770302Z","shell.execute_reply":"2023-12-13T18:18:21.853000Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"transactions.groupby(['store_nbr'])['transactions'].sum().sort_values(ascending=False)","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:18:21.855672Z","iopub.execute_input":"2023-12-13T18:18:21.856083Z","iopub.status.idle":"2023-12-13T18:18:21.877306Z","shell.execute_reply.started":"2023-12-13T18:18:21.856050Z","shell.execute_reply":"2023-12-13T18:18:21.875753Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"transactions","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:18:21.883794Z","iopub.execute_input":"2023-12-13T18:18:21.884302Z","iopub.status.idle":"2023-12-13T18:18:21.916854Z","shell.execute_reply.started":"2023-12-13T18:18:21.884262Z","shell.execute_reply":"2023-12-13T18:18:21.915295Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Посмотрим транзакции во времени у разных магазинов","metadata":{}},{"cell_type":"code","source":"dayly_transactions_working = transactions.loc[(transactions['store_nbr']==44) & (transactions['dayoff'] == False),['date','transactions']].set_index('date')\ndayly_transactions_working = dayly_transactions_working.transactions.astype('float')\n\ndayly_transactions_dayoff = transactions.loc[(transactions['store_nbr']==44) & (transactions['dayoff'] == True),['date','transactions']].set_index('date')\ndayly_transactions_dayoff = dayly_transactions_dayoff.transactions.astype('float')\nplt.figure(figsize=(12,4))\nplt.title('Ежедневные покупки 44')\nplt.xlabel('дата')\nplt.ylabel('Кол-во покупок')\nplt.plot(dayly_transactions_working, label='Рабочий день')\nplt.plot(dayly_transactions_dayoff, label='Выходной')\nplt.legend()\nplt.show()\n\ndayly_transactions_working = transactions.loc[(transactions['store_nbr']==3) & (transactions['dayoff'] == False),['date','transactions']].set_index('date')\ndayly_transactions_working = dayly_transactions_working.transactions.astype('float')\n\ndayly_transactions_dayoff = transactions.loc[(transactions['store_nbr']==3) & (transactions['dayoff'] == True),['date','transactions']].set_index('date')\ndayly_transactions_dayoff = dayly_transactions_dayoff.transactions.astype('float')\nplt.figure(figsize=(12,4))\nplt.title('Ежедневные покупки 3')\nplt.xlabel('дата')\nplt.ylabel('Кол-во покупок')\nplt.plot(dayly_transactions_working, label='Рабочий день')\nplt.plot(dayly_transactions_dayoff, label='Выходной')\nplt.legend()\nplt.show()\n\ndayly_transactions_working = transactions.loc[(transactions['store_nbr']==1) & (transactions['dayoff'] == False),['date','transactions']].set_index('date')\ndayly_transactions_working = dayly_transactions_working.transactions.astype('float')\n\ndayly_transactions_dayoff = transactions.loc[(transactions['store_nbr']==1) & (transactions['dayoff'] == True),['date','transactions']].set_index('date')\ndayly_transactions_dayoff = dayly_transactions_dayoff.transactions.astype('float')\nplt.figure(figsize=(12,4))\nplt.title('Ежедневные покупки 1')\nplt.xlabel('дата')\nplt.ylabel('Кол-во покупок')\nplt.plot(dayly_transactions_working, label='Рабочий день')\nplt.plot(dayly_transactions_dayoff, label='Выходной')\nplt.legend()\nplt.show()\n\ndayly_transactions_working = transactions.loc[(transactions['store_nbr']==33) & (transactions['dayoff'] == False),['date','transactions']].set_index('date')\ndayly_transactions_working = dayly_transactions_working.transactions.astype('float')\n\ndayly_transactions_dayoff = transactions.loc[(transactions['store_nbr']==33) & (transactions['dayoff'] == True),['date','transactions']].set_index('date')\ndayly_transactions_dayoff = dayly_transactions_dayoff.transactions.astype('float')\nplt.figure(figsize=(12,4))\nplt.title('Ежедневные покупки 33')\nplt.xlabel('дата')\nplt.ylabel('Кол-во покупок')\nplt.plot(dayly_transactions_working, label='Рабочий день')\nplt.plot(dayly_transactions_dayoff, label='Выходной')\nplt.legend()\nplt.show()\n\ndayly_transactions_working = transactions.loc[(transactions['store_nbr']==52) & (transactions['dayoff'] == False),['date','transactions']].set_index('date')\ndayly_transactions_working = dayly_transactions_working.transactions.astype('float')\n\ndayly_transactions_dayoff = transactions.loc[(transactions['store_nbr']==52) & (transactions['dayoff'] == True),['date','transactions']].set_index('date')\ndayly_transactions_dayoff = dayly_transactions_dayoff.transactions.astype('float')\nplt.figure(figsize=(12,4))\nplt.title('Ежедневные покупки 52')\nplt.xlabel('дата')\nplt.ylabel('Кол-во покупок')\nplt.plot(dayly_transactions_working, label='Рабочий день')\nplt.plot(dayly_transactions_dayoff, label='Выходной')\nplt.legend()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:18:21.918784Z","iopub.execute_input":"2023-12-13T18:18:21.919783Z","iopub.status.idle":"2023-12-13T18:18:24.362865Z","shell.execute_reply.started":"2023-12-13T18:18:21.919740Z","shell.execute_reply":"2023-12-13T18:18:24.361867Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Магазин 1 выглядит очень странно, давайте посмотрим на другие магазины из этого кластера","metadata":{}},{"cell_type":"code","source":"stores[stores['cluster'] == 13]","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:18:24.364220Z","iopub.execute_input":"2023-12-13T18:18:24.364972Z","iopub.status.idle":"2023-12-13T18:18:24.383547Z","shell.execute_reply.started":"2023-12-13T18:18:24.364928Z","shell.execute_reply":"2023-12-13T18:18:24.382250Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dayly_transactions_working = transactions.loc[(transactions['store_nbr']==2) & (transactions['dayoff'] == False),['date','transactions']].set_index('date')\ndayly_transactions_working = dayly_transactions_working.transactions.astype('float')\n\ndayly_transactions_dayoff = transactions.loc[(transactions['store_nbr']==2) & (transactions['dayoff'] == True),['date','transactions']].set_index('date')\ndayly_transactions_dayoff = dayly_transactions_dayoff.transactions.astype('float')\nplt.figure(figsize=(12,4))\nplt.title('Ежедневные покупки 2')\nplt.xlabel('дата')\nplt.ylabel('Кол-во покупок')\nplt.plot(dayly_transactions_working, label='Рабочий день')\nplt.plot(dayly_transactions_dayoff, label='Выходной')\nplt.legend()\nplt.show()\n\ndayly_transactions_working = transactions.loc[(transactions['store_nbr']==6) & (transactions['dayoff'] == False),['date','transactions']].set_index('date')\ndayly_transactions_working = dayly_transactions_working.transactions.astype('float')\n\ndayly_transactions_dayoff = transactions.loc[(transactions['store_nbr']==6) & (transactions['dayoff'] == True),['date','transactions']].set_index('date')\ndayly_transactions_dayoff = dayly_transactions_dayoff.transactions.astype('float')\nplt.figure(figsize=(12,4))\nplt.title('Ежедневные покупки 6')\nplt.xlabel('дата')\nplt.ylabel('Кол-во покупок')\nplt.plot(dayly_transactions_working, label='Рабочий день')\nplt.plot(dayly_transactions_dayoff, label='Выходной')\nplt.legend()\nplt.show()\n\ndayly_transactions_working = transactions.loc[(transactions['store_nbr']==53) & (transactions['dayoff'] == False),['date','transactions']].set_index('date')\ndayly_transactions_working = dayly_transactions_working.transactions.astype('float')\n\ndayly_transactions_dayoff = transactions.loc[(transactions['store_nbr']==53) & (transactions['dayoff'] == True),['date','transactions']].set_index('date')\ndayly_transactions_dayoff = dayly_transactions_dayoff.transactions.astype('float')\nplt.figure(figsize=(12,4))\nplt.title('Ежедневные покупки 53')\nplt.xlabel('дата')\nplt.ylabel('Кол-во покупок')\nplt.plot(dayly_transactions_working, label='Рабочий день')\nplt.plot(dayly_transactions_dayoff, label='Выходной')\nplt.legend()\nplt.show()\n\ndayly_transactions_working = transactions.loc[(transactions['store_nbr']==1) & (transactions['dayoff'] == False),['date','transactions']].set_index('date')\ndayly_transactions_working = dayly_transactions_working.transactions.astype('float')\n\ndayly_transactions_dayoff = transactions.loc[(transactions['store_nbr']==1) & (transactions['dayoff'] == True),['date','transactions']].set_index('date')\ndayly_transactions_dayoff = dayly_transactions_dayoff.transactions.astype('float')\nplt.figure(figsize=(12,4))\nplt.title('Ежедневные покупки 1')\nplt.xlabel('дата')\nplt.ylabel('Кол-во покупок')\nplt.plot(dayly_transactions_working, label='Рабочий день')\nplt.plot(dayly_transactions_dayoff, label='Выходной')\nplt.legend()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:18:24.386074Z","iopub.execute_input":"2023-12-13T18:18:24.386646Z","iopub.status.idle":"2023-12-13T18:18:26.283900Z","shell.execute_reply.started":"2023-12-13T18:18:24.386594Z","shell.execute_reply":"2023-12-13T18:18:26.282563Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Посмотрим на типы магазинов - будет ли такое же поведение у магазинов типа D как и у 1?","metadata":{}},{"cell_type":"code","source":"stores[stores['type'] == 'D']","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:18:26.285652Z","iopub.execute_input":"2023-12-13T18:18:26.286843Z","iopub.status.idle":"2023-12-13T18:18:26.307000Z","shell.execute_reply.started":"2023-12-13T18:18:26.286792Z","shell.execute_reply":"2023-12-13T18:18:26.305699Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dayly_transactions_working = transactions.loc[(transactions['store_nbr']==2) & (transactions['dayoff'] == False),['date','transactions']].set_index('date')\ndayly_transactions_working = dayly_transactions_working.transactions.astype('float')\n\ndayly_transactions_dayoff = transactions.loc[(transactions['store_nbr']==2) & (transactions['dayoff'] == True),['date','transactions']].set_index('date')\ndayly_transactions_dayoff = dayly_transactions_dayoff.transactions.astype('float')\nplt.figure(figsize=(12,4))\nplt.title('Ежедневные покупки 2 (тип D и в одном кластере с 1)')\nplt.xlabel('дата')\nplt.ylabel('Кол-во покупок')\nplt.plot(dayly_transactions_working, label='Рабочий день')\nplt.plot(dayly_transactions_dayoff, label='Выходной')\nplt.legend()\nplt.show()\n\ndayly_transactions_working = transactions.loc[(transactions['store_nbr']==8) & (transactions['dayoff'] == False),['date','transactions']].set_index('date')\ndayly_transactions_working = dayly_transactions_working.transactions.astype('float')\n\ndayly_transactions_dayoff = transactions.loc[(transactions['store_nbr']==8) & (transactions['dayoff'] == True),['date','transactions']].set_index('date')\ndayly_transactions_dayoff = dayly_transactions_dayoff.transactions.astype('float')\nplt.figure(figsize=(12,4))\nplt.title('Ежедневные покупки 8 (тип D)')\nplt.xlabel('дата')\nplt.ylabel('Кол-во покупок')\nplt.plot(dayly_transactions_working, label='Рабочий день')\nplt.plot(dayly_transactions_dayoff, label='Выходной')\nplt.legend()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:18:26.308623Z","iopub.execute_input":"2023-12-13T18:18:26.309078Z","iopub.status.idle":"2023-12-13T18:18:27.315577Z","shell.execute_reply.started":"2023-12-13T18:18:26.309012Z","shell.execute_reply":"2023-12-13T18:18:27.314268Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Не похоже","metadata":{}},{"cell_type":"markdown","source":"### Инсайты 1\n1. Есть старые магазины (видимо первые магазины сети в целом) и новые. У новых магазинов видно скачок продаж в первый день - например магазин 52 (может какой-то праздник открытие с акциями?). После открытия идет спад\n2. У старых магазинов видно явные пики на новый год. \n3. По магазинам 44 и 3 виден сильный спад в середине 2015 года. При этом они в одном штате, и в магазине 33 из другого штата такого спада нет. Может связано с каким-нибудь погодным катаклизмом в штате? Непонятно\n4. Очень странный спад в январе магазина 1. Возможно тоже внешние факторы (ну тогда бы это было у всех магазинов... или в зависимости от штата?)\n5. В выходные и праздники закупаются больше КРОМЕ магазина 1 - что странно. Возможно тут влияет расположение магазина - он находится где-нибудь рядом с офисом поэтому люди покупают там больше в рабочие дни. Хотя у других магазинов из этого кластера и/или типа такого нет (вопросы насколько полезна фича кластера, видимо магазины внутри кластера не так и похожи как заявлено в данных)\n\n","metadata":{}},{"cell_type":"markdown","source":"### Товары\nБудем смотреть данные c 2013 по 2016 год","metadata":{}},{"cell_type":"code","source":"from tqdm.auto import tqdm\ntqdm.pandas()","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:18:27.317704Z","iopub.execute_input":"2023-12-13T18:18:27.318310Z","iopub.status.idle":"2023-12-13T18:18:27.456683Z","shell.execute_reply.started":"2023-12-13T18:18:27.318238Z","shell.execute_reply":"2023-12-13T18:18:27.455526Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_year = train[(train['date'] >= '2013-01-01') & (train['date'] < '2016-01-01')]\ndel train","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:18:27.458785Z","iopub.execute_input":"2023-12-13T18:18:27.460647Z","iopub.status.idle":"2023-12-13T18:18:34.097313Z","shell.execute_reply.started":"2023-12-13T18:18:27.460585Z","shell.execute_reply":"2023-12-13T18:18:34.095964Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_year","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:18:34.102919Z","iopub.execute_input":"2023-12-13T18:18:34.103916Z","iopub.status.idle":"2023-12-13T18:18:34.126721Z","shell.execute_reply.started":"2023-12-13T18:18:34.103837Z","shell.execute_reply":"2023-12-13T18:18:34.125323Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_year.groupby(['item_nbr'])['unit_sales'].sum().sort_values(ascending=False)","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:18:34.128560Z","iopub.execute_input":"2023-12-13T18:18:34.129953Z","iopub.status.idle":"2023-12-13T18:18:36.550484Z","shell.execute_reply.started":"2023-12-13T18:18:34.129905Z","shell.execute_reply":"2023-12-13T18:18:36.549480Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Посмотрим продажи товаров по дням. Я пытался выбрать какой-то из очень популярных, средне популярных и редких судя по количеству продаж из датафрейма выше","metadata":{}},{"cell_type":"code","source":"item_sales = train_year.loc[train_year['item_nbr']==99197,['date','unit_sales']].set_index('date')\nplt.figure(figsize=(12,4))\n\nplt.title('Кол-во покупок товара 99197 (средне популярный)')\nplt.xlabel('дата')\nplt.ylabel('Кол-во покупок')\nplt.plot(item_sales)\nplt.show()\n\nitem_sales = train_year.loc[train_year['item_nbr']==1575252,['date','unit_sales']].set_index('date')\nplt.figure(figsize=(12,4))\n\nplt.title('Кол-во покупок товара 1575252 (очень редкий)')\nplt.xlabel('дата')\nplt.ylabel('Кол-во покупок')\nplt.plot(item_sales)\nplt.show()\n\nitem_sales = train_year.loc[train_year['item_nbr']==807493,['date','unit_sales']].set_index('date')\nplt.figure(figsize=(12,4))\n\nplt.title('Кол-во покупок товара 807493 (очень популярный)')\nplt.xlabel('дата')\nplt.ylabel('Кол-во покупок')\nplt.plot(item_sales)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:18:36.551982Z","iopub.execute_input":"2023-12-13T18:18:36.552672Z","iopub.status.idle":"2023-12-13T18:18:38.141888Z","shell.execute_reply.started":"2023-12-13T18:18:36.552631Z","shell.execute_reply":"2023-12-13T18:18:38.140583Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Очень странные пики, непонятно с чем связаны\n\nВ датасете нет нулей в таргете поэтому сложно сказать есть ли товары которые выводились из ассортимента или не было продаж долгое время. Но например\nтовар 1575252 явно продавался очень короткое время (нет данных после 2015 хотя мы берем до 2016)\n\nМожно сказать что есть товары которые покупают ежедневно (вода хлеб и какие нибудь яйца или типа того), а есть которые редко (сезонность? типа фрукты)\n\n","metadata":{}},{"cell_type":"code","source":"print('Всего фактов продаж / Возвраты за год')\nlen(train_year), len(train_year[train_year['unit_sales'] <=0])","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:18:38.143425Z","iopub.execute_input":"2023-12-13T18:18:38.143810Z","iopub.status.idle":"2023-12-13T18:18:38.256642Z","shell.execute_reply.started":"2023-12-13T18:18:38.143776Z","shell.execute_reply":"2023-12-13T18:18:38.255271Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Инсайты 2\n1. Есть товары которые продаются только одну неделю за все 4 года\n2. Есть сезонные товары = должны быть пики на праздники? Вроде на новый год.рождество есть что-то похожее\n3. Возвратов очень мало\n","metadata":{}},{"cell_type":"code","source":"train_year['onpromotion'] = train_year['onpromotion'].fillna(False)","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:18:38.258690Z","iopub.execute_input":"2023-12-13T18:18:38.259118Z","iopub.status.idle":"2023-12-13T18:18:51.191250Z","shell.execute_reply.started":"2023-12-13T18:18:38.259083Z","shell.execute_reply":"2023-12-13T18:18:51.189677Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_year['onpromotion'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:18:51.193067Z","iopub.execute_input":"2023-12-13T18:18:51.193505Z","iopub.status.idle":"2023-12-13T18:18:51.760263Z","shell.execute_reply.started":"2023-12-13T18:18:51.193453Z","shell.execute_reply":"2023-12-13T18:18:51.758700Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Сделаем очень плохой тест полезности фичи onpromotion на одной товаре. Я заменил NaN на False в значениях. Грубо посмотрим среднее самого популярного товара 807493\n\nСобственно это логично что при onpromotion=True товаров будет больше, фича может помочь в распознавании, берем","metadata":{}},{"cell_type":"code","source":"print('PROMOTION 99197')\nprint(train_year[(train_year['item_nbr'] == 99197) & (train_year['onpromotion'] == True)]['unit_sales'].mean())\nprint('NO PROMOTION 99197')\nprint(train_year[(train_year['item_nbr'] == 99197) & (train_year['onpromotion'] == False)]['unit_sales'].mean())\nprint()\n\nprint('PROMOTION 1575252')\nprint(train_year[(train_year['item_nbr'] == 1575252) & (train_year['onpromotion'] == True)]['unit_sales'].mean())\nprint('NO PROMOTION 1575252')\nprint(train_year[(train_year['item_nbr'] == 1575252) & (train_year['onpromotion'] == False)]['unit_sales'].mean())\nprint()\n\nprint('PROMOTION 807493')\nprint(train_year[(train_year['item_nbr'] == 807493) & (train_year['onpromotion'] == True)]['unit_sales'].mean())\nprint('NO PROMOTION 807493')\nprint(train_year[(train_year['item_nbr'] == 807493) & (train_year['onpromotion'] == False)]['unit_sales'].mean())\nprint()","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:18:51.762081Z","iopub.execute_input":"2023-12-13T18:18:51.762473Z","iopub.status.idle":"2023-12-13T18:18:53.292514Z","shell.execute_reply.started":"2023-12-13T18:18:51.762441Z","shell.execute_reply":"2023-12-13T18:18:53.291090Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Видимо некоторые товары не были на акциях/нет данных, но явно при акции покупают больше","metadata":{}},{"cell_type":"markdown","source":"### Итого\nСделаем ежедневный предикт. По идее к выходным должен быть скачок, тк. в часто люди закупаются на целую неделю на выходных, а так же к праздникам. Перед выходными и праздниками следует лучше следить за ассортиментов тк. это самое жирное для ритейлера время. (распродажи итд), а в будние спрос не такой большой и можно привезти меньше товара\n\nБудем использовать все товары. Так сможем учесть сезонный спрос на какие-то редкие но нужные товары (грубо говоря елочные игрушки нужны только в новый год, валентинки - на день святого валентина etc)\n\nВозвратов прям очень мало, мне кажется можно закрыть на них глаза (из 66458908 наблюдений с 2013 по 2016 всего 3916 фактов возвратов)\n\nМало данных по promotion\n\nЕсть редкие товары, а есть ежедневные, но мы будем пытаться предсказывать все\n\nТрейн очень большой, давайте возьмем только данные за 2015 год","metadata":{}},{"cell_type":"markdown","source":"## 3. 2. [25%] Сбор датасета\n\n- Определившись с таргетом, соберите свой тренировочный датасет. <br> Опишите, что вы в него решили включить.\n\n- Здесь же продложу проделать:\n    - EDA\n    - Feature Engineering","metadata":{}},{"cell_type":"code","source":"df = train_year[(train_year['date'] >= '2015-01-01') & (train_year['date'] < '2016-01-01')].copy()","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:19:01.244084Z","iopub.execute_input":"2023-12-13T18:19:01.244549Z","iopub.status.idle":"2023-12-13T18:19:03.911181Z","shell.execute_reply.started":"2023-12-13T18:19:01.244514Z","shell.execute_reply":"2023-12-13T18:19:03.909729Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:19:03.913406Z","iopub.execute_input":"2023-12-13T18:19:03.913816Z","iopub.status.idle":"2023-12-13T18:19:03.935654Z","shell.execute_reply.started":"2023-12-13T18:19:03.913778Z","shell.execute_reply":"2023-12-13T18:19:03.934247Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del train_year","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:20:20.784845Z","iopub.execute_input":"2023-12-13T18:20:20.785360Z","iopub.status.idle":"2023-12-13T18:20:20.823581Z","shell.execute_reply.started":"2023-12-13T18:20:20.785321Z","shell.execute_reply":"2023-12-13T18:20:20.821645Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Нормируем таргет логарифмом\n\ndf['unit_sales'] = df['unit_sales'].progress_apply(lambda x: np.log1p(float(x)) if float(x) > 0 else 0)","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:20:23.210622Z","iopub.execute_input":"2023-12-13T18:20:23.211246Z","iopub.status.idle":"2023-12-13T18:22:43.423915Z","shell.execute_reply.started":"2023-12-13T18:20:23.211188Z","shell.execute_reply":"2023-12-13T18:22:43.422500Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"events=holiday_events.loc[holiday_events.type=='Event']\nholiday_events=holiday_events.loc[holiday_events.type!='Event']\n\ndf['date'] = pd.to_datetime(df['date'])\n\ndf['day'] = df['date'].dt.dayofweek\ndf['month'] = df['date'].dt.month\ndf['year'] = df['date'].dt.year\ndf['dayoff'] = df['day'].isin([5, 6])","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:22:43.426414Z","iopub.execute_input":"2023-12-13T18:22:43.426812Z","iopub.status.idle":"2023-12-13T18:22:52.393988Z","shell.execute_reply.started":"2023-12-13T18:22:43.426777Z","shell.execute_reply":"2023-12-13T18:22:52.392620Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:22:52.395742Z","iopub.execute_input":"2023-12-13T18:22:52.396259Z","iopub.status.idle":"2023-12-13T18:22:52.423483Z","shell.execute_reply.started":"2023-12-13T18:22:52.396215Z","shell.execute_reply":"2023-12-13T18:22:52.422167Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"stores.type = stores.type.astype('category')\ndf = pd.merge(df,stores,how='left')","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:22:52.427352Z","iopub.execute_input":"2023-12-13T18:22:52.427874Z","iopub.status.idle":"2023-12-13T18:22:57.697746Z","shell.execute_reply.started":"2023-12-13T18:22:52.427825Z","shell.execute_reply":"2023-12-13T18:22:57.696538Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for (d,t,l,n) in zip(tqdm(holiday_events.date),holiday_events.type,holiday_events.locale,holiday_events.locale_name):\n    if t!='Work Day':\n        if l=='National':\n            df.loc[df.date==d,'dayoff']=True\n        elif l=='Regional':\n            df.loc[(df.date==d)&(df.state==n),'dayoff']=True\n        else:\n            df.loc[(df.date==d)&(df.city==n),'dayoff']=True\n    else:\n        df.loc[(df.date==d),'dayoff']=False","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:22:57.699186Z","iopub.execute_input":"2023-12-13T18:22:57.700195Z","iopub.status.idle":"2023-12-13T18:37:11.701111Z","shell.execute_reply.started":"2023-12-13T18:22:57.700154Z","shell.execute_reply":"2023-12-13T18:37:11.699595Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.to_parquet('df_full.parquet')","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:37:11.703413Z","iopub.execute_input":"2023-12-13T18:37:11.704086Z","iopub.status.idle":"2023-12-13T18:37:28.953678Z","shell.execute_reply.started":"2023-12-13T18:37:11.704041Z","shell.execute_reply":"2023-12-13T18:37:28.952276Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.read_parquet('/kaggle/working/df_full.parquet')","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:44:32.094076Z","iopub.execute_input":"2023-12-13T18:44:32.094822Z","iopub.status.idle":"2023-12-13T18:44:37.508578Z","shell.execute_reply.started":"2023-12-13T18:44:32.094779Z","shell.execute_reply":"2023-12-13T18:44:37.507027Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### EDA","metadata":{}},{"cell_type":"code","source":"df.head()","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:37:36.666397Z","iopub.execute_input":"2023-12-13T18:37:36.666773Z","iopub.status.idle":"2023-12-13T18:37:36.691243Z","shell.execute_reply.started":"2023-12-13T18:37:36.666739Z","shell.execute_reply":"2023-12-13T18:37:36.689700Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df['store_nbr'].value_counts().plot.bar(\n    title = 'Транзакции по магазинам',\n    figsize=(12,5)\n)","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:37:36.692932Z","iopub.execute_input":"2023-12-13T18:37:36.693331Z","iopub.status.idle":"2023-12-13T18:37:37.819941Z","shell.execute_reply.started":"2023-12-13T18:37:36.693297Z","shell.execute_reply":"2023-12-13T18:37:37.818655Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df['dayoff'].value_counts().plot.bar(\n    title = 'Распределение выходных',\n)","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:37:37.825306Z","iopub.execute_input":"2023-12-13T18:37:37.825798Z","iopub.status.idle":"2023-12-13T18:37:38.464086Z","shell.execute_reply.started":"2023-12-13T18:37:37.825759Z","shell.execute_reply":"2023-12-13T18:37:38.463039Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.groupby('onpromotion')['unit_sales'].mean().plot.bar(\n    title = 'Средние продажи в зависимости от акции',\n    \n)","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:37:38.465759Z","iopub.execute_input":"2023-12-13T18:37:38.467061Z","iopub.status.idle":"2023-12-13T18:37:39.467299Z","shell.execute_reply.started":"2023-12-13T18:37:38.467009Z","shell.execute_reply":"2023-12-13T18:37:39.466127Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Feature engineering\nЯ сюда включил разные статистические фичи которые часто используются в похожих задачах (средние за разные периоды, лаги, средние в зависимости от параметров напр. есть акция или нет)","metadata":{}},{"cell_type":"code","source":"%%time\n\n# Группировка по магазинам и товарам\navg_sales_per_store_item = df.groupby(['store_nbr', 'item_nbr'])['unit_sales'].mean().reset_index()\ntotal_sales_per_store_item = df.groupby(['store_nbr', 'item_nbr'])['unit_sales'].sum().reset_index()\n\ndf = pd.merge(df, avg_sales_per_store_item, on=['store_nbr', 'item_nbr'], how='left', suffixes=('', '_avg'))\ndf = pd.merge(df, total_sales_per_store_item, on=['store_nbr', 'item_nbr'], how='left', suffixes=('', '_total'))\n\n# Группировка по акциям\navg_sales_on_promotion = df.groupby(['store_nbr', 'item_nbr', 'onpromotion'])['unit_sales'].mean().reset_index()\navg_sales_on_promotion.columns = ['store_nbr', 'item_nbr', 'onpromotion', 'avg_sales_on_promotion']\n\ndf = pd.merge(df, avg_sales_on_promotion, on=['store_nbr', 'item_nbr', 'onpromotion'], how='left')\n\n# Создание лагов продаж\ndf['lag_1'] = df.groupby(['store_nbr', 'item_nbr'])['unit_sales'].shift(1)\ndf['lag_2'] = df.groupby(['store_nbr', 'item_nbr'])['unit_sales'].shift(2)\ndf['lag_5'] = df.groupby(['store_nbr', 'item_nbr'])['unit_sales'].shift(5)\ndf['lag_7'] = df.groupby(['store_nbr', 'item_nbr'])['unit_sales'].shift(7)\n\n# Создание лагов продаж для различных периодов\ndf['avg_sales_prev_week'] = df.groupby(['store_nbr', 'item_nbr'])['unit_sales'].shift(7).rolling(window=7).mean()\ndf['avg_sales_prev_month'] = df.groupby(['store_nbr', 'item_nbr'])['unit_sales'].shift(30).rolling(window=30).mean()\ndf['avg_sales_prev_quarter'] = df.groupby(['store_nbr', 'item_nbr'])['unit_sales'].shift(90).rolling(window=90).mean()\n\n# Группировка по дням недели\navg_sales_per_day_of_week = df.groupby('day')['unit_sales'].mean().reset_index()\navg_sales_per_day_of_week.columns = ['day', 'avg_sales_per_day_of_week']\n\ndf = pd.merge(df, avg_sales_per_day_of_week, on='day', how='left')\n\n# Группировка по выходным и будням\navg_sales_weekend = df.groupby('dayoff')['unit_sales'].mean().reset_index()\navg_sales_weekend.columns = ['dayoff', 'avg_sales_weekend']\n\ndf = pd.merge(df, avg_sales_weekend, on='dayoff', how='left')\n\n# Категориальные фичи\ndf['type'] = df['type'].cat.codes\ndf['city'] = pd.Categorical(df['city']).codes\ndf['state'] = pd.Categorical(df['state']).codes\ndf['dayoff'] = pd.Categorical(df['dayoff']).codes\ndf['onpromotion'] = pd.Categorical(df['onpromotion']).codes","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:45:22.504522Z","iopub.execute_input":"2023-12-13T18:45:22.504994Z","iopub.status.idle":"2023-12-13T18:46:48.327788Z","shell.execute_reply.started":"2023-12-13T18:45:22.504958Z","shell.execute_reply":"2023-12-13T18:46:48.326760Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 3. 3. [25%] Training and Validation\n\nНа занятии мы обсуждали три пакета-реализации градиентного бустинга. Попробуйте применить любой из них с дефолтными параметрами ИЛИ любую удобную вам реализацию бустинга для обучения модели. Все детали обучения - на ваше усмотрение (функция ошибок, метрика качества).\n\nПомните: модели, обученные на данных с временной структурой, не корректно валидировать k-fold-кросс-валидацией и обсудили две альтернативы. Не забудьте организовать корректные разбиения данных под будущее ","metadata":{}},{"cell_type":"code","source":"import xgboost as xgb\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import mean_squared_error\n\nfeatures = [\n 'store_nbr',\n 'item_nbr',\n 'onpromotion',\n 'day',\n 'month',\n 'year',\n 'dayoff',\n 'city',\n 'state',\n 'type',\n 'cluster',\n 'unit_sales_avg',\n 'unit_sales_total',\n 'avg_sales_on_promotion',\n 'lag_1',\n 'lag_2',\n 'lag_5',\n 'lag_7',\n 'avg_sales_prev_week',\n 'avg_sales_prev_month',\n 'avg_sales_prev_quarter',\n 'avg_sales_per_day_of_week',\n 'avg_sales_weekend'\n]\ntarget = 'unit_sales'\n\ntrain_df, test_df = train_test_split(df, test_size=0.2, random_state=42)\ntrain_data = xgb.DMatrix(train_df[features], label=train_df[target])\ntest_data = xgb.DMatrix(test_df[features], label=test_df[target])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"params = {'objective': 'reg:squarederror', 'max_depth': 6, 'learning_rate': 0.1, 'n_estimators': 100}\nmodel = xgb.train(params, train_data, num_boost_round=10)\npredictions = model.predict(test_data)\n\nrmse = mean_squared_error(test_df[target], predictions, squared=False)\nprint(f'RMSE: {rmse}')","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:40:18.217370Z","iopub.execute_input":"2023-12-13T18:40:18.217796Z","iopub.status.idle":"2023-12-13T18:41:23.377590Z","shell.execute_reply.started":"2023-12-13T18:40:18.217762Z","shell.execute_reply":"2023-12-13T18:41:23.376086Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 3. 4.  [10%] Discussion\n\nЧто получилось? Какого качества модель? Довольны ли вы результатами? Сравните качество, например, со случайным лесом на 100 деревьях. Что лучше-хуже? ","metadata":{}},{"cell_type":"markdown","source":"RMSE 0.557917, в целом получилось хорошо, лучше бейзлайна Mean Item Sales Benchmark 0.72603","metadata":{"execution":{"iopub.status.busy":"2023-12-13T17:40:57.603236Z","iopub.execute_input":"2023-12-13T17:40:57.603794Z","iopub.status.idle":"2023-12-13T17:40:57.619766Z","shell.execute_reply.started":"2023-12-13T17:40:57.603755Z","shell.execute_reply":"2023-12-13T17:40:57.617777Z"}}},{"cell_type":"markdown","source":"Лес не влезает в память, обучим на подвыборке в 100к","metadata":{}},{"cell_type":"code","source":"train_forest = train_df[:100000].fillna(0)","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:59:29.294105Z","iopub.execute_input":"2023-12-13T18:59:29.294600Z","iopub.status.idle":"2023-12-13T18:59:29.312368Z","shell.execute_reply.started":"2023-12-13T18:59:29.294565Z","shell.execute_reply":"2023-12-13T18:59:29.310429Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\n\nfrom sklearn.ensemble import RandomForestRegressor\nregr = RandomForestRegressor(max_depth=2, random_state=0, verbose=1)\nregr.fit(train_forest[features].fillna(0), train_df[target][:100000])","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:59:29.596400Z","iopub.execute_input":"2023-12-13T18:59:29.597664Z","iopub.status.idle":"2023-12-13T18:59:47.271590Z","shell.execute_reply.started":"2023-12-13T18:59:29.597613Z","shell.execute_reply":"2023-12-13T18:59:47.270176Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"forest_preds = regr.predict(test_df[features].fillna(0))\nrmse = mean_squared_error(test_df[target], forest_preds, squared=False)\nprint(f'RMSE: {rmse}')","metadata":{"execution":{"iopub.status.busy":"2023-12-13T18:59:56.147299Z","iopub.execute_input":"2023-12-13T18:59:56.147742Z","iopub.status.idle":"2023-12-13T19:00:12.723652Z","shell.execute_reply.started":"2023-12-13T18:59:56.147708Z","shell.execute_reply":"2023-12-13T19:00:12.722121Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Лес получился чуть лучше, но совсем чуть чуть","metadata":{}},{"cell_type":"markdown","source":"## 3. 6. [Не обязательная часть] Tuning\n\nПопробуйте настроить гиперпараметры бустинга, чтобы добиться лучшего качества.\n","metadata":{}}]}