
2 / лр1
.docx
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
федеральное государственное автономное образовательное учреждение высшего образования
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»
Кафедра 41
ПРЕПОДАВАТЕЛЬ
Доцент, канд. техн. наук |
|
|
|
Е. Л. Турнецкая |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
Лабораторная работа №1
Связь СУБД MySQL и Python. Визуализация данных в Python.
по курсу: Базы данных
СТУДЕНТКА ГР. № |
Z0411 |
|
25.01.24 |
|
М. В. Карелина |
|
|
номер группы |
|
подпись, дата |
|
инициалы, фамилия |
Номер студенческого билета: 2020/3477
Санкт-Петербург
2024
Цель работы: произвести связь базы данных в MySQL и Python, извлечь данные из таблиц базы данных и выполнить анализ данных в БД с помощью визуализации в Python.
Порядок выполнения работы:
1. Использовать предметную область и БД, созданную в предыдущем семестре в СУБД MySQL. Описать вашу предметную область в отчете, обязательно предоставить схему данных из MySQL Workbench. Возможно, вам потребуется заполнить таблицы бОльшим количеством данных для наглядности.
2. Осуществить связь Python и вашей БД в MySQL.
3. Выполнить один запрос на выборку всех данных из одной таблицы на выбор в вашей БД, продемонстрировать результат (вывод таблицы в Python).
4. Выполнить 3 запроса в скрипте Python с использованием агрегатных функций, сортировки, группировки для вашей БД, результаты которых можно представить в виде графика или гистограммы.
Для своей БД вам необходимо самостоятельно придумать полезные запросы, которые могут использоваться для получения той или иной статистики в вашей предметной области.
5. Выполнить визуализацию с помощью Python. Графики должны быть наглядными, график обязательно должен иметь заголовок, подписи к осям, а также отображать показательные значения (например, название фильма, а не id фильма). Обязательно сделать графики двух разных видов (примеры: горизонтальная и вертикальная столбчатая диаграмма, групповая столбчатая диаграмма, круговая диаграмма, график). Можно сделать несколько линий на одном графике, при необходимости использовать легенду и любые другие возможности matplotlib.
6. К полученным графикам необходимо дать пояснения, прокомментировать результаты.
Вариант 8. Обслуживание рейсов в аэропорту
Аэропорт обслуживает рейсы разных авиакомпаний. У каждой авиакомпании есть несколько рейсов. Авиакомпании предоставляют самолеты различного типа (вместимости). Самолеты характеризуются типом, годом выпуска, количеством мест и фирмой-производителем. В один город могут быть несколько рейсов в разное время, осуществляемых различными авиакомпаниями. Самолеты обслуживаются экипажем: 7 командир корабля, второй пилот, штурман, бортинженер и стюардессы. О сотрудниках хранится следующая информация: Ф.И.О., должность, квалификация, экипаж. Рейс имеет свой номер, пункт отправления, пункт прибытия, время вылета, время в пути, тип самолета, название авиакомпании, обслуживающей данный рейс. Билет на самолет имеет свой номер и № рейса, ФИО пассажира, № места, стоимость, дата продажи, дата бронирования. Пассажир, приобретая билет на самолет, сообщает о себе паспортные данные. Клиент может забронировать билет по Интернету и выкупить его за 3 часа до вылета.
В данной лабораторной работе будет использована модель данных, спроектированная в прошлых работах (Рис. 1).
Рисунок 1 - Модель данных в среде MySQL Workbench
Для подключения к базе данных MySQL из Python используется библиотека Pymysql. Пример того, как установить соединение с базой данных “аэропорт” представлен в листинге 1.
Листинг 1. Подключение к базе данных MySql
import pandas as pd import pymysql.cursors import matplotlib.pyplot as plt connection = pymysql.connect(host='127.0.0.1', user='root', password='popooioi', db='аэропорт', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor)
Пример того, как можно выполнить запрос в Python для получения всех данных из таблицы "сотрудники" и вывода результата в виде таблицы представлен в листинге 2. Результат работы кода представлен на рисунке 2.
Листинг 2. Запрос Sql в Python на получение данных из таблицы “сотрудники”
def employees(): with connection.cursor() as cursor: sql = "SELECT * FROM сотрудники" # запрос SQL # Выполнение команды запроса (Execute Query) cursor.execute(sql) rows = cursor.fetchall() # получение всех строчек df = pd.DataFrame(rows) # получение таблицы с данными (DataFrame) # Закрытие соединения connection.close() pd.set_option('display.max_columns', 4) print(df) employees()
Рисунок 2 – Вывод таблицы “сотрудники” в консоль
Теперь создадим функцию value(), которая выводит суммарную стоимость билетов по конкретным рейсам. Листинг представлен ниже. Результат выполнения программы на Рис. 3: гистограмма, где по оси х указаны номера рейсов, а по оси у их суммарная стоимость билетов.
Листинг 3. Код обработки и визуализации данных о суммарной стоимости
def value(): with connection.cursor() as cursor: sql = "SELECT `№ Рейса`, SUM(`Стоимость`) AS `Суммарная стоимость` FROM `билет` GROUP BY `№ Рейса`" cursor.execute(sql) result = cursor.fetchall() df = pd.DataFrame(result, columns=['№ Рейса', 'Суммарная стоимость']) connection.close() plt.bar(df['№ Рейса'], df['Суммарная стоимость']) plt.xlabel('Номер рейса') plt.ylabel('Суммарная стоимость') plt.title('Суммарная стоимость билетов по рейсам') plt.show() return value()
Рисунок 2 - Гистограмма функции value()
Теперь напишем функцию, которая показывает распределение должностей сотрудников. Листинг представлен ниже. Круговая диаграмма представлена на Рис. 4.
Листинг 4. Код обработки и визуализации данных о должностях сотрудников
def position_distribution(): with connection.cursor() as cursor: sql = "SELECT `Должность`, COUNT(*) AS `Количество` FROM `сотрудники` GROUP BY `Должность`" cursor.execute(sql) result = cursor.fetchall() df = pd.DataFrame(result, columns=['Должность', 'Количество']) connection.close() plt.pie(df['Количество'], labels=df['Должность'], autopct='%1.1f%%') plt.title('Распределение сотрудников по должностям') plt.show() return position_distribution()
Рисунок 3 - Круговая диаграмма из функции position_distribution()
Далее, построим точечную диаграмму, показывающую количество рейсов авиакомпаний, совершивших 2 и более рейсов. Листинг представлен ниже. Диаграмма, построенная в функции airline_growth_filtered_scatter() представлена на Рис. 5.
Листинг 5. Код обработки и визуализации данных о количестве рейсов по авиакомпаниям
def airline_growth_filtered_scatter(): with connection.cursor() as cursor: sql = "SELECT `Название авиакомпании`, `Количество рейса` FROM `авиакомпания` WHERE `Количество рейса` >= 2" cursor.execute(sql) result = cursor.fetchall() df = pd.DataFrame(result, columns=['Название авиакомпании', 'Количество рейса']) connection.close() plt.scatter(df['Название авиакомпании'], df['Количество рейса']) plt.xlabel('Название авиакомпании') plt.ylabel('Количество рейсов') plt.title('Количество рейсов для авиакомпаний с 2мя и более рейсами') plt.xticks(rotation=45) plt.show() return airline_growth_filtered_scatter()
Рисунок 4. Точечная диаграмма функции airline_growth_filtered_scatter ()
Приложение
Листинг программы:
import pandas as pd import pymysql.cursors import matplotlib.pyplot as plt connection = pymysql.connect(host='127.0.0.1', user='root', password='popooioi', db='аэропорт', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor)
def employees(): with connection.cursor() as cursor: sql = "SELECT * FROM сотрудники" # запрос SQL # Выполнение команды запроса (Execute Query) cursor.execute(sql) rows = cursor.fetchall() # получение всех строчек df = pd.DataFrame(rows) # получение таблицы с данными (DataFrame) # Закрытие соединения connection.close() pd.set_option('display.max_columns', 4) print(df) employees()
def value(): with connection.cursor() as cursor: sql = "SELECT `№ Рейса`, SUM(`Стоимость`) AS `Суммарная стоимость` FROM `билет` GROUP BY `№ Рейса`" cursor.execute(sql) result = cursor.fetchall() df = pd.DataFrame(result, columns=['№ Рейса', 'Суммарная стоимость']) connection.close() plt.bar(df['№ Рейса'], df['Суммарная стоимость']) plt.xlabel('Номер рейса') plt.ylabel('Суммарная стоимость') plt.title('Суммарная стоимость билетов по рейсам') plt.show() return value()
def position_distribution(): with connection.cursor() as cursor: sql = "SELECT `Должность`, COUNT(*) AS `Количество` FROM `сотрудники` GROUP BY `Должность`" cursor.execute(sql) result = cursor.fetchall() df = pd.DataFrame(result, columns=['Должность', 'Количество']) connection.close() plt.pie(df['Количество'], labels=df['Должность'], autopct='%1.1f%%') plt.title('Распределение сотрудников по должностям') plt.show() return position_distribution()
def airline_growth_filtered_scatter(): with connection.cursor() as cursor: sql = "SELECT `Название авиакомпании`, `Количество рейса` FROM `авиакомпания` WHERE `Количество рейса` >= 2" cursor.execute(sql) result = cursor.fetchall() df = pd.DataFrame(result, columns=['Название авиакомпании', 'Количество рейса']) connection.close() plt.scatter(df['Название авиакомпании'], df['Количество рейса']) plt.xlabel('Название авиакомпании') plt.ylabel('Количество рейсов') plt.title('Рост количества рейсов для авиакомпаний с 2мя и более рейсами') plt.xticks(rotation=45) plt.show() return airline_growth_filtered_scatter()
Вывод
В ходе данной лабораторной работы мы произвели связь базы данных из предыдущих работ в MySQL и Python, извлекли с помощью SQL данные из таблиц базы данных и выполнили анализ данных в БД с помощью визуализации в Python, в частности, создали три различных графика по данным из БД. Для выполнения данной работы были использованы следующие библиотеки:
pandas – для работы с датафреймами,
pymysql – для связи БД и Python программы, а также для выполнения SQL-запросов внутри Python
и matplotlib для визуализации данных и построения диаграмм.
Особых проблем на данном этапе работы не возникло.