{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.9"
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
},
"colab": {
"name": "01_anaconda.ipynb",
"provenance": [],
"collapsed_sections": []
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "BNubkiT4G68T"
},
"source": [
"# Python для анализа данных"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "U0oYNIZhG68b"
},
"source": [
"Цель данного материала — познакомить вас с Anaconda — инструментом, который поможет вам в программировании на Python и не только. Он пригодится, чтобы не запутаться в версиях установленных библиотек, а также с лёгкостью поможет установить необходимые для курса пакеты.\n",
"\n",
"Это лишь один из общепринятых инструментов для аналитики, другие мы затронем позже или же в других курсах, посвящённых статистике."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ynbsztpxG68c"
},
"source": [
"## Anaconda"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2019-09-29T17:28:21.994252Z",
"start_time": "2019-09-29T17:28:21.991323Z"
},
"id": "brRkQrn2G68c"
},
"source": [
" "
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "-MVmPcsEG68c"
},
"source": [
"[`Anaconda`](https://www.anaconda.com)наиболее известна как дистрибутив `Python` со встроенным в него пакетным менеджером `conda`. Она позволяет изолировать окружение проекта от системной версии `Python`, который критически необходим для работы системы. [Использование `sudo pip` считается плохой практикой](https://askubuntu.com/questions/802544/is-sudo-pip-install-still-a-broken-practice). Также `conda` позволяет без проблем переносить окружение с одной машины на другую. Кроме того, если вы что-то сломаете, то с `Anaconda` вы всегда сможете откатиться на более старую версию окружения. Конечно, если вы позаботитесь о регулярных бэкапах. С системной версией `Python` это гораздо сложнее и может потребовать переустановки системы.\n",
"\n",
"Въедливый читатель скажет, что вместо `Anaconda` можно использовать [`virtualenv`](https://virtualenv.pypa.io/en/latest/) или [`docker`](https://www.docker.com). Тем не менее, `docker` это чаще всего `overkill` для простых проектов. Его сложно настраивать, он работает относительно медленно и требует `sudo`-прав. Связка `pip + virtualenv` хорошо работает для `Python`-only проектов, но вам также может быть придётся также работать с `R`. Кроме того, `conda` во многом аналогична пакетному менеджеру внутри операционной системы и позволяет локально без `sudo`-прав, которых в облаке у вас почти никогда нет, установить `gcc`, бразуер, альтернативный `shell` и многое другое для 100+ языков. С более подробным сравнением `Anaconda` с альтернативными инструментами вы можете ознакомиться [по ссылке](https://jakevdp.github.io/blog/2016/08/25/conda-myths-and-misconceptions/).\n",
"\n",
"Мы установим `Anaconda` и настроим с её помощью комфортное окружение для работы над учебными курсами. \n",
"\n",
"**Замечание:** *`Anaconda` можно поставить и под `Windows`, на официальном сайте есть инструкция. Тем не менее, мы не берёмся гарантировать, что всё заработает. Портирование кода под `Windows` это долго и дорого, потому большая часть библиотек по анализу данных и машинному обучению доступны только под `Linux`.*\n",
"\n",
"### Установка `Anaconda`\n",
"\n",
"Скачайте последнюю версию `Anaconda` под свою ОС с [официального сайта](https://www.anaconda.com/distribution/). Запустите установочный файл и следуйте инструкциям. Не меняйте дефолтные параметры без уважительной причины.\n",
"После установки перезагрузите терминал, например, с помощью команды `exec bash`. Если всё прошло успешно, то ячейка ниже должна отработать без ошибок:"
]
},
{
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2019-09-29T17:37:19.084354Z",
"start_time": "2019-09-29T17:37:19.082358Z"
},
"id": "XsCu8lfhG68d",
"outputId": "df6a3a2b-184e-469c-dd9f-3f4fa8ef57ec"
},
"source": [
"!conda --version"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"conda 4.7.11\r\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "4Z9z0SGNG68f"
},
"source": [
"### Создание `conda environment`\n",
"\n",
"**Заводить отдельный `environment` для каждого проекта — правило хорошего тона.** Устанавливать всё в корневой `envirnonment` — прямой путь в отдельный круг ада, на который вы обрекаете себя в будущем. Кроме того, что это противоречит философии `conda`, — возможности сосуществования несовместимых дистрибутивов `Python` в пределах одной системы, — это также приводит к неконтролируемому росту числа установленных пакетов. Для разрешения зависимостей `conda` использует [приближённый `SAT-solver`](https://www.anaconda.com/understanding-and-improving-condas-performance/), а задача `SAT` `NP`-полна, потому упорное использование только одного `environment`-а вскоре приведёт к тому, что вы будете часами ждать установки пакетов. \n",
"\n",
"Выполнив в терминале код из ячейки ниже, вы создадите `environment` для нашего курса в директории `~`:\n",
"\n",
"```bash\n",
"conda create -n mipt-stats python=3.7 r=3.6 --yes\n",
"```\n",
"\n",
"Эта команда создаст `environment`, в котором уже будут установлены `Python` и `R`, что сэкономит вам время в будущем. \n",
"Активируйте окружение, запустив в терминале ячейку ниже:\n",
"\n",
"```bash\n",
"conda activate mipt-stats\n",
"```\n",
"\n",
"Если вы захотите вернуться в базовое окружение, введите\n",
"\n",
"```bash\n",
"conda deactivate\n",
"```\n",
"\n",
"Если вы хотите создать окружение в другой папке, то замените флаг `-n` на `-o`\n",
"\n",
"```bash\n",
"conda create -o path/to/env python=3.7 r=3.6 --yes\n",
"```\n",
"\n",
"Обратите внимание, что при этом вам придётся указывать полный путь при использовании команды `conda activate`:\n",
"\n",
"```bash\n",
"conda activate /path/to/env\n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "dnbjEYtcG68f"
},
"source": [
"### Установка `mamba` и основных пакетов "
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "NNBNdjTNG68g"
},
"source": [
"Выше упоминалось, что для разрешения зависимостей `conda` приближённо решает задачу `SAT`. К сожалению и стыду разработчиков из `Continuum`, `SAT-solver` в `conda` написан на `pure Python`, из-за чего он работает возмутительно медленно. Эту проблему решает [`mamba`](https://medium.com/@wolfv/making-conda-fast-again-4da4debfb3b7) — `SAT-solver` для `conda`, написанный на `C++` компанией [`QuantStack`](https://quantstack.net/the-team.html)."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "XDnUsYRVG68g"
},
"source": [
"```bash\n",
"conda install -c conda-forge mamba --yes\n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "zbP85vaAG68g"
},
"source": [
"Далее везде используйте `mamba install` вместо `conda install`."
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2019-09-29T16:12:35.495304Z",
"start_time": "2019-09-29T16:12:35.491961Z"
},
"id": "WxgCew2RG68h"
},
"source": [
"Аргумент `-c` позволяет указать репозиторий, в котором будет осуществляться поиск. **Настоятельно рекомендуется использовать репозиторий [`conda-forge`](https://conda-forge.org)**, т.к. там почти всегда можно найти актуальные версии пакетов, чего не скажешь об основном репозитории `Anaconda`. Причина в том, что `conda-forge` управляется сообществом пользователей `conda`, в то время как право добавлять пакеты в основной репозиторий имеют только разработчики из `Continuum`. **Устанавливать пакеты из других репозиториев стоит только при необходимости**, т.к. это может привести к переустановке уже установленных пакетов с их заменой на те версии из репозитория, из которого вы хотите что-то установить.\n",
"\n",
"Теперь установим те пакеты, которые вам почти наверное понадобятся при выполнении домашних заданий. "
]
},
{
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2019-09-29T16:28:46.888980Z",
"start_time": "2019-09-29T16:28:46.885804Z"
},
"id": "M9GvfsJSG68h"
},
"source": [
"!mamba install -c conda-forge pip git numpy \\\n",
"scipy statsmodels sympy pandas tqdm --yes"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "eUq__uz1G68h"
},
"source": [
"**Важное замечание: никогда не смешивайте `pip` и `conda`!** \n",
"\n",
"Подробное обсуждение этого вопроса можно прочитать [на stackoverflow](https://stackoverflow.com/questions/56134588/is-that-a-bad-idea-to-use-conda-and-pip-install-on-the-same-environment). Кратко, `conda` и `pip` были созданы для принципиально разных задач и \"не знают\" друг о друге: пакеты, которые вы установили через `pip`, будут видны изнутри `conda`, так как они ставятся напрямую в системный `Python`, но никакой инкапсуляции при этом не получится. Они не будут учитываться `conda` при разрешении зависимостей, а также могут быть параллельно установлены через `conda` в другой версии, что приведёт к странным ошибкам и неизбежному моральному падению. \n",
"\n",
"Более того, даже если вы установите `pip` через `conda`, это всё ещё будет не то же самое, что установка пакетов через `conda` обычным образом. Гарантировать корректное разрешение зависимостей при этом будет нельзя. "
]
}
]
}