In [5]:
%%html
<style>
.text_cell_render * {
   font-family: OfficinaSansCTT;
}
.reveal code {
    font-family: OfficinaSansCTT;
}
.text_cell_render h3 {
   font-family: OfficinaSansCTT;
}
.reveal section img {
    max-height: 500px;
    margin-left: auto;
    margin-right: auto;
}
</style>


Вопросы

  • Что такое BLAS?
  • Как сделать в Numpy вот такую матрицу?
    array([[ 0,  4,  8, 12],
         [ 1,  5,  9, 13],
         [ 2,  6, 10, 14],
         [ 3,  7, 11, 15]])
    
  • Какой параметр функции read_csv() в Pandas позволяет не читать весь файл сразу целиком в память? И как посмотреть, сколько места датафрейм занимает в памяти?
  • Какой метод колонки является аналогом df[column].groupby(column).count()?
  • Опишите своими словами, как решается задача предсказания методом линейной регрессии с использованием .

Что такое DevOps?

  • Это набор практик

Создание полноценного проекта на Python

  • Шаг 1: Создаем virtualenv для работы (это мы уже умеем)
  • Шаг 2: Создаем репозиторий на Github

In [ ]:

Создание полноценного проекта на Python

  • Шаг 1: Создаем virtualenv для работы
  • Шаг 2: Создаем репозиторий на Github
  • Шаг 3: Описываем аргументы командной строки и конфигурационные файлы (если нужно)

Модуль argparse

  • Помните sys.argv?

In [ ]:
import argparse

def build_parser():
    parser = argparse.ArgumentParser()
    parser.add_argument(
        '-c', '--config', dest='config', action='store', type=str,
        help='path to custom config',
        default=os.path.join(os.path.dirname(__file__), "config.yaml")
    )
    return parser

def main():
    parser = build_parser()
    params, other_params = parser.parse_known_args()
    conf = load_config(params.config)
    ...

