Файл: Тема Основы языка Python.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 04.12.2023

Просмотров: 134

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

101
При этом на этапе вызова операции умножения уже нельзя предпринять какие-то действия.
Например, попросить пользователя ввести все-таки комплексное число. Или, при обработке последовательности, из которой нужно вычленить и перемножить комплексные числа, – просто перейти к следующему элементу последовательности. На этапе неудачного выполнения операции умножения мы не знаем и не можем знать, как должна вести себя конкретная программа при возникновении такой ошибки.
При ошибочной операции мы можем сконструировать специальный класс, содержащий подробное описание ошибки, и использовать его в том месте программы, которое способно его обработать
Выбрасывается ошибка с помощью команды raise, а ловится блоком try-except. Для случая умножения комплексного числа на некорректное значение можно сконструировать класс ошибки, содержащий в себе ссылку как на комплексное число, так и на второй аргумент метода умножения.
Класс для ошибки должен быть наследником стандартного класса
BaseException. Пока для нас это значит только то, что при создании описания класса ошибки нужно написать в скобках после его названия BaseException.
Потенциально ошибочные действия должны выполняться в блоке try, а команды для обработки ошибки должны быть в блоке except. Пример с обработкой ошибки будет выглядеть так. Как это представлено на рис. 133.

102
Рис. 133. Пример реализации обработки ошибок
Вывод этой программы:
Error in mul with args: 1+2i abcd.
По нему легко понять, что ошибка возникает при операции умножения, и увидеть, что было передано в неё в качестве аргументов.

103
После команды except мы можем указать имя класса ошибки, который он должен обрабатывать, затем написать «as» и указать имя переменной, в которую попадет объект с описанием конкретной ошибки.
Блоков except может быть несколько для обработки ошибок разных типов. Проверки выполняются последовательно, будет выполнен тот блок команд, у которого имя класса совпадает с именем класса ошибки или является его предком в дереве иерархии наследования.
Наследование и полиморфизм
Операции сложения и умножения на вещественное или целое число для комплексных чисел очень похожи на поведение свободных векторов на плоскости. Они соответствуют сложению векторов или умножению вектора на число, где действительная часть комплексного числа является x- координатой вектора, а мнимая – y-координатой.
Кроме того, свободный вектор обладает некоторыми операциями, которые характерны только для него, но не для вещественного числа. Это может быть метод length, вычисляющий длину вектора. Нам не хотелось бы засорять код для описания комплексного числа методами для работы со свободным вектором, но, с другой стороны, не хотелось бы и заново переписывать методы сложения и умножения для свободных векторов.
В такой ситуации разумно создать новый класс для описания свободного вектора (или, то же самое, точки на плоскости), который унаследовал бы все методы комплексных чисел и добавил бы новый метод length.
Мы уже знаем, что для того, чтобы пронаследовать класс от другого, достаточно в описании класса указать в круглых скобках, от кого он наследуется. Таким образом, мы можем записать наше описание класса Point с определенным методом length так, как показано на рис. 134.


104
Рис. 134. Пример использования наследования
Вывод этой программы:
5.0 4+6i

105
Здесь мы не только убедились в том, что свежесозданный метод работает, но и сделали довольно странную вещь: сложили точку на плоскости с комплексным числом. Дело в том, что объект а класса Point также одновременно является и объектом типа Complex, т. к. Point пронаследован от Complex. Point лишь расширяет и дополняет Complex, а значит, Point может смело быть интерпретирован как Complex, но не наоборот.
В этом примере истинны выражения isinstance(a, Point) и isinstance(a,
Complex), но ложно выражение isinstance(b, Point).
Переопределение методов
Объект типа Point напечатается как комплексное число. Нам хотелось бы, чтобы точки на плоскости печатались в виде (x, y), а не x+yi.
В языке Питон любой метод можно переопределить в наследнике, что мы и сделаем для метода __str__ для класса Point (рис. 135).

106
Рис. 135. Пример переопределения методов
Наш метод обязан возвращать строку, но мы можем воспользоваться функцией str от кортежа, которая выдаст нам нужный результат.
Проектирование структуры классов

107
Структура описания классов представляет собой дерево (на самом деле в Питоне – ациклический граф) с корнем в виде базового пустого класса.
С помощью грамотно спроектированной структуры классов можно добиться легкой читаемости и максимального повторного использования кода, обеспечения единого интерфейса и множества других преимуществ.
Однако внесение фичи или изменение на высоком уровне иерархии классов могут привести к необходимости выполнить огромное количество работы по модификации всех потомков этого класса, а также к полной несовместимости с предыдущей версией. Многочисленные изменения такого рода приводят к уродливым конструкциям, которые невозможно понимать и отлаживать.
В то же время закладывание перспективных фичей в структуру классов ведет к переусложнению и сводит на нет все повторное использование кода за счет громоздкости конструкций. Кроме того, перспективные фичи могут быть недостаточно обдуманы и приведут к еще большим неудобствам, когда дело дойдет до их реальной реализации (если дойдет).
Таким образом, грамотное проектирование системы классов требует не только хорошего знания паттернов проектирования, но и большого практического опыта. На начальном этапе стоит обучаться проектированию систем, в которые не планируется внесение изменений.


108
1   2   3   4   5   6

Тема 3. Библиотеки для управления данными
3.1. Python Pandas
Pandas – библиотека языка Python, инструменты которой позволяют работать с наборами разных типов данных, хранить, обрабатывать и анализировать данные в одномерных и двумерных таблицах.
При помощи Pandas можно создавать объекты типа Series (одномерная структура данных) и DataFrame (двумерная структура данных), считывать и записывать файлы ряда форматов, таких как .csv, .xlsx, .html и др. (рис. 136).
Series([данные, индекс, тип, имя, копия, …]) – одномерный массив
(ndarray) с метками оси (включая временные ряды).
Рис. 136. Создание объекта Series pandas
DataFrame([данные]) – двумерные, изменяемые по размеру, потенциально неоднородные табличные данные (рис. 137).
Рис. 137. Создание объекта DataFrame pandas

