{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Интервалы\n",
    "\n",
    "Превратить числа в группы: pd.cut делит по заданным границам и подписывает интервалы, pd.qcut — на равные по числу строк части. Как читать запись (0, 15], что происходит на границах и за ними.\n",
    "\n",
    "Курс pandas · урок `pd-cut` · [урок на сайте](https://ds-edu-trainer.vercel.app/courses/pandas/cut).\n",
    "\n",
    "Выполняйте ячейки по порядку (Shift+Enter), начиная с первой — она готовит урок. После каждого упражнения идёт\n",
    "ячейка проверки: она печатает ✓ / ✗ и итог."
   ],
   "id": "intro"
  },
  {
   "cell_type": "code",
   "metadata": {
    "cellView": "form",
    "jupyter": {
     "source_hidden": true
    }
   },
   "source": [
    "# @title Подготовка урока — выполните эту ячейку первой\n",
    "# Проверяет версии пакетов, записывает файлы данных в папку data/ и определяет _check — проверку упражнений.\n",
    "import base64, os, zlib\n",
    "\n",
    "for _name, _min in {\"numpy\":\"2.0\",\"pandas\":\"3.0\"}.items():\n",
    "    try:\n",
    "        _have = __import__(_name).__version__\n",
    "    except ImportError:\n",
    "        print(f\"Нет пакета {_name}: выполните %pip install {_name} и перезапустите ядро\")\n",
    "        continue\n",
    "    if tuple(int(x) for x in _have.split(\".\")[:2]) < tuple(int(x) for x in _min.split(\".\")):\n",
    "        print(f\"Урок написан для {_name} {_min} и новее, у вас {_have}: выполните %pip install -U {_name} и перезапустите ядро\")\n",
    "\n",
    "_DATA = {\n",
    "    \"weather.csv\": \"\"\"\n",
    "eNqVfUuuBr1x3dxr+e4Fi2+uRjBsDTSQISQCkswke5BJVhDYCLwD2YERQUC0hvvvKGhWdbNOVb8yuMAd8OtuksVTxWKdw7//29//\n",
    "+vN3v/n9f/v8/te//d2vfvubf5B//va/fn73n379d7/53a9++9vPf/nNP/z9r377n/8mhli+An0F+vz8889ff/njz19+/v3nT5+v\n",
    "8T0+X+k7fsJ3+ND3WC2ja9lWy/idVsvkWoatZZsty3dcLbNpSfk7fr7ad/zQd97+VtNim8bvyk23pybdtPqmeWvaP5+q3958u/75\n",
    "6t9BHllX026a9u/y+crHy9tqOUzLtnV+e3D4Tp/0TUdLCqZl3YaejmeuoafTSSqzJX3qd1kt/SSl7e1NnrkmidLZM/M3fWhO5+o7\n",
    "uUkK2yTl7+RGnop7KG2vz2IjfbWsbpjy1nJ75vaxa0CpuaHP2zD1T/8eOEzdvb3w0MdtVKH34+yh6WTsYzh7aJofus3pGqdIrkt9\n",
    "e/32vG0prZmP8ezt8XvIolvDFJNrORddkZZr6GN21lR5mOzQRztJWUadvtMnfofV0M/RfDnPZtMvb95EZtPuTCT2+x6p8Rz+oYVN\n",
    "NBgTTX6S+rZAtj71T1FDn+gURro8NB3wED00Utia7u9vx5DGM2yktezaYc3RY2PlqQ+CjXW1zHct07Hoo4fGzpCzgSgps48eGQXt\n",
    "mzH76LFxG6FjmorukZ1Qou2hdT6wKxSNHht5RIs8NainOnDkplVAh1T3T9Axbw/dHlg+RbeMfvIj28n20KpGysEjBcbHLstk9YpO\n",
    "nNiQJYB+JHqApLS1bUdT9bHVNw3bCHSZgjVZDiJpm/iv8k3bwscP6GcrJX+XD239ynoKhn9q3j5g9/iraQwX679tgALmEunU6ZZj\n",
    "YNccOJikDXYnsG3eYvnS6HGSm3bBKlKD5YCSiGGlb570Ew+sih4pO9tA2cYJH1rPQ578KdPrq2c2B6rl8xUm9m9/C1QcUpaJPMWM\n",
    "fnJAFb7zJ3/XzxajrNWfPEptC3WPYVZglDxIbZOY5+zooCx5jErT5La52UaSVkPvc3i+cTEnj1BZnrh1vulvbA4e2zaOZQNmZUbJ\n",
    "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\n",
    "qWhMbohc9XDjykveq5Bahq5oTwriuDhFd9xV7TF7YYfboV9/wYXJM/DKukvtvES0Yu6QTmgW8+SJ3SqO+zhZEpFjj7FSDnRCskjz\n",
    "vR3zMnRCnJAC0faRk6/V8qzkNcz0oh73E9oEn/5HY8MnrInOljm7siJ2OmFNbIP9xQmxDeDCalnP6TrcEp7Zzg3J7L0onhUlE39n\n",
    "14WndEKa2GK4o4CY1Lg7dJtvj0e9bVstyfWoc90ke4nVI7pdREV9J51SlbhyvK/NAJ0QJsbOK0rTV+XVspz0PRyZSFoN69m0x6N8\n",
    "Sj2ynX9mx6IoOqFKEDFbhU9vV0ELnXElto5LxX5Y+U064Up0TZUiNUvxhIDU2fS5FG+9/6Q6ubCL6XO9p9UynTEZeWPXYPBjvmJq\n",
    "8XHBGqkTngRps1ddqmdEqWSzLRRPKWV9sQ6r/tDumxIzkMKshlBPHae0nnps/ZeVpnD61DwDNAKbSnS2mKMNcIVu+68/f/r5vz9/\n",
    "+eUfv37+189//PKPP//xyx9+/u2Xf/rlDz//26yvqNmq8emnk50SDz4HEnLvfxpnjGYrXDhIvP9lkjo0zJZx1Pj0uQqdCNi29em3\n",
    "M/v1ld2BNkeX978Vbl6dxtH0J/fH126I8lUE+Yse4vHukzk/oUt+OCp9+K2Q3/aSP6QGP/xWKNV7qSIBWfjxt12zqArQh9+NVZ+b\n",
    "AGAJ5xdjlZmLgcVZHPU+TW9gjJRKiwGc4yeTTIxGaR6yJiAhP70270AWsbf9ecnXPdrUSVIOnp9W3xAaVXas5aeXpvVSzbeO9GJm\n",
    "lW/rapjiC4zK++LTHEaOwR8XQWEHQBXOuDgsf/xx5OGKQE3jQP3xt5NNOUwtJ0fuj79tuytSXks4008m1XeakRmr/vzTounXDUjV\n",
    "b7Bm9bYDy/r/p7dBjVSiF2u+LauqmjZMz91N+847A4Pz2WnOtP/BqtX002evOQ9LvsaRhUHy9uNQ9e29ZcZdpMnk5d1v8xEkEBC8\n",
    "H4c5remFsWov3jv2/XYADvSz65y7FjroWxlI4U8/lY2ZY36H558OzoBBXkJI408hUZ+emiZmdCCRv3op54Gyfml6NuS2TSzX2GRN\n",
    "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\n",
    "\"\"\",\n",
    "    \"delivery_h1.csv\": \"\"\"\n",
    "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\n",
    "/J3UMnmxBTOmFnAnbFvg+D3/J/0DpZ50FA==\n",
    "\"\"\",\n",
    "    \"shop_orders.csv\": \"\"\"\n",
    "eNrNvcuudclxHjjvp6gHOAQy8p5jPoghUIRbQLfkZlMDzapIAzJgArIGDQOCG4YvgHtioESpJKrIKr3CPm9krFzn3ztiX1bGbR31\n",
    "jKw6Fd/Oy4rMjIjviz/7xR///Bf/6k/++O2P/+iXP3/72Z//37/8s/9z/wc/+5Nf/sXbz/73P/rTP/35//H2sz/65c//9Z/94i/e\n",
    "/s0v/uyP//xnv3z7N7/4k5/9/O3/+vM/+tNf/skv/+J/gxACvMUQy08C/CTA20/DKG+X/3T58f2by/eX316+fbv84fLt+9eX7y/f\n",
    "vf/q8s+X31++u/zT+zdvl/9w+f79m8t379+8f/P+6+1P3v/92+VvLj++/9vLd5c/XH68/P7y/eXbr96/fv/1+19efrh8+/5XbymG\n",
    "8BYtqP/j8u3ln94u//X968u3l9++/9Xlh8uPl3/66v2by99efnz/+qsSvrr83Vus4Q0mTKQwZdzB/PP715ffXX5/+fHyD5fvLj9c\n",
    "fnf57u3yXy6/v3x7+fvt795/dfnd2+X/u/x4+X4O6dvL3391+bsN6v03l+8vv7v80xt0E9jHiP7H+1+/f3354f3fb6P5y+2ffQVh\n",
    "DiaVL/YTsR9D2ib828s/Xr69/PD+m7f3b7b/7P1X12V4u/zP9397+d3lx8s/X373/ldfxX122hAb/PiR/+3y+/dfX3748stK/rKa\n",
    "+WYovv005KKa5v94+W77ve9fv0X4YrlQy+nuJ560OytBhRS2X/vt5YfL9++/+snlP0+0796/vvzt+6/fv7783eNMMTZonUiNIrW6\n",
    "QHo+ldcF/5ttaO+/vvzh8rd4yesIb2ni9Rteevvp9h1e/p9tKj5gfnf5YQH1sGr/af5Hf3/59vL79998dfntV+//Dn8ul++2if1A\n",
    "HxS9FdVoP+b4P16+u/z+/a+ffzTjY4K3jYQhe+A5mv88B/jrbVzbav56/s23X13+cPnu8vcfGybm8DEwAIoyIm+bLj6B3XaktmN6\n",
    "u/y/lx8vv52j+N1c6K+38TD2xvY/vrr87eW7yz9+tS3R/By25fv26hzih3Nwg/2f79/Mv5gf4+XHn7x/s03i+zfvv/kKth/xd2+Q\n",
    "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\n",
    "UiSIjXm1V+48DZRBYA+QQkGcecMu3emLTecGwLqeIQ2EDW1z567EFA3A8XMFqQ7s81PP0DuabwmkPjB/e3eMonCUMsHxR7AjAkjE\n",
    "YOIp9TLZimtegCJCm/MoObUBgOQUYmflWo2pECR6EKd4Rj9LDsQEx9+Zt5MzbUmqWBxKNgAJG6Snwg1WAiVYUPiXZiMCN6WBdBMS\n",
    "sCucJUeSCeFFAQIgBYVp9BRJgx0pEaTHklBjLPAqXhCnpPT2VWiycbzApg6MV9YMV+mC3XhQlzUvH0fznLlKDXyMpZoCHvvH0O5G\n",
    "cJZIa/RBW+RHiuuYXl1wr2oBHwDrXJxW2xyuhP4PqAfRaPOhfqXfx11dPFqrQPgF0nBlyccPTfjqfOBqAdjiHHAl3X8gfGJe9mR8\n",
    "yTp6/Qj+1fAqFxCftxPgRDOmUy2Z7v82XKgpYLHNPH4KOn7Ss1J0tfnkZJ4fCCuVgMFRiY5R1x1Ko1g1sgR1DnkBAqOCTd7pCsSi\n",
    "IOfwaWxqPP7dr4y7Wco2pSGo4e4ne2rqND2CTrEQKtD5ycmPpTvdXUWuOnOCt/Yh6RFlXACo6EwoHHUU1xsNOP6ExQXUCUXlqGsm\n",
    "2I5EVKF5STi/FmJ1Kxpaxthl4ZGKzq+Nnxu6Q1LkMFftj3h8HaiN4i1XhnF7rp3aTCqpEcHuGgTPX7ZdicAopYcW7ta7nSRHER3R\n",
    "hKn+ho6/xlQJkayOwT5jN7dIrS9lzNnTwjbM9h4tUZPWKnXG3c8bkrfi+W7qklqAiodXKJ740STLhbdK4VL4vOiNFZv/Ecyba2sE\n",
    "bl1w5Po+dUNfFFc0dCL2J4V5TrVzfBj+a7UNYhO4/TrZPqsH+qODc9emOTMdCMiDroJVzQ96vBuFtnxGEJzoiS5NKvpX35Modc90\n",
    "zuR6bhxBCujlDiYpKmV4aaNeKdQAO/lBbPOVj+Ab4nxaM2fSkXtj0agVVw4DhiSh0TuFkSrNCUqz+83jWWTmX6V8ncyzZm0EgvXw\n",
    "blHkFhUmj1+g4+aap7r1JrV+Go1zRAoG6cQs9UgU7DVBTBaV4Nvlv3JGJja3RqLiGzX/UjEKQZNyCRZ6nTBurhQ02U/BtN28HyRz\n",
    "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\n",
    "\"\"\",\n",
    "}\n",
    "os.makedirs(\"data\", exist_ok=True)\n",
    "for _name, _packed in _DATA.items():\n",
    "    with open(os.path.join(\"data\", _name), \"wb\") as _f:\n",
    "        _f.write(zlib.decompress(base64.b64decode(_packed)))\n",
    "print(\"Файлы данных:\", \", \".join(sorted(_DATA)))\n",
    "\n",
    "# ─── Проверка упражнений: тот же раннер, что у задач на сайте ───\n",
    "# ─── Запуск тестов ───────────────────────────────────────────────────────────\n",
    "\n",
    "_TIMEOUT = 2.0  # секунд на тест; отдельный тест может задать свой: test_x.timeout = 10\n",
    "\n",
    "\n",
    "def _call_with_timeout(target, seconds: float) -> bool:\n",
    "    \"\"\"Запускает target() в отдельном потоке. Возвращает False, если за seconds он не завершился.\"\"\"\n",
    "    import sys\n",
    "    import threading\n",
    "\n",
    "    if sys.platform == \"emscripten\":  # Python в браузере: потоков нет, таймаут обеспечивает страница\n",
    "        target()\n",
    "        return True\n",
    "    # Большой стек нужен, чтобы глубокая рекурсия давала RecursionError, а не аварийное завершение Python.\n",
    "    for megabytes in (256, 64, 0):\n",
    "        try:\n",
    "            threading.stack_size(megabytes * 1024 * 1024)\n",
    "            worker = threading.Thread(target=target, daemon=True)\n",
    "            worker.start()\n",
    "        except (ValueError, RuntimeError, MemoryError):\n",
    "            continue\n",
    "        worker.join(seconds)\n",
    "        return not worker.is_alive()\n",
    "    target()  # потоки недоступны — запускаем без таймаута\n",
    "    return True\n",
    "\n",
    "\n",
    "def _test_info(fn) -> dict:\n",
    "    \"\"\"Описание теста, его лимит времени и сообщение на случай зависания.\"\"\"\n",
    "    limit = getattr(fn, \"timeout\", _TIMEOUT)\n",
    "    hint = getattr(fn, \"timeout_hint\", \"\")\n",
    "    message = (\n",
    "        f\"тест не завершился за {limit:g} с — возможно, бесконечный цикл или рекурсия: \"\n",
    "        \"проверьте, что границы/аргументы изменяются на каждом шаге\" + (f\". {hint}\" if hint else \"\")\n",
    "    )\n",
    "    return {\"title\": (fn.__doc__ or fn.__name__).strip(), \"timeout\": limit, \"timeout_message\": message}\n",
    "\n",
    "\n",
    "def _error_result(title: str, error: BaseException, user_file: str | None) -> dict:\n",
    "    \"\"\"Результат упавшего теста: статус, сообщение, тип исключения и строка в коде решения.\"\"\"\n",
    "    line = None\n",
    "    if user_file:  # самый глубокий кадр в коде решения; ошибка внутри самих тестов — без номера строки\n",
    "        tb = error.__traceback__\n",
    "        while tb is not None:\n",
    "            if tb.tb_frame.f_code.co_filename == user_file:\n",
    "                line = tb.tb_lineno\n",
    "            tb = tb.tb_next\n",
    "    status, message = \"error\", f\"{type(error).__name__}: {error}\"\n",
    "    if isinstance(error, NotImplementedError):\n",
    "        status, message, line = \"not_written\", \"функция ещё не написана\", None\n",
    "    elif isinstance(error, AssertionError):\n",
    "        status, message = \"failed\", str(error) or \"проверка не прошла\"\n",
    "    elif isinstance(error, RecursionError):\n",
    "        message = \"RecursionError: слишком глубокая рекурсия — проверьте базовый случай и то, что задача уменьшается\"\n",
    "    elif isinstance(error, MemoryError) or (isinstance(error, OverflowError) and \"index-sized\" in str(error)):\n",
    "        message = f\"{type(error).__name__}: не хватило памяти — возможно, создаётся слишком большая структура данных\"\n",
    "    return {\"title\": title, \"status\": status, \"message\": message, \"error_type\": type(error).__name__, \"line\": line}\n",
    "\n",
    "\n",
    "def _run_tests(verbose: bool = True, on_start=None, on_result=None, user_file: str | None = None) -> list[dict]:\n",
    "    \"\"\"Запускает тесты задачи (_TESTS — функции из tests.py) по порядку, каждый — с таймаутом.\n",
    "\n",
    "    Возвращает список результатов: {\"title\", \"status\", \"message\", \"error_type\", \"line\"}, где status —\n",
    "    passed · failed · error · not_written · timeout · not_run. Если тест завис, при verbose=True печатает\n",
    "    итог и завершает процесс: зависший поток остановить нельзя. on_start(i) и on_result(i, результат)\n",
    "    вызываются по мере выполнения; user_file — имя файла с кодом решения для номеров строк в ошибках.\n",
    "    \"\"\"\n",
    "    import os\n",
    "    import sys\n",
    "\n",
    "    if verbose:\n",
    "        try:  # ✓ и кириллица в консоли Windows со старой кодировкой\n",
    "            sys.stdout.reconfigure(encoding=\"utf-8\")\n",
    "        except Exception:  # noqa: BLE001 — reconfigure может не быть (перенаправленный вывод, браузер)\n",
    "            pass\n",
    "\n",
    "    tests = list(_TESTS)\n",
    "    results: list[dict] = []\n",
    "    not_written = hung = False\n",
    "    for index, fn in enumerate(tests):\n",
    "        info = _test_info(fn)\n",
    "        outcome: dict = {}\n",
    "\n",
    "        def target(fn=fn, outcome=outcome):\n",
    "            try:\n",
    "                fn()\n",
    "            except BaseException as e:\n",
    "                outcome[\"error\"] = e\n",
    "\n",
    "        if on_start:\n",
    "            on_start(index)\n",
    "        if not _call_with_timeout(target, info[\"timeout\"]):\n",
    "            results.append({\"title\": info[\"title\"], \"status\": \"timeout\", \"message\": info[\"timeout_message\"], \"error_type\": None, \"line\": None})\n",
    "            for other in tests[index + 1:]:\n",
    "                results.append({\"title\": _test_info(other)[\"title\"], \"status\": \"not_run\", \"message\": \"не запускался: предыдущий тест завис\", \"error_type\": None, \"line\": None})\n",
    "            hung = True\n",
    "            break\n",
    "        error = outcome.get(\"error\")\n",
    "        if error is None:\n",
    "            result = {\"title\": info[\"title\"], \"status\": \"passed\", \"message\": \"\", \"error_type\": None, \"line\": None}\n",
    "        else:\n",
    "            result = _error_result(info[\"title\"], error, user_file)\n",
    "            not_written = not_written or result[\"status\"] == \"not_written\"\n",
    "        results.append(result)\n",
    "        if on_result:\n",
    "            on_result(index, result)\n",
    "\n",
    "    if not_written:  # пока функция не написана, «даром» пройденные тесты не засчитываются\n",
    "        for r in results:\n",
    "            if r[\"status\"] == \"passed\":\n",
    "                r.update(status=\"not_written\", message=\"не засчитан, пока функция не написана\")\n",
    "    for r in results:\n",
    "        if len(r[\"message\"]) > 300:\n",
    "            r[\"message\"] = r[\"message\"][:300] + \"…\"\n",
    "\n",
    "    if verbose:\n",
    "        if not_written:\n",
    "            print(\"Функция ещё не написана — замените raise NotImplementedError своим кодом.\\n\")\n",
    "        for r in results:\n",
    "            mark = {\"passed\": \"✓\", \"not_run\": \"–\"}.get(r[\"status\"], \"✗\")\n",
    "            print(f\"{mark} {r['title']}\")\n",
    "            if r[\"message\"]:\n",
    "                print(f\"    {r['message']}\")\n",
    "        passed = sum(r[\"status\"] == \"passed\" for r in results)\n",
    "        print(\"─\" * 40)\n",
    "        print(f\"Прошло {passed} из {len(results)}\" + (\" — всё верно!\" if passed == len(results) else \"\"))\n",
    "        if hung:\n",
    "            print(\"Выполнение остановлено: один из тестов завис.\")\n",
    "            sys.stdout.flush()\n",
    "            os._exit(1)\n",
    "    return results\n",
    "\n",
    "\n",
    "def _check(*tests, names=()):\n",
    "    \"\"\"Запускает проверки упражнения и печатает ✓ / ✗ и итог — как на сайте.\"\"\"\n",
    "    for name in names:\n",
    "        if \".\" in name:  # «Класс.метод» из заготовки: класс должен быть объявлен\n",
    "            if not isinstance(globals().get(name.split(\".\")[0]), type):\n",
    "                print(f\"✗ класс {name.split('.')[0]} не объявлен — выполните ячейку упражнения\")\n",
    "                return\n",
    "            continue\n",
    "        if name not in globals():\n",
    "            print(f\"✗ переменная {name} не создана — выполните ячейку упражнения\")\n",
    "            return\n",
    "        if globals()[name] is Ellipsis:\n",
    "            print(f\"✗ {name} пока равна ... — замените многоточие своим кодом\")\n",
    "            return\n",
    "    globals()[\"_TESTS\"] = list(tests)\n",
    "    _run_tests()"
   ],
   "execution_count": null,
   "outputs": [],
   "id": "setup"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Точная температура — 17.3 или 18.1 градуса — нужна редко. Обычно хватает «прохладно», «тепло», «жарко».\n",
    "Так же с ценами («дешёвые», «средние», «дорогие»), возрастом, сроками. Превращение чисел в группы по\n",
    "интервалам — частая операция, и для неё есть готовая функция.\n",
    "\n",
    "## pd.cut: свои границы\n",
    "\n",
    "`pd.cut` получает столбец и список границ `bins`. Четыре интервала задают пять границ:"
   ],
   "id": "text-10"
  },
  {
   "cell_type": "code",
   "metadata": {},
   "source": [
    "# Дневной максимум — по интервалам\n",
    "import pandas as pd\n",
    "\n",
    "weather = pd.read_csv(\"data/weather.csv\", parse_dates=[\"date\"])\n",
    "moscow = weather[weather[\"city\"] == \"Москва\"].copy()\n",
    "pd.cut(moscow[\"temp_max\"], bins=[-50, 0, 15, 25, 50]).head(3)"
   ],
   "execution_count": null,
   "outputs": [],
   "id": "intervals"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Вместо температуры в каждой строке теперь **интервал**. Запись `(-50, 0]` читается как в математике: круглая\n",
    "скобка — граница не входит, квадратная — входит. То есть «больше −50 и не больше 0».\n",
    "\n",
    "Тип результата — `category`, **категория**: значение из заранее известного набора. Строка `Categories` внизу\n",
    "перечисляет набор, а знаки `<` показывают, что у категорий есть порядок."
   ],
   "id": "text-20"
  },
  {
   "cell_type": "code",
   "metadata": {},
   "source": [
    "# Сколько дней в каждом интервале\n",
    "pd.cut(moscow[\"temp_max\"], bins=[-50, 0, 15, 25, 50]).value_counts().sort_index()"
   ],
   "execution_count": null,
   "outputs": [],
   "id": "interval-counts"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Порядок пригодился: `sort_index` расставил интервалы по шкале — от холодных к тёплым.\n",
    "\n",
    "Интервалам можно дать названия — параметром `labels`. Названий должно быть на одно меньше, чем границ:"
   ],
   "id": "text-28"
  },
  {
   "cell_type": "code",
   "metadata": {},
   "source": [
    "# Подписи вместо интервалов\n",
    "names = [\"ниже нуля\", \"прохладно\", \"тепло\", \"жарко\"]\n",
    "moscow[\"kind\"] = pd.cut(moscow[\"temp_max\"], bins=[-50, 0, 15, 25, 50], labels=names)\n",
    "moscow[[\"date\", \"temp_max\", \"kind\"]].head(3)"
   ],
   "execution_count": null,
   "outputs": [],
   "id": "labels"
  },
  {
   "cell_type": "code",
   "metadata": {},
   "source": [
    "# Дни по типам\n",
    "moscow[\"kind\"].value_counts().sort_index()"
   ],
   "execution_count": null,
   "outputs": [],
   "id": "label-counts"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Упражнение 1. Климат Сочи\n",
    "\n",
    "Добавьте в таблицу `sochi` столбец `kind` — тип дня по `temp_max` с теми же границами и подписями, что для\n",
    "Москвы: до 0 — «ниже нуля», до 15 — «прохладно», до 25 — «тепло», выше — «жарко». В `kinds` сохраните число\n",
    "дней каждого типа по порядку шкалы.\n",
    "\n",
    "<details><summary>Подсказка 1</summary>\n",
    "\n",
    "`pd.cut(sochi[\"temp_max\"], bins=[-50, 0, 15, 25, 50], labels=[...])` — четыре подписи.\n",
    "\n",
    "</details>\n",
    "<details><summary>Подсказка 2</summary>\n",
    "\n",
    "`sochi[\"kind\"].value_counts().sort_index()`.\n",
    "\n",
    "</details>"
   ],
   "id": "sochi-task"
  },
  {
   "cell_type": "code",
   "metadata": {},
   "source": [
    "sochi = weather[weather[\"city\"] == \"Сочи\"].copy()\n",
    "# добавьте в sochi столбец kind\n",
    "kinds = ..."
   ],
   "execution_count": null,
   "outputs": [],
   "id": "sochi"
  },
  {
   "cell_type": "code",
   "metadata": {},
   "source": [
    "# Проверка упражнения 1 — выполните после своего решения\n",
    "def test_kind():\n",
    "    \"kind — тип дня по дневному максимуму\"\n",
    "    assert \"kind\" in sochi.columns, \"в sochi нет столбца kind\"\n",
    "    assert sochi[\"kind\"].isna().sum() == 0, \"в kind есть пропуски: границы должны покрывать все температуры\"\n",
    "    found = sorted(map(str, sochi[\"kind\"].unique()))\n",
    "    assert set(found) <= {\"ниже нуля\", \"прохладно\", \"тепло\", \"жарко\"}, f\"в kind значения {found}, а нужны подписи типов дней: вспомните параметр labels\"\n",
    "    assert (sochi[\"kind\"] == \"жарко\").sum() == 50, \"границы не те: сверьте их с условием\"\n",
    "\n",
    "\n",
    "def test_kinds():\n",
    "    \"kinds — сколько дней каждого типа, по порядку шкалы\"\n",
    "    assert isinstance(kinds, pd.Series), f\"kinds — это {type(kinds).__name__}, а нужен результат value_counts()\"\n",
    "    assert list(kinds.index) != [\"тепло\", \"прохладно\", \"жарко\", \"ниже нуля\"], \"типы идут по убыванию числа дней, а нужны по порядку шкалы: отсортируйте по индексу\"\n",
    "    assert list(kinds.index) == [\"ниже нуля\", \"прохладно\", \"тепло\", \"жарко\"], f\"порядок сейчас {list(kinds.index)}, а нужен от «ниже нуля» к «жарко»\"\n",
    "    assert kinds.tolist() == [0, 137, 178, 50], f\"значения сейчас {kinds.tolist()}\"\n",
    "\n",
    "_check(test_kind, test_kinds, names=[\"kinds\"])"
   ],
   "execution_count": null,
   "outputs": [],
   "id": "sochi-check"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<details><summary>Решение</summary>\n",
    "\n",
    "```python\n",
    "sochi = weather[weather[\"city\"] == \"Сочи\"].copy()\n",
    "sochi[\"kind\"] = pd.cut(sochi[\"temp_max\"], bins=[-50, 0, 15, 25, 50], labels=[\"ниже нуля\", \"прохладно\", \"тепло\", \"жарко\"])\n",
    "kinds = sochi[\"kind\"].value_counts().sort_index()\n",
    "```\n",
    "\n",
    "</details>"
   ],
   "id": "sochi-solution"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Дней «ниже нуля» в Сочи нет, но строка с нулём в ответе осталась: категория помнит весь набор значений,\n",
    "даже те, что не встретились.\n",
    "\n",
    "## Границы\n",
    "\n",
    "Куда попадёт значение, равное границе? По умолчанию — в интервал **слева** от неё: правая граница входит."
   ],
   "id": "text-45"
  },
  {
   "cell_type": "code",
   "metadata": {},
   "source": [
    "# Правая граница входит\n",
    "marks = pd.Series([0, 15, 15.1, 25])\n",
    "print(pd.cut(marks, bins=[0, 15, 25]).tolist())"
   ],
   "execution_count": null,
   "outputs": [],
   "id": "edges"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "В списке интервалы показаны подробной записью: `closed='right'` значит «закрыт справа», то есть `(0, 15]`.\n",
    "Ровно 15 — это ещё `(0, 15]`, а 15.1 — уже `(15, 25]`. Ноль не попал никуда: левая граница первого интервала\n",
    "не входит, и вместо интервала стоит `nan`.\n",
    "\n",
    "Параметр `right=False` переворачивает правило: входит левая граница, правая — нет."
   ],
   "id": "text-54"
  },
  {
   "cell_type": "code",
   "metadata": {},
   "source": [
    "# Левая граница входит\n",
    "print(pd.cut(marks, bins=[0, 15, 25], right=False).tolist())"
   ],
   "execution_count": null,
   "outputs": [],
   "id": "edges-left"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Значения **за пределами** границ тоже становятся пропусками — без ошибки и предупреждения:"
   ],
   "id": "text-62"
  },
  {
   "cell_type": "code",
   "metadata": {},
   "source": [
    "# 60 лет — за последней границей\n",
    "ages = pd.Series([5, 15, 30, 60])\n",
    "pd.cut(ages, bins=[0, 15, 30], labels=[\"дети\", \"молодые\"])"
   ],
   "execution_count": null,
   "outputs": [],
   "id": "outside"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> **Типичная ошибка: значения за границами молча пропадают.**\n",
    ">\n",
    "> Если крайние границы не покрывают все данные, часть строк получит `NaN` и выпадет из подсчётов. Берите\n",
    "> границы с запасом (в примере с температурой — −50 и 50) и проверяйте `isna().sum()` результата."
   ],
   "id": "component-67"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Вопрос.** Какую подпись получит значение 10:\n",
    "`pd.cut(pd.Series([10]), bins=[0, 10, 20], labels=[\"низкий\", \"высокий\"])`?\n",
    "\n",
    "- `низкий`\n",
    "- `высокий`\n",
    "- `nan`\n",
    "\n",
    "<details><summary>Ответ</summary>\n",
    "\n",
    "`низкий`\n",
    "\n",
    "Интервалы — `(0, 10]` и `(10, 20]`. Правая граница входит, поэтому 10 относится к первому — «низкий». С `right=False` интервалы стали бы `[0, 10)` и `[10, 20)`, и 10 попало бы в «высокий».\n",
    "\n",
    "</details>"
   ],
   "id": "quiz-72"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Упражнение 2. Скорость доставки\n",
    "\n",
    "Добавьте в `delivery` столбец `speed` по сроку `days`: до 3 дней включительно — «быстро», 4–5 дней —\n",
    "«нормально», 6 дней и больше — «долго». Самый долгий срок в данных — 13 дней. В `speed_share` сохраните\n",
    "доли каждой группы по порядку шкалы.\n",
    "\n",
    "<details><summary>Подсказка 1</summary>\n",
    "\n",
    "Границы `[0, 3, 5, 14]`: интервалы `(0, 3]`, `(3, 5]`, `(5, 14]`.\n",
    "\n",
    "</details>\n",
    "<details><summary>Подсказка 2</summary>\n",
    "\n",
    "`delivery[\"speed\"].value_counts(normalize=True).sort_index()`.\n",
    "\n",
    "</details>"
   ],
   "id": "speed-task"
  },
  {
   "cell_type": "code",
   "metadata": {},
   "source": [
    "delivery = pd.read_csv(\"data/delivery_h1.csv\")\n",
    "# добавьте в delivery столбец speed\n",
    "speed_share = ..."
   ],
   "execution_count": null,
   "outputs": [],
   "id": "speed"
  },
  {
   "cell_type": "code",
   "metadata": {},
   "source": [
    "# Проверка упражнения 2 — выполните после своего решения\n",
    "def test_speed():\n",
    "    \"speed — быстро (до 3 дней), нормально (4–5), долго (6 и больше)\"\n",
    "    assert \"speed\" in delivery.columns, \"в delivery нет столбца speed\"\n",
    "    assert (delivery[\"speed\"] == \"быстро\").sum() != 119, \"3 дня должны считаться «быстро»: интервал (0, 3] включает правую границу\"\n",
    "    assert (delivery[\"speed\"] == \"быстро\").sum() == 309, \"границы не те: сверьте их с условием\"\n",
    "    assert delivery[\"speed\"].isna().sum() != 43, \"заказы, которые везли дольше 10 дней, стали пропусками: последняя граница должна покрывать самый долгий срок\"\n",
    "    assert delivery[\"speed\"].isna().sum() == 36, f\"в speed {delivery['speed'].isna().sum()} пропусков: пропуски должны остаться только там, где срок неизвестен\"\n",
    "\n",
    "\n",
    "def test_share():\n",
    "    \"speed_share — доли по порядку шкалы\"\n",
    "    assert isinstance(speed_share, pd.Series), f\"speed_share — это {type(speed_share).__name__}, а нужен Series\"\n",
    "    assert list(speed_share.index) == [\"быстро\", \"нормально\", \"долго\"], f\"порядок сейчас {list(speed_share.index)}, а нужен быстро, нормально, долго\"\n",
    "    assert abs(speed_share[\"быстро\"] - 309) > 1, \"в speed_share числа заказов, а нужны доли\"\n",
    "    assert abs(speed_share[\"быстро\"] - 309 / 780) < 1e-9 and abs(speed_share[\"долго\"] - 150 / 780) < 1e-9, \"доли не те: нужны доли заказов в каждой группе speed\"\n",
    "\n",
    "_check(test_speed, test_share, names=[\"speed_share\"])"
   ],
   "execution_count": null,
   "outputs": [],
   "id": "speed-check"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<details><summary>Решение</summary>\n",
    "\n",
    "```python\n",
    "delivery = pd.read_csv(\"data/delivery_h1.csv\")\n",
    "delivery[\"speed\"] = pd.cut(delivery[\"days\"], bins=[0, 3, 5, 14], labels=[\"быстро\", \"нормально\", \"долго\"])\n",
    "speed_share = delivery[\"speed\"].value_counts(normalize=True).sort_index()\n",
    "```\n",
    "\n",
    "</details>"
   ],
   "id": "speed-solution"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*После решения упражнения выше:*\n",
    "\n",
    "Пропуски в `days` остались пропусками в `speed` — их 36, и в доли они не вошли."
   ],
   "id": "component-92"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Равные интервалы и равные группы\n",
    "\n",
    "Если вместо списка границ передать число, `pd.cut` сам разделит диапазон на столько интервалов **равной\n",
    "ширины**:"
   ],
   "id": "text-95"
  },
  {
   "cell_type": "code",
   "metadata": {},
   "source": [
    "# Ветер: три интервала одинаковой ширины\n",
    "pd.cut(moscow[\"wind_ms\"], bins=3).value_counts().sort_index()"
   ],
   "execution_count": null,
   "outputs": [],
   "id": "equal-width"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ширина одинаковая, а строк в интервалах — очень разное число: сильный ветер бывает редко. Левая граница\n",
    "первого интервала (0.487) чуть меньше наименьшего значения (0.5) — pandas сдвигает её, чтобы минимум тоже\n",
    "попал внутрь: ведь левая граница не входит.\n",
    "\n",
    "Функция `pd.qcut` делит иначе — по квантилям: так, чтобы в каждой группе оказалось **примерно поровну строк**.\n",
    "Границы она подбирает сама:"
   ],
   "id": "text-102"
  },
  {
   "cell_type": "code",
   "metadata": {},
   "source": [
    "# Выручка строки: четыре группы по четверти строк\n",
    "orders = pd.read_csv(\"data/shop_orders.csv\")\n",
    "revenue = orders[\"price\"] * orders[\"quantity\"]\n",
    "pd.qcut(revenue, 4).value_counts().sort_index()"
   ],
   "execution_count": null,
   "outputs": [],
   "id": "qcut"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Границы — знакомые квартили: 535, 1080 и 1580 ₽. Группы получились не совсем равными, потому что многие\n",
    "строки имеют одинаковую выручку, а делить одинаковые значения между группами нельзя.\n",
    "\n",
    "Когда что выбирать: `pd.cut` — когда границы имеют смысл сами по себе (ноль градусов, 1000 рублей,\n",
    "совершеннолетие); `pd.qcut` — когда нужны группы «нижняя четверть, верхняя четверть» относительно самих\n",
    "данных."
   ],
   "id": "text-111"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Упражнение 3. Размер покупки\n",
    "\n",
    "Добавьте в `orders` столбец `size` — четверть, в которую попадает выручка строки `revenue`: «малая», «средняя»,\n",
    "«крупная», «очень крупная». В `big` сохраните строки верхней четверти, а в `big_min` — наименьшую выручку среди них.\n",
    "\n",
    "<details><summary>Подсказка 1</summary>\n",
    "\n",
    "`pd.qcut(revenue, 4, labels=[\"малая\", \"средняя\", \"крупная\", \"очень крупная\"])`.\n",
    "\n",
    "</details>\n",
    "<details><summary>Подсказка 2</summary>\n",
    "\n",
    "`big = orders[orders[\"size\"] == \"очень крупная\"]`; выручка строк — `big[\"price\"] * big[\"quantity\"]`.\n",
    "\n",
    "</details>"
   ],
   "id": "size-task"
  },
  {
   "cell_type": "code",
   "metadata": {},
   "source": [
    "# добавьте в orders столбец size\n",
    "big = ...\n",
    "big_min = ..."
   ],
   "execution_count": null,
   "outputs": [],
   "id": "size"
  },
  {
   "cell_type": "code",
   "metadata": {},
   "source": [
    "# Проверка упражнения 3 — выполните после своего решения\n",
    "def test_size():\n",
    "    \"size — четверть, в которую попала выручка строки\"\n",
    "    assert \"size\" in orders.columns, \"в orders нет столбца size\"\n",
    "    found = set(map(str, orders[\"size\"].unique()))\n",
    "    assert found == {\"малая\", \"средняя\", \"крупная\", \"очень крупная\"}, f\"в size значения {sorted(found)}, а нужны четыре подписи: малая, средняя, крупная, очень крупная\"\n",
    "    assert (orders[\"size\"] == \"малая\").sum() < 2000, \"использован pd.cut — он делит на интервалы равной ширины, и почти все строки попали в первый. Равные по числу строк группы делает pd.qcut\"\n",
    "    assert (orders[\"size\"] == \"малая\").sum() == 612 and (orders[\"size\"] == \"очень крупная\").sum() == 573, \"группы не те: нужны четыре равные по числу строк группы по выручке, подписи — от малой к очень крупной\"\n",
    "\n",
    "\n",
    "def test_big():\n",
    "    \"big — строки верхней четверти, big_min — с какой выручки она начинается\"\n",
    "    assert isinstance(big, pd.DataFrame), f\"big — это {type(big).__name__}, а нужна таблица\"\n",
    "    assert len(big) == 573, f\"в big {len(big)} строк: нужны все строки группы «очень крупная»\"\n",
    "    assert big_min > 1580 and big_min <= 1600, f\"big_min = {big_min!r} — это не наименьшая выручка в верхней четверти\"\n",
    "\n",
    "_check(test_size, test_big, names=[\"big\",\"big_min\"])"
   ],
   "execution_count": null,
   "outputs": [],
   "id": "size-check"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<details><summary>Решение</summary>\n",
    "\n",
    "```python\n",
    "orders[\"size\"] = pd.qcut(revenue, 4, labels=[\"малая\", \"средняя\", \"крупная\", \"очень крупная\"])\n",
    "big = orders[orders[\"size\"] == \"очень крупная\"]\n",
    "big_min = (big[\"price\"] * big[\"quantity\"]).min()\n",
    "```\n",
    "\n",
    "</details>"
   ],
   "id": "size-solution"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Итоги\n",
    "\n",
    "- `pd.cut(столбец, bins=[...], labels=[...])` — группы по своим границам; подписей на одну меньше, чем границ.\n",
    "- `(a, b]` — правая граница входит; `right=False` — входит левая.\n",
    "- Значения за границами становятся `NaN`: берите границы с запасом.\n",
    "- `pd.cut(столбец, bins=n)` — `n` интервалов равной ширины; `pd.qcut(столбец, n)` — `n` групп с примерно\n",
    "  равным числом строк."
   ],
   "id": "text-126"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Подробнее в справочнике:** [pandas/cut-qcut](https://ds-edu-trainer.vercel.app/reference/pandas/cut-qcut) · [pandas/category](https://ds-edu-trainer.vercel.app/reference/pandas/category)"
   ],
   "id": "more"
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python"
  },
  "colab": {
   "provenance": []
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
