
БД 3 курс весна / БД_1
.docxГУАП
КАФЕДРА № 41
ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
Старший преподаватель |
|
|
|
Б.К.Акопян |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №1 |
СВЯЗЬ СУБД MYSQL и Python. Визуализация данных в Python. |
по курсу: БАЗЫ ДАННЫХ |
|
РАБОТУ ВЫПОЛНИЛ
СТУДЕНТ гр. № |
4116 |
|
|
|
|
|
|
|
подпись, дата |
|
инициалы, фамилия |
Санкт-Петербург 2024
Цель работы: произвести связь базы данных в MySQL и Python, извлечь данные из таблиц базы данных и выполнить анализ данных в БД с помощью визуализации в Python.
Вариант 21.
Организация спортивного мероприятия
В Гуапландии любят спорт. Спортивная инфраструктура страны представлена спортивными сооружениями различного типа: спортивные залы, манежи, стадионы, корты и т.д. Каждая из категорий спортивных сооружений обладает атрибутами, специфичными только для нее: стадион характеризуется вместимостью, корт – типом покрытия. Гуапчане-спортсмены под руководством тренеров занимаются отдельными видами спорта, при этом один и тот же спортсмен может заниматься несколькими видами спорта, и в рамках одного и того же вида спорта может тренироваться у нескольких тренеров. Все спортсмены объединяются в спортивные клубы, при этом каждый из них может выступать только за один клуб. Организаторы соревнований проводят состязания по отдельным видам спорта на спортивных сооружениях города. По результатам участия спортсменов в соревнованиях производится награждение.
Ход работы:
Модель данных открыта в формате .mwb (рисунок 1)
Рисунок 1- модель данных
Установлена связь Python и БД в MySQL (Рисунок 2).
Листинг. Подключения Python и БД в MySQL
import pandas as pd
import pymysql.cursors
import matplotlib.pyplot as pl
connection = pymysql.connect(host='127.0.0.1',
user='root',
password='1234567',
db='sport',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
Рисунок 2- Результат успешного подключения
Выполнен один запрос на выборку всех данных из таблицы «вид_спорта» (Рисунок 3).
Листинг. Запрос на выборку всех данных из таблицы «вид_спорта» (
with connection.cursor() as cursor:
sql = "SELECT * FROM вид_спорта"
cursor.execute(sql)
rows = cursor.fetchall()
df = pd.DataFrame(rows)
connection.close()
print(df)
Рисунок 3- Результат выполнения запроса на выборку
Далее реализованы три запроса в скрипте Python с использованием агрегатных функций. Первый запрос объединяет таблицы «соревнования» и «вид_спорта», чтобы получить названия видов спорта вместо их кодов. Затем он подсчитает количество соревнований по каждому виду спорта с учетом названий и строит гистограмму на основе этих данных (Рисунок 5).
Рисунок 3- Таблица «вид_спорта»
Рисунок 4- Таблица «соревнования»
Листинг. Запрос на получение количества соревнований по каждому виду спорта
with connection.cursor() as cursor:
sql = """
SELECT вид_спорта.название, COUNT(*) AS количество_соревнований
FROM соревнования
INNER JOIN вид_спорта ON соревнования.код_вида = вид_спорта.код_вида_спорта
GROUP BY соревнования.код_вида;
"""
cursor.execute(sql)
result = cursor.fetchall()
df = pd.DataFrame(result)
plt.figure(figsize=(13, 7))
plt.barh(df['название'], df['количество_соревнований'])
plt.xlabel('Количество соревнований')
plt.ylabel('Вид спорта')
plt.title('Количество соревнований по каждому виду спорта')
plt.grid(True)
plt.show()
connection.close()
Рисунок 5- Гистограмма по первому запросу
Второй запрос группирует результаты по фамилии спортсмена, подсчитывая количество тренировок для каждого через функцию Count(). Результаты сортируются по фамилии спортсмена в алфавитном порядке. Построен график, где по оси X отображаются фамилии спортсменов, а по оси Y - общее количество тренировок (Рисунок 8).
Рисунок 6- Таблица «спортсмены»
Рисунок 7-Таблица «тренировки»
Листинг. Запрос на подсчет общего количества тренировок для каждого спортсмена
with connection.cursor() as cursor:
sql = """
SELECT спортсмены.фамилия, COUNT(*) AS количество_тренировок
FROM тренировки
INNER JOIN спортсмены ON тренировки.код_спортсмена = спортсмены.код_спортсмена
GROUP BY спортсмены.фамилия
ORDER BY спортсмены.фамилия;
"""
cursor.execute(sql)
result = cursor.fetchall()
df = pd.DataFrame(result)
# Построение графика
plt.figure(figsize=(10, 6))
plt.plot(df['фамилия'], df['количество_тренировок'], marker='o', color='purple')
plt.xlabel('Фамилия спортсмена')
plt.ylabel('Общее количество тренировок')
plt.title('Общее количество тренировок для каждого спортсмена')
plt.grid(True)
plt.xticks(rotation=45)
plt.show()
connection.close()
Рисунок 8- График по второму запросу
Третий запрос вычисляет для каждого клуба сумму спортсменов с использованием агрегатной функции SUM(1), что позволяет подсчитать общее количество спортсменов в каждом клубе. Результат запроса отображен на диаграмме (Рисунок 11).
Рисунок 9- Таблица «спортсмены»
Рисунок 10- Таблица «спортивные_клубы»
Листинг. Распределение спортсменов по спортивным клубам
with connection.cursor() as cursor:
sql = """
SELECT спортивные_клубы.название, SUM(1) AS количество_спортсменов
FROM спортивные_клубы
INNER JOIN спортсмены ON спортивные_клубы.код_спортивного_клуба = спортсмены.код_спортивного_клуба
GROUP BY спортивные_клубы.название;
"""
cursor.execute(sql)
result = cursor.fetchall()
df = pd.DataFrame(result)
# Построение круговой диаграммы
plt.figure(figsize=(8, 8))
plt.pie(df['количество_спортсменов'], labels=df['название'], autopct='%1.1f%%')
plt.title('Доля спортсменов в каждом спортивном клубе')
plt.show()
connection.close()
Рисунок 11- Диаграмма третьего запроса
Вывод: произведена связь базы данных в MySQL и Python, реализован запрос на выборку всех данных из таблицы и созданы три запроса с агрегатными функциями, произведен анализ данных с помощью визуализации.
Список используемых источников:
Руководство по MySQL: https://metanit.com/sql/mysql.
Matplotlib: визуализация с помощью Python: https://matplotlib.org/