
6сем / lab1_database
.docxГУАП
КАФЕДРА № 41
ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
доц., канд. техн. наук |
|
|
|
Е.Л.Турнецкая |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №1 |
Связь СУБД MySQL и Python. Визуализация данных в Python. |
по курсу: БАЗЫ ДАННЫХ |
|
РАБОТУ ВЫПОЛНИЛ
СТУДЕНТ ГР. № |
4016 |
|
|
|
М.О. Жовтяк |
|
|
|
подпись, дата |
|
инициалы, фамилия |
Санкт-Петербург 2023
Цель работы
Произвести связь базы данных в MySQL и Python, извлечь данные из таблиц базы данных и выполнить анализ данных в БД с помощью визуализации в Python.
Вариант работы
Вариант 14.
Библиотека в Хоббитонии есть библиотека «Башня Саурумана». Вы являетесь ее руководителем. Библиотека зарабатывает деньги, выдавая напрокат некоторые книги, имеющиеся в небольшом количестве экземпляров. Одной из задач разрабатываемой ИС является отслеживание финансовых показателей работы библиотеки. У каждой книги, выдаваемой в прокат, есть название, автор, жанр. В зависимости от ценности книги Вы определили для каждой из них залоговую стоимость (сумма, вносимая клиентом при взятии книги напрокат) и стоимость проката (сумма, которую клиент платит при возврате книги, получая назад залог). В библиотеку обращаются читатели. Все читатели регистрируются в картотеке, указывая свои персональные данные. Каждый читатель может обращаться в библиотеку несколько раз. Все обращения читателей фиксируются, при этом по каждому факту выдачи книги запоминаются дата выдачи и ожидаемая дата возврата. Стоимость проката книги должна зависеть не только от самой книги, но и от срока ее проката. Кроме того, необходимо добавить систему штрафов за вред, нанесенный книге и систему скидок для некоторых категорий читателей. Произведения авторов, составляющие библиотечный фонд, также можно разделить на различные категории, характеризующиеся собственным набором атрибутов: учебники, повести, романы, статьи, стихи, диссертации, рефераты, тезисы докладов и т.д. Сотрудники библиотеки, работающие в различных залах различных библиотек, ведут учет читателей, а также учет размещения и выдачи литературы.
На рисунке 1 представлена схема данных БД согласно индивидуальному варианту.
Рисунок 1 – Схема данных БД
Ход работы
Создается запрос с построением графика о выручке от каждой книги. Запрос выглядит так:
SELECT books.title_book as 'Название книги',
appeals.total as 'Выручка'
FROM appeals, books
WHERE appeals.id_book = books.id_book
GROUP BY title_book;
Построенный график представлен на рисунке 2.
Рисунок 2 – График с выручкой каждой книги
По графику можно сделать вывод, что «Война и мир» принесла больше всего денег.
Создается запрос с построением графика о количестве выручке за определенную дату. Запрос выглядит так:
SELECT issue_date as 'Дата',
total as 'Выручка'
FROM appeals
GROUP BY issue_date;
Построенный график представлен на рисунке 3.
Рисунок 3 – График выручки по датам
По графику можно сказать, что максимальная выручка была 18 октября, а минимальная – 17-ого.
Создается запрос с построением графика о выручке по читателям в процентах. Запрос выглядит так:
SELECT books.title_book as 'Название книги',
appeals.total as 'Выручка'
FROM appeals, books
WHERE appeals.id_book = books.id_book
GROUP BY title_book;
Построенный график представлен на рисунке 4.
Рисунок 4 – Диаграмма выручки по клиентам
По графику можно сказать, что Иванова Лада Глебовна не жалеет денег на чтение.
Вывод
В ходе лабораторной работы я произвел связь базы данных в MySQL и Python, извлёк данные из таблиц базы данных и выполнил анализ данных в БД с помощью визуализации в Python, создав 3 запроса к соединенной базе данных.
Приложение А
import pandas as pd
import pymysql.cursors
import matplotlib.pyplot as plt
def db_return(connection, sql):
with connection.cursor() as cursor:
cursor.execute(sql)
rows = cursor.fetchall()
df = pd.DataFrame(rows)
connection.close()
return df
connection = pymysql.connect(host='127.0.0.1',
user='root',
password='hellokitty',
db='my_library',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
# Запрос 1
sql1 = "SELECT books.title_book as 'Название книги',\
appeals.total as 'Выручка' \
FROM appeals, books \
WHERE appeals.id_book = books.id_book \
GROUP BY title_book;"
df = db_return(connection, sql1)
plt.figure()
plt.tick_params(axis='x', rotation=90)
plt.bar(df['Название книги'], df['Выручка'])
plt.xlabel('Название книг')
plt.ylabel('Выручка в рублях')
plt.title('Выручка каждой книги')
plt.show()
connection.ping()
# Запрос 2
sql2 = "SELECT issue_date as 'Дата', \
total as 'Выручка' \
FROM appeals \
GROUP BY issue_date;"
plt.figure()
plt.tick_params(axis='x', rotation=45)
df = db_return(connection, sql2)
plt.bar(df['Дата'], df['Выручка'])
plt.xlabel('Даты')
plt.ylabel('Выручка в рублях')
plt.title('Выручка по датам')
plt.show()
connection.ping()
# Запрос 3
sql3 = "SELECT readers.reader_FIO as 'Имя человека', \
appeals.total as 'Выручка' \
FROM appeals, readers \
WHERE readers.id_reader = appeals.id_reader \
GROUP BY readers.reader_FIO;"
df = db_return(connection, sql3)
plt.figure()
plt.pie(df['Выручка'], labels=df['Имя человека'], autopct='%1.2f%%')
plt.title('Выручка по клиентам в %')
plt.show()