Сравнить коммиты
6 Коммитов
lab_1/mast
...
41497aa039
| Автор | SHA1 | Дата | |
|---|---|---|---|
|
41497aa039
|
|||
|
f6714c0918
|
|||
|
0d66f73f7f
|
|||
|
105e06f7b4
|
|||
|
addc173d75
|
|||
|
ca3d34795d
|
@@ -1,73 +0,0 @@
|
|||||||
# Обоснование порядка работы с блокнотами Jupyter
|
|
||||||
|
|
||||||
[Архитектура](https://docs.jupyter.org/en/latest/projects/architecture/content-architecture.html) экосистемы Jupyter очень сложна, особенно если учитывать сторонние дополнения; данное обоснование может содержать неточности.
|
|
||||||
|
|
||||||
Концептуально, важные для темы компоненты в архитектуре Jupyter:
|
|
||||||
|
|
||||||
* *Ядро* ([kernel](https://docs.jupyter.org/en/latest/projects/kernels.html#kernels)) — независимый процесс, непосредственно исполняющий код на конкретном языке программирования (основываясь на конкретном экземпляре интерпретатора) и предоставляющий API для передачи исполняемого кода и получения результатов. (Самое популярное ядро — `ipykernel` — использует [IPython](https://ipython.org/), программный пакет, реализующий Python с расширенными возможностями интерактивной работы.)
|
|
||||||
|
|
||||||
* *Сервер* (server) и *приложение* (application) — компоненты, обеспечивающие выполнение прикладных задач. Так, стандартный `jupyter_server` и использующие его популярные [веб-приложения](https://jupyter.org/) (Notebook, JupyterLab) реализуют редактирование и исполнение блокнотов и других файлов (делегируя только непосредственное исполнение кода ядрам) и все пользовательские интерфейсы.
|
|
||||||
|
|
||||||
Чтобы пользователь могу выбрать ядро для использования (а значит, выбрать язык программирования и конкретный экземпляр интерпретатора), сервер Jupyter выполняет поиск доступных *спецификаций ядер* (kernelspec).
|
|
||||||
|
|
||||||
В случае Python, выбор конкретного экземпляра интерпретатора важен в частности потому, что это означает и выбор конкретного виртуального окружения. И здесь начинаются проблемы.
|
|
||||||
|
|
||||||
* Сервер Jupyter реализует только примитивный механизм поиска спецификаций ядер. "**Ядра [устанавливается](https://ipython.readthedocs.io/en/stable/install/kernel_install.html#installing-the-ipython-kernel)**" (install) глобально в систему либо для отдельного пользователя, что означает размещение спецификаций ядер под глобально уникальными именами (с учётом приоритета ядер, установленных для конкретного пользователя). Механизма локального размещения спецификаций ядер просто не предусмотрено. (Сервер Jupyter, возможно, реализует и другой механизм поиска *активных* ядер, который здесь нерелевантен.)
|
|
||||||
|
|
||||||
* Расширение [Jupyter](https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter) для Visual Studio Code самостоятельно реализует ограниченные функции сервера и приложения. Однако оно имеет [продвинутый механизм](https://code.visualstudio.com/docs/datascience/jupyter-kernel-management#_python-environments) поиска спецификаций ядер. Спецификации ядер, размещённые в виртуальном окружении (в директории данных (например, `share`), далее `jupyter/kernels`), также подбираются и могут быть использованы пользователем. Они должны иметь *локально* (в отношении виртуального окружения) уникальные имена, **однако** они делят пространство имён с глобально установленными ядрами, просто с более высоким приоритетом.
|
|
||||||
|
|
||||||
* Блокнот Jupyter сохраняет имя нужного для его исполнения ядра в своих метаданных (`kernelspec.name`) (даже при использовании Jupytext).
|
|
||||||
|
|
||||||
Таким образом, отдельный блокнот требует ядро с определённым именем, это имя ищется в системе глобально, и при использовании оригинальной системы Jupyter нет возможности даже определить это имя локально для отдельного виртуального окружения с приоритетом выше, чем у ядер, установленных глобально. Т.е. блокнот существенно привязывается к окружению конкретной системы, что мешает переносимости и контролю версий, а также захламляет систему глобально установленными ядрами.
|
|
||||||
|
|
||||||
Найденные варианты смягчения проблемы:
|
|
||||||
|
|
||||||
1. Разворачивать Jupyter целиком внутри виртуального окружения.
|
|
||||||
|
|
||||||
При этом подходе проблемы с выбором ядра, вероятно, нет вообще.
|
|
||||||
|
|
||||||
**\*** Нет полной уверенности, что Jupyter в виртуальном окружении действительно будет использовать его экземпляр интерпретатора для ядра по умолчанию.
|
|
||||||
|
|
||||||
**+** Простота работы, по крайней мере в пределах одного виртуального окружения.
|
|
||||||
|
|
||||||
**−** Повышенный расход ресурсов хранилища; пакет `notebook` версии 7.4 со всеми зависимостями занимает порядка 264 МБ на диске 12 тысячами файлов.
|
|
||||||
|
|
||||||
**−** Возможные проблемы из-за изоляции среды Jupyter от других проектов.
|
|
||||||
|
|
||||||
2. Использовать только Visual Studio Code с расширением Jupyter и пакетом `ipykernel` в каждом проекте; не использовать оригинальную систему (сервер Jupyter и веб-приложения) вообще.
|
|
||||||
|
|
||||||
В каждом виртуальном окружении также нужен пакет `ipykernel` для работы с ядром.
|
|
||||||
|
|
||||||
**+** Довольно надёжная локальная связь ядер с виртуальными окружениями.
|
|
||||||
|
|
||||||
**−** Большая проблема с переносимостью блокнотов из-за необходимости использовать конкретную IDE с расширением вместо оригинальной системы.
|
|
||||||
|
|
||||||
**−** Ограниченный функционал и нестабильность расширения Jupyter для Visual Studio Code.
|
|
||||||
|
|
||||||
**−** Потенциальная необходимость ручных хаков в случае использования более одного виртуального окружения в одном проекте.
|
|
||||||
|
|
||||||
3. Использовать единственное определённое и зафиксированное для проекта имя ядра; устанавливать ядро с указанным именем глобально либо, для использования нескольких ядер (например, для нескольких виртуальных окружений для одного проекта), править каждый блокнот локально.
|
|
||||||
|
|
||||||
**+** Относительно простой порядок работы в случае с единственным виртуальным окружением для каждого проекта.
|
|
||||||
|
|
||||||
**−** Необходимо обеспечить уникальность имени ядра для проекта; имя ядра может стать нечитаемым.
|
|
||||||
|
|
||||||
**−** Если появляется необходимость иметь несколько ядер для одного проекта (например, для нескольких виртуальных окружений) или переименовать единственное ядро, необходимо применять локальные правки к каждому релевантному блокноту, что существенно усложняет контроль версий.
|
|
||||||
|
|
||||||
**−** Установленные спецификации ядер остаются в системе глобально и захламляют систему.
|
|
||||||
|
|
||||||
4. Запускать ядро самостоятельно из виртуального окружения и использовать механизм поиска активных ядер.
|
|
||||||
|
|
||||||
Есть интерфейсы, намекающие на возможность этого варианта (см. пакет `ipykernel_launcher`), но неясно, насколько это было бы практично.
|
|
||||||
|
|
||||||
**\*** Непонятно, возможно ли это.
|
|
||||||
|
|
||||||
**\*** Непонятно, практично ли это.
|
|
||||||
|
|
||||||
**+** Довольно надёжная локальная связь ядер с виртуальными окружениями.
|
|
||||||
|
|
||||||
**−** Довольно много телодвижений для обычной работы с Jupyter.
|
|
||||||
|
|
||||||
**−** Очень сложно в реализации, может потребовать разработки собственного ПО.
|
|
||||||
|
|
||||||
Вариант **3** выбран на данный момент для данного проекта из-за экономии ресурсов, переносимости и относительной простоты порядка работы с блокнотами в тривиальном рабочем процессе.
|
|
||||||
115
eda/README.md
115
eda/README.md
@@ -30,7 +30,7 @@
|
|||||||
|
|
||||||
## Установка
|
## Установка
|
||||||
|
|
||||||
Для EDA необходимы общие зависимости, см. **Общие зависимости** в `README.md`.
|
Для EDA необходимы общие зависимости, см. [Общие зависимости](../README.md#общие-зависимости) в `README.md`.
|
||||||
|
|
||||||
Для EDA используется среда [Jupyter](https://jupyter.org/). Т.к. блокноты хранятся в текстовом формате под контролем версий, нужно также дополнение [Jupytext](https://jupytext.readthedocs.io/en/latest/) (как минимум для ручной конвертации блокнотов; см. ниже).
|
Для EDA используется среда [Jupyter](https://jupyter.org/). Т.к. блокноты хранятся в текстовом формате под контролем версий, нужно также дополнение [Jupytext](https://jupytext.readthedocs.io/en/latest/) (как минимум для ручной конвертации блокнотов; см. ниже).
|
||||||
|
|
||||||
@@ -38,31 +38,25 @@
|
|||||||
|
|
||||||
### Общий порядок
|
### Общий порядок
|
||||||
|
|
||||||
**Внимание**: Оптимальный порядок установки и конфигурации Jupyter для работы с проектом неоднозначен. См. обоснование выбранного здесь порядка работы с блокнотами Jupyter и возможные альтернативные варианты в `eda/docs/jupyter_workflow_motivation.md`.
|
**Внимание**: Оптимальный порядок установки и конфигурации Jupyter для работы с проектом неоднозначен. См. обоснование выбранного здесь порядка работы с блокнотами Jupyter и возможные альтернативные варианты в статье [Использование Jupyter с виртуальными окружениями Python](https://asrelo.hashnode.dev/using-jupyter-with-python-virtual-environments-ru).
|
||||||
|
|
||||||
1. Выполните установку общих зависимостей, если это ещё не выполнено, см. **Общие зависимости** в `README.md`.
|
1. Выполните установку общих зависимостей, если это ещё не выполнено, см. **Общие зависимости** в `README.md`.
|
||||||
|
|
||||||
2. Jupyter и дополнения должны быть установлены в систему, а НЕ в виртуальное окружение. При необходимости деактивируйте виртуальное окружение.
|
2. Jupyter и дополнения должны быть установлены в систему, а **не** в виртуальное окружение. При необходимости деактивируйте виртуальное окружение.
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
deactivate
|
deactivate
|
||||||
```
|
```
|
||||||
|
|
||||||
3. [Установите Jupyter](https://jupyter.org/install) и Jupytext в систему (НЕ в виртуальное окружение).
|
3. [Установите Jupyter](https://jupyter.org/install) и Jupytext в систему (**не** в виртуальное окружение).
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
pip install -U notebook
|
pip install -U notebook jupytext
|
||||||
```
|
```
|
||||||
|
|
||||||
4. Установите Jupytext в систему (НЕ в виртуальное окружение).
|
Полная инструкция по установке Jupytext: [Installation — Jupytext documentation](https://jupytext.readthedocs.io/en/latest/install.html).
|
||||||
|
|
||||||
```sh
|
4. **Опционально**, установите papermill в систему (**не** в виртуальное окружение).
|
||||||
pip install -U jupytext
|
|
||||||
```
|
|
||||||
|
|
||||||
Полная инструкция по установке: [Installation — Jupytext documentation](https://jupytext.readthedocs.io/en/latest/install.html).
|
|
||||||
|
|
||||||
5. **Опционально**, установите papermill в систему (НЕ в виртуальное окружение).
|
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
pip install -U papermill
|
pip install -U papermill
|
||||||
@@ -70,55 +64,69 @@
|
|||||||
|
|
||||||
Полная инструкция по установке: [Installation - papermill 2.4.0 documentation](https://papermill.readthedocs.io/en/stable/installation.html).
|
Полная инструкция по установке: [Installation - papermill 2.4.0 documentation](https://papermill.readthedocs.io/en/stable/installation.html).
|
||||||
|
|
||||||
**Шаги 6–7** **необходимо** выполнить **только** если Вы желаете использовать что-то кроме расширения Jupyter для Visual Studio Code для работы с блокнотами **или собираетесь** коммитить писать блокноты под контроль версий.
|
5. Активируйте **виртуальное окружение** повторно.
|
||||||
|
|
||||||
6. Активируйте виртуальное окружение вновь.
|
6. Установите ядро Jupyter, связанное с данным виртуальным окружением, в директорию этого виртуального окружения. Укажите следующее имя ядра: `python3_venv`.
|
||||||
|
|
||||||
7. Установите ядро Jupyter, связанное с данным виртуальным окружением, в систему. Используйте следующее имя для ядра: `mpei-iis-99040779`. (*Да, это странно, но это признано лучшим подходом на данный момент; см. обоснование в `docs/dev/jupyter_workflow_motivation.md`.*)
|
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
ipython kernel install --user --name=mpei-iis-99040779
|
python -m ipykernel --sys-prefix --name python3_venv
|
||||||
```
|
```
|
||||||
|
|
||||||
(Эта команда устанавливает виртуальное окружение глобально для текущего пользователя; для установки глобально в систему, уберите флаг `--user`).
|
7. **Опционально**, **заранее** сохраните в переменную окружения `JUPYTER_PATH` путь к данным Jupyter в виртуальном окружении `<path>` — см. п. 1 в инструкции по использованию.
|
||||||
|
|
||||||
**Внимание**: На данном этапе могут отсутствовать пригодные для прямого редактирования блокноты `.ipynb` (например, если проект развёртывается с нуля). Об использовании спаренных блокнотов и конвертации форматов см. **Использование Jupytext**.
|
* Windows (PowerShell):
|
||||||
|
|
||||||
#### Удаление ядра из системы
|
```ps
|
||||||
|
[System.Environment]::SetEnvironmentVariable('JUPYTER_PATH', "<path>;$env:JUPYTER_PATH", 'User')
|
||||||
|
```
|
||||||
|
|
||||||
Во избежание захламления системы ядро можно удалить из системы **позднее**, вызвав глобально установленный Jupyter (НЕ в виртуальном окружении) и передав имя ядра.
|
* Windows (cmd):
|
||||||
|
|
||||||
|
```bat
|
||||||
|
setx JUPYTER_PATH "<path>;%PATH%;JUPYTER_PATH"
|
||||||
|
```
|
||||||
|
|
||||||
|
* UNIX (sh):
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
jupyter kernelspec uninstall mpei-iis-99040779
|
echo 'export JUPYTER_PATH="<path>:$JUPYTER_PATH"' >> ~/.profile
|
||||||
```
|
```
|
||||||
|
|
||||||
**Примечание**: Установленное ядро НЕ занимает значительные ресурсы хранилища. На самом деле в систему устанавливается крайне лёгкая *спецификация ядра*, ограниченная коротким текстовым файлом и иконками.
|
**Внимание**: На данном этапе могут отсутствовать пригодные для прямого использования блокноты `.ipynb` (например, если проект развёртывается с нуля). Об использовании спаренных блокнотов и конвертации форматов см. [Использование Jupytext](#использование-jupytext).
|
||||||
|
|
||||||
### Зависимости
|
### Зависимости
|
||||||
|
|
||||||
Используемые непосредственно кодом проекта зависимости для разведочного анализа данных (EDA) (директория `eda/`) — пакеты Python — на данный момент включены в общие зависимости (см. выше).
|
Используемые непосредственно кодом проекта зависимости для разведочного анализа данных (EDA) (директория `eda/`) — пакеты Python — на данный момент включены в общие зависимости (см. выше).
|
||||||
|
|
||||||
### Использование Jupytext
|
|
||||||
|
|
||||||
Описанные ниже команды `jupytext` используют глобальной установленный экземпляр Jupytext (однако его можно запускать и изнутри виртуального окружения).
|
|
||||||
|
|
||||||
Для автоматической синхронизации связанных блокнотов (включая создание блокнотов отсутствующих, но ожидаемых форматов):
|
|
||||||
|
|
||||||
```sh
|
|
||||||
jupytext --sync eda/cars_eda.py
|
|
||||||
```
|
|
||||||
|
|
||||||
Jupytext довольно удобно работает в оригинальной среде Jupyter, синхронизируя изменения связанных файлов на лету при работе в Jupyter, **ориентируясь на метки времени на файлах**. См. документацию [Jupytext](https://jupytext.readthedocs.io/en/latest/index.html).
|
|
||||||
|
|
||||||
**Внимание**: С расширением Jupyter для Visual Studio Code Jupytext **не работает напрямую**. Для использования блокнотов `.ipynb` с расширением Jupyter для VS Code нужно синхронизировать текстовый файл под контролем версий и файл `.ipynb` вручную указанными выше командами. Однако заметьте, что это же расширение может исполнять блокнот в текстовом формате самостоятельно, посредством автоматизированного ведения временного блокнота; и оно даже автоматически создаёт/подхватывает локальное ядро Jupyter в виртуальном окружении.
|
|
||||||
|
|
||||||
## Работа с блокнотами Jupyter
|
## Работа с блокнотами Jupyter
|
||||||
|
|
||||||
### Jupyter
|
### Jupyter
|
||||||
|
|
||||||
1. Запустите глобальный глобально установленный сервер Jupyter и приложение (НЕ из виртуального окружения).
|
1. **Если** при выполнении инструкции по установке Вы **не** сохранили в переменную окружения JUPYTER_PATH путь к данным Jupyter в виртуальном окружении, этот путь нужно добавить в переменную окружения сейчас.
|
||||||
|
|
||||||
* Например, запустите сервер Jupyter и веб-приложение Notebook в браузере:
|
Добавьте в переменную окружения `JUPYTER_PATH` абсолютный путь (далее обозначаемый `<path>`) `$VIRTUAL_ENV/share/jupyter`, где следует заменить `$VIRTUAL_ENV` на путь к директории, где развёрнуто виртуальное окружение. Для инструментов [`venv`](https://docs.python.org/3/library/venv.html), [`virtualenv`](https://virtualenv.pypa.io/en/stable/) можно просто в активном виртуальном окружении использовать подстановку переменной окружения `VIRTUAL_ENV` (активное виртуальное окружение не повлияет на дальнейшие шаги).
|
||||||
|
|
||||||
|
* Windows (PowerShell):
|
||||||
|
|
||||||
|
```ps
|
||||||
|
$env:JUPYTER_PATH = "<path>;$env:JUPYTER_PATH"
|
||||||
|
```
|
||||||
|
|
||||||
|
* Windows (cmd):
|
||||||
|
|
||||||
|
```bat
|
||||||
|
set "JUPYTER_PATH=<path>;%JUPYTER_PATH%"
|
||||||
|
```
|
||||||
|
|
||||||
|
* UNIX (sh):
|
||||||
|
|
||||||
|
```sh
|
||||||
|
export JUPYTER_PATH="<path>:$JUPYTER_PATH"
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Запустите глобальный установленное приложение Jupyter (**не** из виртуального окружения).
|
||||||
|
|
||||||
|
* Например, запустите Jupyter Notebook:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
jupyter notebook
|
jupyter notebook
|
||||||
@@ -134,21 +142,34 @@ Jupytext довольно удобно работает в оригинальн
|
|||||||
|
|
||||||
2. Используйте приложение для навигации по файловой системе (в частности, по каталогу `eda/`), редактирования и исполнения кода в блокнотах.
|
2. Используйте приложение для навигации по файловой системе (в частности, по каталогу `eda/`), редактирования и исполнения кода в блокнотах.
|
||||||
|
|
||||||
3. Если приложение Jupyter запрашивает **выбор ядра** Jupyter (**kernel**) или Вы сталкиваетесь с необъяснимыми **ошибками импортов**, выберите для текущего блокнота ядро с именем `mpei-iis-99040779` (которое Вы установили в систему раньше).
|
3. Если приложение Jupyter запрашивает **выбор ядра** Jupyter (**kernel**) или Вы сталкиваетесь с необъяснимыми **ошибками импортов**, выберите для текущего блокнота ядро с именем `python3_venv`.
|
||||||
|
|
||||||
* **Notebook**: Может понадобиться выбор вручную; кнопка для выбора ядра для открытого блокнота находится в верхнем правом углу веб-страницы.
|
* **Jupyter Notebook**: Может понадобиться выбор вручную; кнопка для выбора ядра для открытого блокнота находится в верхнем правом углу веб-страницы.
|
||||||
|
|
||||||
### Расширение Jupyter для Visual Studio Code
|
### Расширение Jupyter для Visual Studio Code
|
||||||
|
|
||||||
1. Запустите Visual Studio Code.
|
1. Запустите Visual Studio Code.
|
||||||
|
|
||||||
2. **Если** Вы НЕ установили ядро Jupyter, связанное с виртуальным окружением для проекта, в систему, обязательно откройте корневую директорию проекта в VS Code (*File* -> *Open Folder...*). **Иначе** это необязательный, но удобный шаг.
|
2. Откройте корневую директорию проекта в VS Code (*File* -> *Open Folder...*).
|
||||||
|
|
||||||
3. Если Вы открыли директорию проекта и VS Code запрашивает выбор автоматически обнаруженного виртуального окружения, согласитесь.
|
3. Если Вы открыли директорию проекта и VS Code запрашивает выбор автоматически обнаруженного виртуального окружения, согласитесь.
|
||||||
|
|
||||||
4. **При открытии любого блокнота** убедитесь, что выбрано корректное ядро Jupyter. (Кнопка для выбора ядра для открытого блокнота находится в верхнем правом углу области содержимого вкладки; если ядро не выборано, на кнопке написано *Select Kernel*.)
|
3. **Если** VS Code запрашивает выбор автоматически обнаруженного виртуального окружения, согласитесь.
|
||||||
|
|
||||||
* **Если** Вы установили ядро Jupyter в систему, рекомендуется выбрать установленное в систему ядро с именем `mpei-iis-99040779`.
|
**Иначе** [укажите](https://code.visualstudio.com/docs/python/environments#_working-with-python-interpreters) своё виртуальное окружение самостоятельно.
|
||||||
* **Если** Вы совсем **не собираетесь** использовать Jupyter для работы с проектом **и не собираетесь** записывать блокноты под контроль версий, можно выбрать локальное ядро, связанное с виртуальным окружением (по умолчанию имеет название виртуального окружения — `.venv`).
|
|
||||||
|
|
||||||
5. Используйте IDE с расширением для навигации по файловой системе (в частности, по каталогу `eda/`), редактирования и исполнения кода в блокнотах.
|
4. Используйте VS Code с расширением Jupyter для навигации по файловой системе (в частности, по каталогу `eda/`), редактирования и исполнения кода в блокнотах. **Не забывайте** при открытии любого блокнота проверять, что выбрано корректное ядро Jupyter (принадлежащее корректному виртуальному окружению). (Кнопка для выбора ядра для открытого блокнота находится в верхнем правом углу области содержимого вкладки; по умолчанию Вы увидите название выбранного виртуального окружения; если ядро не выбрано, на кнопке написано *Select Kernel*.)
|
||||||
|
|
||||||
|
### Использование Jupytext
|
||||||
|
|
||||||
|
Описанные ниже команды `jupytext` используют глобальной установленный экземпляр Jupytext (однако его можно запускать и изнутри виртуального окружения).
|
||||||
|
|
||||||
|
Для автоматической синхронизации связанных блокнотов (включая создание блокнотов отсутствующих, но ожидаемых форматов):
|
||||||
|
|
||||||
|
```sh
|
||||||
|
jupytext --sync eda/cars_eda.py
|
||||||
|
```
|
||||||
|
|
||||||
|
Jupytext довольно удобно работает в оригинальной среде Jupyter, синхронизируя изменения связанных файлов на лету при работе в Jupyter, **ориентируясь на метки времени на файлах**. См. документацию [Jupytext](https://jupytext.readthedocs.io/en/latest/index.html).
|
||||||
|
|
||||||
|
**Внимание**: С расширением Jupyter для Visual Studio Code Jupytext **не работает напрямую**. Для использования блокнотов `.ipynb` с расширением Jupyter для VS Code нужно синхронизировать текстовый файл под контролем версий и файл `.ipynb` вручную указанными выше командами. Однако заметьте, что это же расширение может исполнять блокнот в текстовом формате самостоятельно, посредством автоматизированного ведения временного блокнота; и оно даже автоматически создаёт/подхватывает локальное ядро Jupyter в виртуальном окружении.
|
||||||
|
|||||||
@@ -8,9 +8,9 @@
|
|||||||
# format_version: '1.3'
|
# format_version: '1.3'
|
||||||
# jupytext_version: 1.17.3
|
# jupytext_version: 1.17.3
|
||||||
# kernelspec:
|
# kernelspec:
|
||||||
# display_name: mpei-iis-project-99040779
|
# display_name: python3_venv
|
||||||
# language: python
|
# language: python
|
||||||
# name: mpei-iis-project-99040779
|
# name: python3_venv
|
||||||
# ---
|
# ---
|
||||||
|
|
||||||
# %% [markdown]
|
# %% [markdown]
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
from functools import wraps
|
|
||||||
from math import log
|
|
||||||
|
|
||||||
from numpy import logspace as numpy_logspace
|
|
||||||
|
|
||||||
@wraps(numpy_logspace, assigned=('__annotations__', '__type_params__'))
|
|
||||||
def logspace(start, stop, *args_rest, **kwargs):
|
|
||||||
return numpy_logspace(log(start), log(stop), *args_rest, **kwargs)
|
|
||||||
@@ -3,7 +3,12 @@ from typing import Optional
|
|||||||
|
|
||||||
from scipy.stats import norm
|
from scipy.stats import norm
|
||||||
|
|
||||||
SND_QUARTILE: float = 0.674490
|
# XXX: может, заменить вызов scipy.stats.norm на аппроксимацию?
|
||||||
|
|
||||||
|
SND_QUARTILE: float = (
|
||||||
|
#0.674490
|
||||||
|
norm.ppf(1 - 0.25)
|
||||||
|
)
|
||||||
|
|
||||||
def suggest_iqr_to_range_to_suggest_bins_num(n: int) -> float:
|
def suggest_iqr_to_range_to_suggest_bins_num(n: int) -> float:
|
||||||
p = 1 / (n + 1)
|
p = 1 / (n + 1)
|
||||||
|
|||||||
@@ -2,7 +2,8 @@ bokeh >=3.7.2,<4
|
|||||||
ipykernel >=6.30.1,<7
|
ipykernel >=6.30.1,<7
|
||||||
ipympl ~=0.9.6
|
ipympl ~=0.9.6
|
||||||
matplotlib >=3.10.1,<4
|
matplotlib >=3.10.1,<4
|
||||||
numpy >=2.3.1,<3
|
numpy >=2.2.6,<3
|
||||||
pandas >=2.3.1,<3
|
pandas >=2.3.1,<3
|
||||||
scipy >=1.16.1,<2
|
scipy >=1.15.3,<2
|
||||||
|
scikit-learn >=1.7.2,<2
|
||||||
seaborn ~=0.13.2
|
seaborn ~=0.13.2
|
||||||
|
|||||||
173
research/research.py
Обычный файл
173
research/research.py
Обычный файл
@@ -0,0 +1,173 @@
|
|||||||
|
# ---
|
||||||
|
# jupyter:
|
||||||
|
# jupytext:
|
||||||
|
# formats: ipynb,py:percent
|
||||||
|
# text_representation:
|
||||||
|
# extension: .py
|
||||||
|
# format_name: percent
|
||||||
|
# format_version: '1.3'
|
||||||
|
# jupytext_version: 1.17.3
|
||||||
|
# kernelspec:
|
||||||
|
# display_name: .venv
|
||||||
|
# language: python
|
||||||
|
# name: python3
|
||||||
|
# ---
|
||||||
|
|
||||||
|
# %%
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
# %%
|
||||||
|
import os
|
||||||
|
import pathlib
|
||||||
|
import pickle
|
||||||
|
|
||||||
|
# %%
|
||||||
|
import sklearn.compose
|
||||||
|
import sklearn.ensemble
|
||||||
|
import sklearn.metrics
|
||||||
|
import sklearn.model_selection
|
||||||
|
import sklearn.pipeline
|
||||||
|
import sklearn.preprocessing
|
||||||
|
|
||||||
|
# %%
|
||||||
|
# %% tags=["parameters"]
|
||||||
|
data_path: Optional[str] = None
|
||||||
|
# Полный путь к файлу (CSV) с исходным датасетом. Если не установлен, ищется файл в `data/<data_relpath>`.
|
||||||
|
data_relpath: str = 'cars.csv'
|
||||||
|
# Путь к файлу (CSV) с исходным датасетом относительно директории данных `data`. Игнорируется, если установлен data_path.
|
||||||
|
|
||||||
|
data_aug_pickle_path: Optional[str] = None
|
||||||
|
# Полный путь к файлу (pickle) для сохранения очищенного датасета. Если не установлен, используется `data/<data_aug_pickle_relpath>`.
|
||||||
|
data_aug_pickle_relpath: str = 'cars.aug.pickle'
|
||||||
|
# Путь к файлу (pickle) для сохранения очищенного датасета относительно директории данных `data`. Игнорируется, если установлен data_aug_pickle_path.
|
||||||
|
|
||||||
|
# %%
|
||||||
|
BASE_PATH = pathlib.Path('..')
|
||||||
|
|
||||||
|
# %%
|
||||||
|
DATA_PATH = (
|
||||||
|
pathlib.Path(os.path.dirname(data_path))
|
||||||
|
if data_path is not None
|
||||||
|
else (BASE_PATH / 'data')
|
||||||
|
)
|
||||||
|
|
||||||
|
# %%
|
||||||
|
with open(
|
||||||
|
(
|
||||||
|
data_aug_pickle_path
|
||||||
|
if data_aug_pickle_path is not None
|
||||||
|
else (DATA_PATH / data_aug_pickle_relpath)
|
||||||
|
),
|
||||||
|
'rb',
|
||||||
|
) as input_file:
|
||||||
|
df_orig = pickle.load(input_file)
|
||||||
|
|
||||||
|
# %%
|
||||||
|
df_orig.head(0x10)
|
||||||
|
|
||||||
|
# %%
|
||||||
|
len(df_orig)
|
||||||
|
|
||||||
|
# %%
|
||||||
|
df_orig.info()
|
||||||
|
|
||||||
|
# %%
|
||||||
|
feature_columns = (
|
||||||
|
'selling_price',
|
||||||
|
'driven_kms',
|
||||||
|
'fuel_type',
|
||||||
|
'selling_type',
|
||||||
|
'transmission',
|
||||||
|
#'owner',
|
||||||
|
'age',
|
||||||
|
)
|
||||||
|
|
||||||
|
target_columns = (
|
||||||
|
'present_price',
|
||||||
|
)
|
||||||
|
|
||||||
|
# %%
|
||||||
|
features_to_scale_to_standard_columns = (
|
||||||
|
'selling_price',
|
||||||
|
'driven_kms',
|
||||||
|
'age',
|
||||||
|
)
|
||||||
|
assert all(
|
||||||
|
(col in df_orig.select_dtypes(('number',)).columns)
|
||||||
|
for col in features_to_scale_to_standard_columns
|
||||||
|
)
|
||||||
|
|
||||||
|
features_to_encode_one_hot_columns = (
|
||||||
|
'fuel_type',
|
||||||
|
'selling_type',
|
||||||
|
'transmission',
|
||||||
|
#'owner',
|
||||||
|
)
|
||||||
|
assert all(
|
||||||
|
(col in df_orig.select_dtypes(('category', 'object')).columns)
|
||||||
|
for col in features_to_encode_one_hot_columns
|
||||||
|
)
|
||||||
|
|
||||||
|
# %%
|
||||||
|
df_orig_features = df_orig[list(feature_columns)]
|
||||||
|
df_target = df_orig[list(target_columns)]
|
||||||
|
|
||||||
|
# %%
|
||||||
|
DF_TEST_PORTION = 0.25
|
||||||
|
|
||||||
|
# %%
|
||||||
|
df_orig_features_train, df_orig_features_test, df_target_train, df_target_test = (
|
||||||
|
sklearn.model_selection.train_test_split(
|
||||||
|
df_orig_features, df_target, test_size=DF_TEST_PORTION, random_state=0x7AE6,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
# %%
|
||||||
|
tuple(map(len, (df_target_train, df_target_test)))
|
||||||
|
|
||||||
|
# %%
|
||||||
|
preprocess_transformer = sklearn.compose.ColumnTransformer(
|
||||||
|
[
|
||||||
|
('scale_to_standard', sklearn.preprocessing.StandardScaler(), features_to_scale_to_standard_columns),
|
||||||
|
(
|
||||||
|
#'encode_categoricals_one_hot',
|
||||||
|
'encode_categoricals_wrt_target',
|
||||||
|
#sklearn.preprocessing.OneHotEncoder(),
|
||||||
|
sklearn.preprocessing.TargetEncoder(
|
||||||
|
target_type='continuous', smooth='auto', cv=3, shuffle=True, random_state=0x2ED6,
|
||||||
|
),
|
||||||
|
features_to_encode_one_hot_columns,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
remainder='drop',
|
||||||
|
)
|
||||||
|
|
||||||
|
# %%
|
||||||
|
regressor = sklearn.ensemble.RandomForestRegressor(
|
||||||
|
10, criterion='squared_error', max_features='sqrt', random_state=0x016B,
|
||||||
|
)
|
||||||
|
|
||||||
|
# %%
|
||||||
|
pipeline = sklearn.pipeline.Pipeline([
|
||||||
|
('preprocess', preprocess_transformer),
|
||||||
|
('regress', regressor),
|
||||||
|
])
|
||||||
|
|
||||||
|
# %%
|
||||||
|
pipeline
|
||||||
|
|
||||||
|
# %%
|
||||||
|
_ = pipeline.fit(df_orig_features_train, df_target_train.iloc[:, 0])
|
||||||
|
|
||||||
|
# %%
|
||||||
|
target_test_predicted = pipeline.predict(df_orig_features_test)
|
||||||
|
|
||||||
|
# %%
|
||||||
|
metrics = {
|
||||||
|
'mse': sklearn.metrics.mean_squared_error(df_target_test, target_test_predicted),
|
||||||
|
'mae': sklearn.metrics.mean_absolute_error(df_target_test, target_test_predicted),
|
||||||
|
'mape': sklearn.metrics.mean_absolute_percentage_error(df_target_test, target_test_predicted),
|
||||||
|
}
|
||||||
|
|
||||||
|
# %%
|
||||||
|
metrics
|
||||||
Ссылка в новой задаче
Block a user