109
В библиотеке pandas существует поддержка специального временного типа данных – дат (рис. 138).
Рис. 138. Работа с типом данных дата в pandas
Официальное руководство (https://pandas.pydata.org) рекомендует начать знакомство с библиотекой pandas с раздела «10 минут до pandas», предназначенного для начинающих пользователей.
При обращении к библиотеке pandas может быть использовано сокращение pd. В строке кода – import pandas as pd – библиотека pandas импортируется в переменную pd.
Чтение файлов в формате .csv, .xlsx
Инструменты ввода/вывода pandas – это набор функций верхнего уровня – readers и writers. Для чтения файлов разных форматов в библиотеке pandas предусмотрены разные функции (табл. 7).
Таблица 7
Тип формата
Описание данных
Функция readers
Текст
CSV read_csv
Текст
JSON read_json
Текст
HTML read_html
Текст
Локальный буфер обмена / Local clipboard read_clipboard
MS Excel read_excel
Двоичный
OpenDocument read_excel

110
Двоичный
HDF5 Format read_hdf
Двоичный
Stata read_stata
SQL
SQL read_sql
SQL
Google BigQuery read_gbq
Функция pandas.read_csv считывает файл значений, разделенных запятыми (csv), в DataFrame. Также поддерживает опциональную итерацию или разбиение файла на куски.
В результате обработки csv-файла с помощью pandas получается объект под названием DataFrame, который состоит из строк и столбцов.
Необходимо не только указать название файла, но также установить некоторые аргументы, такие как разделитель sep=’,’, указать индекс строки
(по умолчанию header=None), которая будет заголовком выведенной на экран таблицы. Слева добавляется колонка индекса (рис. 139).
Рис. 139. Пример кода – чтение файла и вывод первых строк файла в формате .csv
Параметр index_col указывает название столбца, имена строк в котором будут использованы в качестве индекса. Запись index_col=False используется, чтобы не использовать первый столбец в качестве индекса
(рис. 140).


111
Рис. 140. Пример кода – чтение файла и вывод последних строк файла в формате .csv
Основные атрибуты метода:
− filepath_or_buffer – указывает путь к файлу, URL (включая расположения http, ftp и S3) или любой объект с методом read();
− sep – str, разделитель, по умолчанию «,»
для read_csv(), \t для read_table();
− delimiter – альтернатива аргументу «sep»;
− delim_whitespace – boolean, определяет, будет ли пробел использоваться в качестве разделителя.
Атрибуты для расположения и названия столбцов и указателей:
− header – int или список;
− names – массивоподобный список имен столбцов для использования. Если файл не содержит строку заголовка, то должно быть передано header=None, дубликаты в этом списке не допускаются.
Функция pandas.read_excel считывает файл Excel в pandas.DataFrame.
Поддерживает расширения файлов xls, xlsx, xlsm, xlsb и odf, считываемые из локальной файловой системы или URL-адреса. Поддерживает возможность чтения одного листа или списка листов.
При считывании файлов Excel требуется парсинг листов документа.
При этом данные по умолчанию выводятся в таком виде, в каком представлены в таблице. Не требуется дополнительно указывать, на какой

112 строке будет находиться шапка заголовков таблицы, как это происходит при чтении файлов в формате .csv (рис. 141).
Рис. 141. Пример кода – чтение файла и вывод первых строк файла в формате .xlsx
Некоторые параметры метода:
− io – str, bytes, ExcelFile, xlrd.Book, путь к объекту или файловый объект – путь к объекту, может быть URL-адресом;
− sheet_name – str, int, список, или None, по умолчанию – 0 – строки используются для имен листов. Целые числа используются в позициях листа с нулевой индексацией. Списки строк / целых чисел используются для запроса нескольких листов;
− header – int или список, по умолчанию – 0 – строка (с 0 индексом), используемая для меток столбцов анализируемого фрейма данных;
− index_col – int или список, по умолчанию – None – столбец (с 0 индексом) для использования в качестве меток строк в DataFrame.
Чтобы вывести на экран только часть DataFrame, используются методы:
− pandas.DataFrame.head() – по умолчанию возвращает первые n (по умолчанию 5) строк файла, можно самостоятельно задать количество строк в

113 выборке. При отрицательных значениях n эта функция возвращает все строки, кроме последних n строк, что эквивалентно df[:-n];
− pandas.DataFrame.tail() – по умолчанию возвращает последние n (по умолчанию 5) строк файла, также можно указать несколько строк на выбор.
Полезно для быстрой проверки данных, например, после сортировки или добавления строк. При отрицательных значениях n эта функция возвращает все строки, кроме первых n строк, что эквивалентно df[n:];
− pandas.DataFrame.sample(n) – возвращает случайные n строк файла.
Работа с данными в pandas
После чтения файла и создания объекта pandas.DataFrame можно приступать к работе с данными. Для начала можно воспользоваться методом pandas.DataFrame.dtypes, чтобы посмотреть, какие данные хранятся в столбцах таблицы (рис. 142).
Рис. 142. Типы данных, хранящиеся в столбцах таблицы
По полученным результатам можно сделать вывод, что в таблице содержится столбец с категориальным признаком (тип object), и два столбца содержат количественные данные (тип int64). Эти сведения важны для проведения в дальнейшем анализа имеющихся в DataFrame данных, так как при использовании некоторых алгоритмов
(классификации или кластеризации) требуется проводить дополнительные преобразования над категориальными данными.