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

ГУАП

КАФЕДРА № 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, реализован запрос на выборку всех данных из таблицы и созданы три запроса с агрегатными функциями, произведен анализ данных с помощью визуализации.

Список используемых источников:

  1. Руководство по MySQL: https://metanit.com/sql/mysql.

  2. Matplotlib: визуализация с помощью Python: https://matplotlib.org/

Соседние файлы в папке БД 3 курс весна