pyth_06_list_process
Заметка 6. Функциональное программирование.
курса Математический практикум по Питону.
Шокуров Антон В.
shokurov.anton.v@yandex.ru
http://машинноезрение.рф
Версия 0.15

Аннотация

На базе задачи построения графиков, в частности, эмитентов, вводится функциональный подход в рамках (Python версии 3.xx). Рассматриваются map filter и reduce, а также библиотека csv. Далее изучаются более продвинутые функции функционального программирования из базовых модулей itertools, functools и operator. В частности, повторы (count, ...), комбинации (product, ...), обработка (chain, starmap, dropwhile, ...) частичное вычисление (partial и attrgetter). Ключевые слова: map, filter, reduce, lambda, matplotlib, pyplot, xlim, xticks, csv и plot.

Это предварительная версия! Любые замечания приветствуются.

Отрисовка цены эмитента

Обработка данных из списка

Рассмотрим как можно обрабатывать список элементов. Замечу, что существуют три главных действия на список элементов.

map

Возьмем список неких чисел.

Можно короче использую языковые конструкции.

Пока результат не вывелся.

Map это объект ленивого действие (~генератор). Нужно чтобы числа им были сгенерированы.

Ну или

Преобразование

Как задать собственное преобразование. Для простых преобразований в питоне есть лямбда функции.

Данная конструкция задается следующим образом:

lambdaсписок аргументов/параметров : действие/значение.

Упр. Для квадратного уравнения расписать значения в точках (например корнях).

Частично заданые аргументы

filter

Используется для фильтрации (как сито) элементов списка. После обработки остаются не все элементы списка. Остаются только те для которые дают истину (для предиката).

Так нельзя

список студентов

Упр. Оставить тех студентов у которых имя завершается на букву а.

От двух аргументов

reduce

Другим действием является редукция, т.е. сведение списка к некому значению.

Условно,

а можно было бы

Значения совпали

магия

Отрисовка графиков

Будем строить функцию по-точечно, т.е. построем значение в каждой из выбранных точек и соеденим соседнии прямой. Для начала сгенерируем точки в которых будет вычислена функция.

Ввиду того, что количество точек по которым строилась кривая было небольшим, синусойда получилась угловатой.

Считать файл csv

Берем откуда-то простой csv (comma seperated values) файл. Отмечу, что расширение у некго не обязано быть csv, оно может быть и txt.

Например с https://www.finam.ru/profile/moex-akcii/mechel/export/ Параметры можно менять: сменить эмитента (например, выбрать Газпром, Сбербанк и тому подобное), период (например, выбрать день). Промежуток времени пока лучше выбрать поменьше. Внимание, пока скачиваем файл без заголовка (убрать соответствующий флажок)! Символ ; в качестве разделителя.

Для считывания данных файлов потребуется библиотека csv.

Видно, что строчки из файла считались целиком, как текстовые строчки (обрати внимание на одинарные кавычки). Хотелось бы чтобы каждый столбец отделился от других столбцов. Для этого можно указать дополнительный параметр функции обработки csv файлов. Параметр delimiter, он указывает какой разделитель используется для отделения стобцов.

Теперь видно, что все стобцы считались по отедльности. Но каждый элемент по прежнему является стройчкой. Нужно для тех стобцов про кторые мы знаем наверняка выполнить явное пробразование из текста в число.

Ранее нам уже встречалось явное преобразование, когда мы преобразовывали истинность в число.

Нам должна быть известна структура входного файла. Точнее должно быть известно назначение столбцов. Для ранее скаченного файла она такая: TICKER, PER, DATE, TIME, OPEN, HIGH, LOW, CLOSE, VOL. Предпоследний столбец соответствует цене закрытия.

Теперь все сработало и был считан столбец значений.

Теперь возьмем файл побольше и построим график.

Графики

Упр. Нарисуй графики процентного изменения цены данного эмитента с начала периода. С легендой.

Функциональное программирование

Последовательности

Повторы

До бесконечности.

То как отвечать в некоторых опросах:

Комбинации

Варианты для выход на улицу

Обработка

Аккумулирование, частичные суммы.

Конкатенация последовательностей.

Разбиение на группы. Должны быть отсортированы

Вызов многоаргументной функции

Последовательность

пронумеровать

оставим только числа

Позволяет вырезать каждый n-ый

Дублируем итератор.

Сдвигаются на один

Тогда можно так

Лучше их обрабатывать в параллель.

Упр. Как транспонировать матрицу (список списков)? Использовать разрешено только что пройденные методы/приемы.

Частичное задание аргументов

Функции

Возведение в степень

Хотим задать первый аргумент

Ранее делали так:

А можно так используя встроенную функцию.

А как явно задать второй?

Печать

Методы

Обработка списка

Операторы

Стандартные

Атрибут

конечно можно было бы

или

Скорее полезно если поля вводится

Упр. Написать ламбда функцию которая вычисляет значение квадратичной функции по заданным коэффициентам и точке. Потом применить частичную задачу аргументов для коэффициентов.