Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2 / лр1

.docx
Скачиваний:
1
Добавлен:
16.05.2025
Размер:
381.33 Кб
Скачать

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ

федеральное государственное автономное образовательное учреждение высшего образования

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»

Кафедра 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 для визуализации данных и построения диаграмм.

Особых проблем на данном этапе работы не возникло.

Соседние файлы в папке 2