
БД 3 курс весна / BD7
.docxГУАП
КАФЕДРА № 41
ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
старший преподаватель |
|
|
|
Б.К. Акопян |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №7 |
ВИЗУАЛИЗАЦИЯ ДАННЫХ ИЗ СУБД POSTGRESQL В PYTHON |
по курсу: БАЗЫ ДАННЫХ |
|
РАБОТУ ВЫПОЛНИЛ
СТУДЕНТ ГР. № |
4116 |
|
|
|
|
|
|
|
|
|
подпись, дата |
|
инициалы, фамилия |
Санкт-Петербург 2024
Цель работы:
Произвести связь базы данных в PostgreSQL и Python, изучить операции по манипулированию с данными БД, выполнить анализ данных в БД с помощью визуализации в Python.
Вариант 21 (1)
Ход работы:
Вариант задания представлен на рисунках 1-2.
Рисунок 1- Вариант задания
Рисунок 2 – Дополнительные задания
Рисунок 3- Модель данных
Реализован запрос, который подсчитывает количество сотрудников у каждого менеджера, создана столбчатая диаграмма (Рисунок 4).
Листинг 1. Запрос на подсчет количества сотрудников у каждого менеджера и построение столбчатой диаграммы
cursor.execute("""
SELECT m.last_name || ' ' || m.first_name AS manager_name, COUNT(e.employee_id) AS employee_count
FROM employees e
JOIN employees m ON e.manager_id = m.employee_id
GROUP BY manager_name
ORDER BY employee_count DESC;
""")
data = cursor.fetchall()
df = pd.DataFrame(data, columns=['manager_name', 'employee_count'])
cursor.close()
connection.close()
plt.figure(figsize=(10, 8))
plt.bar(df['manager_name'], df['employee_count'],color='pink')
plt.ylabel('Количество сотрудников')
plt.xlabel('Менеджер')
plt.title('Количество сотрудников у каждого менеджера')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
Рисунок 4 – Количество сотрудников у каждого менеджера
У менеджера Steven King больше всех сотрудников.
Написан запрос, вычисляющий среднюю зарплату сотрудника на определенной должности, результат визуализируется в виде столбчатой диаграммы (Рисунок 5).
Листинг 2. Запрос, вычисляющий среднюю зарплату сотрудника на определенной должности и построение столбчатой диаграммы
cursor.execute("""
SELECT j.job_title, AVG(e.salary) AS average_salary
FROM employees e
JOIN jobs j ON e.job_id = j.job_id
GROUP BY j.job_title
ORDER BY AVG(e.salary);
""")
results = cursor.fetchall()
df = pd.DataFrame(results, columns=['Job Title', 'Average Salary'])
cursor.close()
connection.close()
plt.figure(figsize=(10, 8))
plt.bar(df['Job Title'], df['Average Salary'], color='skyblue')
plt.ylabel('Средняя зарплата')
plt.xlabel('Должность')
plt.title('Средняя зарплата по должностям')
plt.xticks(rotation=80)
plt.tight_layout()
plt.show()
Рисунок 5 – Средняя зарплата по должностям
Самая низкая средняя зарплата у должности Purchasing Clerk, самая высокая у должности President.
В первый запрос добавлено условие, выводятся не все менеджеры, а только те, у которых больше трех сотрудников (Рисунок 6). Написана функция, managers, которая принимает на вход ограничение на количество сотрудников и на основе этого ограничения строит график. Для создания горизонтальной столбчатой диаграммы используется barh().
Листинг 3. Запрос на вывод менеджеров, у которых больше трех сотрудников
def managers(k):
connection = psycopg2.connect(
database="students",
user="postgres",
password="12345",
host="127.0.0.1",
port="5432"
)
cursor = connection.cursor()
cursor.execute(f"""
SELECT m.last_name || ' ' || m.first_name AS manager_name, COUNT(e.employee_id) AS employee_count
FROM employees e
JOIN employees m ON e.manager_id = m.employee_id
GROUP BY manager_name
HAVING COUNT(e.employee_id) > {k}
ORDER BY employee_count DESC;
"""
)
data = cursor.fetchall()
df = pd.DataFrame(data, columns=['manager_name', 'employee_count'])
cursor.close()
connection.close()
plt.figure(figsize=(10, 8))
plt.barh(df['manager_name'], df['employee_count'], color='green')
plt.xlabel('Количество сотрудников')
plt.ylabel('Менеджер')
plt.title(f'Количество сотрудников у каждого менеджера (более {k} сотрудников)')
plt.tight_layout()
plt.show()
managers(3)
Рисунок 6 – Менеджеры, у которых больше трех сотрудников
Во второй запрос добавлена возможность задавать диапазон зарплаты для вывода средней зарплаты для должностей. Также написана функции для построения графика для любого заданного числа. (Рисунок 7).
Листинг 4. Запрос на подсчет средней зарплаты по должностям, в диапазоне от 5000 до 15000
cursor.execute(f"""
SELECT j.job_title, AVG(e.salary) AS average_salary
FROM employees e
JOIN jobs j ON e.job_id = j.job_id
WHERE e.salary BETWEEN {min_salary} AND {max_salary}
GROUP BY j.job_title
ORDER BY AVG(e.salary);
""")
results = cursor.fetchall()
df = pd.DataFrame(results, columns=['Job Title', 'Average Salary'])
cursor.close()
connection.close()
plt.figure(figsize=(10, 8))
plt.barh(df['Job Title'], df['Average Salary'], color='indigo')
plt.xlabel('Средняя зарплата')
plt.ylabel('Должность')
plt.title(f'Средняя зарплата по должностям (от {min_salary} до {max_salary})')
plt.tight_layout()
plt.show()
av_salary(5000, 15000)
Рисунок 7 – Средняя зарплата по должностям в диапазоне от 1000 до 15000
Построена круговая диаграмма, которая отображает количество сотрудников по городам (Рисунок 8).
Листинг 5. Запрос на количество сотрудников по городам и построение круговой диаграммы
cursor.execute("""
SELECT l.city, COUNT(e.employee_id) AS number_of_employees
FROM employees e
JOIN locations l ON e.location_id = l.location_id
GROUP BY l.city;
""")
results = cursor.fetchall()
df = pd.DataFrame(results, columns=['City', 'Number of Employees'])
df['City with Employees'] = df['City'] + ' (' + df['Number of Employees'].astype(str) + ')'
cursor.close()
connection.close()
plt.figure(figsize=(10, 8))
plt.pie(df['Number of Employees'], labels=df['City with Employees'], autopct='%1.1f%%')
plt.title('Количество сотрудников по городам')
plt.show()
Рисунок 8 – Количество сотрудников по городам
Больше всего сотрудников в городах: Whitehorse, Southlake, Seattle.
Вывод:
В ходе выполнения лабораторной работы получен новый опыт использования Python и PostgreSQL. С помощью библиотеки matplotlib выполнена визуализация результатов запросов.
Список используемых источников:
1. A.В. Аграновский, В.В. Боженко, Е.Л. Турнецкая. - Учебно-методическое пособие «Разработка и администрирование базы данных с открытым исходным кодом» ‒ СПб.: ГУАП, 2022
3. Документация Python, URL: https://docs.python.org/3/