Конфигурационные файлы

  • В конфигурационном файле должны быть все настройки программы, которые мы хотим менять без модификации ее кода
  • Формат конфига может быть любым, я бы предложил взять YAML, JSON или INI (про INI можно почитать вот тут - https://docs.python.org/3/library/configparser.html)

Создание полноценного проекта на Python

  • Шаг 1: Создаем virtualenv для работы
  • Шаг 2: Создаем репозиторий на Github
  • Шаг 3: Описываем аргументы командной строки и конфигурационные файлы (если нужно)
  • Шаг 4: Сохраняем зависимости нашего проекта в отдельный файл, который затем включим в пакет
  • pip freeze > requirements.txt
  • Посмотрим глазами на содержимое. На некоторых системах эта команда создает ненужную запись о несуществующем пакете "pkg-resources==0.0.0" - удалим ее, если она присутствует.

Создание полноценного проекта на Python

  • Шаг 1: Создаем virtualenv для работы
  • Шаг 2: Создаем репозиторий на Github
  • Шаг 3: Описываем аргументы командной строки и конфигурационные файлы (если нужно)
  • Шаг 4: Сохраняем зависимости нашего проекта в отдельный файл, который затем включим в пакет
  • Шаг 5: Структурируем программу, как пакет
my_package <- это папка с нашим проектом
├── MANIFEST.in  <- до этого мы сейчас дойдем
├── my_package  <- это папка с именем нашего модуля, то, что будет в "import my_package"
│   ├── cli.py  <- это базовый файл с нашим кодом
│   ├── config.yaml  <- это файл конфигурации
│   └── __init__.py  <- это чаще всего пустой файл, который превращает папку в модуль питона
├── requirements.txt  <- это наш файл с зависимостями
└── setup.py  <- до этого мы сейчас дойдем

Пакеты Python

  • Помните эту команду? pip install -U pip wheel setuptools
  • Пакеты бывают (в общем случае) двух типов:
    • архивы (чаще всего формата .tar.gz)
    • бинарные дистрибутивы (формата .whl)
  • Главный файл пакета - setup.py
  • Интерпретатор по умолчанию ищет пакеты в /usr/lib/python3.6 , либо же в venv/lib/python3.6/site-packages
  • Можно передавать дополнительные пути для поиска с помощью переменной окружения PYTHONPATH или добавляя их в sys.path

In [ ]:
# setup.py

import os
import os.path

from setuptools import find_packages
from setuptools import setup

def find_requires():
    dir_path = os.path.dirname(os.path.realpath(__file__))
    requirements = []
    with open('{0}/requirements.txt'.format(dir_path), 'r') as reqs:
        requirements = reqs.readlines()
    return requirements


if __name__ == "__main__":
    setup(
        name="my_package",
        version="0.0.1",
        description='my cool package',
        packages=find_packages(),
        install_requires=find_requires(),
        include_package_data=True,
        entry_points={
            'console_scripts': [
                'my_command = my_package.cli:main',
            ],
        },
    )

MANIFEST.in (включить не-питоновые файлы в проект)

include *requirements.txt
recursive-include my_package *

Создание полноценного проекта на Python

  • Шаг 1: Создаем virtualenv для работы
  • Шаг 2: Создаем репозиторий на Github
  • Шаг 3: Описываем аргументы командной строки и конфигурационные файлы (если нужно)
  • Шаг 4: Сохраняем зависимости нашего проекта в отдельный файл, который затем включим в пакет
  • Шаг 5: Структурируем программу, как пакет
  • Шаг 6 (опциональный): Используем "pip install --editable ." для отладочного режима

Пути и import

  • Более старый, но стабильный вариант - python setup.py develop
  • Гораздо меньше ошибок возникает, если всегда использовать путь от имени пакета
  • Любые изменения в файлах сразу же станут видны внутри пакета
  • Точнее, не сразу, а после перезапуска интерпретатора

Создание полноценного проекта на Python

  • Шаг 1: Создаем virtualenv для работы
  • Шаг 2: Создаем репозиторий на Github
  • Шаг 3: Описываем аргументы командной строки и конфигурационные файлы (если нужно)
  • Шаг 4: Сохраняем зависимости нашего проекта в отдельный файл, который затем включим в пакет
  • Шаг 5: Структурируем программу, как пакет
  • Шаг 6 (опциональный): Используем "python setup.py develop" для отладочного режима
  • Шаг 7: Проверяем, что пакет реально собирается

Сборка в tar.gz

  • python setup.py sdist
  • Создает папки dist и %имя проекта%.egg-info, вторую можно смело удалить (там метаданные)
  • Созданный в папке dist архив и будем собранным пакетом Python
  • https://packaging.python.org/tutorials/distributing-packages/

Сборка в .whl

  • python setup.py bdist_wheel (есть еще опция --universal, когда проект совместим с Python 2)
  • Создает те же папки плюс build, где будет примерная структура пакета после инсталляции
  • В папке dist появится файл .whl, который будет бинарным пакетом Python
  • Во многих случаях собранный бинарный пакет будет устанавливаться только на ту же ОС, где собирался

Создание полноценного проекта на Python

  • Шаг 1: Создаем virtualenv для работы
  • Шаг 2: Создаем репозиторий на Github
  • Шаг 3: Описываем аргументы командной строки и конфигурационные файлы (если нужно)
  • Шаг 4: Сохраняем зависимости нашего проекта в отдельный файл, который затем включим в пакет
  • Шаг 5: Структурируем программу, как пакет
  • Шаг 6 (опциональный): Используем "python setup.py develop" для отладочного режима
  • Шаг 7: Проверяем, что пакет реально собирается
  • Шаг 8: Отмечаем файлы, которые мы не хотим загружать в систему контроля версий

Файл .gitignore

  • Файл находится в корне проекта/репозитория. Если его там нет - создайте его
  • Просто пишем пути к файлам, которые не хотим отслеживать

Создание полноценного проекта на Python

  • Шаг 1: Создаем virtualenv для работы
  • Шаг 2: Создаем репозиторий на Github и клонируем его к себе
  • Шаг 3: Описываем аргументы командной строки и конфигурационные файлы (если нужно)
  • Шаг 4: Сохраняем зависимости нашего проекта в отдельный файл, который затем включим в пакет
  • Шаг 5: Структурируем программу, как пакет
  • Шаг 6 (опциональный): Используем "python setup.py develop" для отладочного режима
  • Шаг 7: Проверяем, что пакет реально собирается
  • Шаг 8: Отмечаем файлы, которые мы не хотим загружать в систему контроля версий
  • Шаг 9: Заливаем код в Git

Вспоминаем работу с Git из консоли

  • Все команды набираем внутри нашей папки с проектом
  • git status # что вообще происходит
  • git add путь/к/файлу # добавляем файл в git
  • git add * # добавляем все файлы в текущей папке в git
  • git commit -m "Initial commit" # создаем коммит, то есть точку восстановления
  • git push origin master # заливаем код в репозиторий

Создание полноценного проекта на Python

  • Шаг 1: Создаем virtualenv для работы
  • Шаг 2: Создаем репозиторий на Github и клонируем его к себе
  • Шаг 3: Описываем аргументы командной строки и конфигурационные файлы (если нужно)
  • Шаг 4: Сохраняем зависимости нашего проекта в отдельный файл, который затем включим в пакет
  • Шаг 5: Структурируем программу, как пакет
  • Шаг 6 (опциональный): Используем "python setup.py develop" для отладочного режима
  • Шаг 7: Проверяем, что пакет реально собирается
  • Шаг 8: Отмечаем файлы, которые мы не хотим загружать в систему контроля версий
  • Шаг 9: Заливаем код в Git
  • Шаг 10: Документация

Модуль Sphinx

  • создадим папку docs
  • pip install sphinx sphinx-argparse
  • в папке docs: sphinx-quickstart
  • лучше задать значения для: "Project name", "Author name(s)", "Project version", "autodoc: automatically insert docstrings from modules" (y), "viewcode: include links to the source code of documented Python objects" (y)
  • в файле conf.py в extensions добавим 'sphinxarg.ext', а еще наверху раскомментируем и поправим одну точку на две:

In [ ]:
import os
import sys
sys.path.insert(0, os.path.abspath('..'))
  • добавим логотип для красоты:
    • html_logo = '../logo.png'
  • добавим в index.rst после ":caption: Contents:" строчки "quickstart" и "develop"
  • это значит, нам надо будет создать два файла - quickstart.rst и develop.rst в том же каталоге

quickstart.rst

Quickstart
==========

.. contents:: :local:

.. argparse::
   :module: my_package.cli
   :func: build_parser
   :prog: my_command

develop.rst

Reference
=========

.. contents:: :local:

.. automodule:: my_package.cli
    :inherited-members:
  • make html или make.bat html - в папке _build/html создастся куча файлов, главный - index.html

Создание полноценного проекта на Python

  • Шаг 1: Создаем virtualenv для работы
  • Шаг 2: Создаем репозиторий на Github и клонируем его к себе
  • Шаг 3: Описываем аргументы командной строки и конфигурационные файлы (если нужно)
  • Шаг 4: Сохраняем зависимости нашего проекта в отдельный файл, который затем включим в пакет
  • Шаг 5: Структурируем программу, как пакет
  • Шаг 6 (опциональный): Используем "python setup.py develop" для отладочного режима
  • Шаг 7: Проверяем, что пакет реально собирается
  • Шаг 8: Отмечаем файлы, которые мы не хотим загружать в систему контроля версий
  • Шаг 9: Заливаем код в Git
  • Шаг 10: Документация
  • Шаг 11: Тестирование (обсудим в другой раз)