
6сем / lab8_database
.docxГУАП
КАФЕДРА № 41
ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
доц., канд. техн. наук |
|
|
|
Е.Л.Турнецкая |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №8 |
ВИЗУАЛИЗАЦИЯ ДАННЫХ ИЗ СУБД POSTGRESQL В PYTHON |
по курсу: БАЗЫ ДАННЫХ |
|
РАБОТУ ВЫПОЛНИЛ
СТУДЕНТ ГР. № |
4016 |
|
|
|
М.О. Жовтяк |
|
|
|
подпись, дата |
|
инициалы, фамилия |
Санкт-Петербург 2023
Цель работы
Произвести связь базы данных в PostgreSQL и Python, изучить операции по манипулированию с данными БД, выполнить анализ данных в БД с помощью визуализации в Python.
Ход работы
В ходе работы будет вестись работа с базой данных администрации некой компании со списком работ, департаментов и работников, созданной в ходе предыдущей лабораторной работы.
Вариант задания для работы с запросами представлен на рисунках 1-2, схема данных БД на рисунке 3
Рисунок 1 – Запросы, выданные по варианту 1
Рисунок 2 – Запросы, выданные по варианту 2
Рисунок 3 – Схема данных БД
Создаётся запрос на выдачу средней зарплаты сотрудников в зависимости от отдела. Выданная информация визуализируется, что можно увидеть на рисунке 4. Листинг запроса и визуализации представлен в Приложении.
Рисунок 4 – Средняя зарплата сотрудников в зависимости от отдела
По графику видно, что самая высокая зарплата в отделе Executive, а самая низкая в отделе Shipping.
Создаётся запрос на выдачу максимальной зарплаты сотрудников в зависимости от должности. Выданная информация визуализируется, что можно увидеть на рисунке 5. Листинг запроса и визуализации представлен в Приложении.
Рисунок 5 – Максимальная зарплата в зависимости от должности
По графику видно, что самая максимальная зарплата у President, а самая низкая у Purchasing Clerk.
Первая гистограмма модифицируется: меняются местами x и y, изменяется цвет. Результат визуализации на рисунке 6, листинг в Приложении.
Рисунок 6 – Модифицированный график 1
Вторая гистограмма модифицируется: меняются местами x и y, изменяется цвет. Результат визуализации на рисунке 7, листинг в Приложении.
Рисунок 7 – Модифицированный график 2
Создаётся запрос на выдачу средней зарплаты сотрудников в зависимости от отдела, но только у тех сотрудников, чья зарплата в диапазоне от 5000 до 1000. Выданная информация визуализируется, что можно увидеть на рисунке 8. Листинг запроса и визуализации представлен в Приложении.
Рисунок 8 – Средняя зарплата сотрудников в зависимости от отдела с заданным диапазоном зарплат от 5000 до 1000
Создаётся запрос на выдачу максимальной зарплаты сотрудников в зависимости от должности, но только тех должностей, у которых максимальная зарплата находится в диапазоне от 10000 до 20000. Выданная информация визуализируется, что можно увидеть на рисунке 9. Листинг запроса и визуализации представлен в Приложении.
Рисунок 9 – Максимальная зарплата в зависимости от должности, где максимальная зарплата в диапазоне от 10000 до 20000
Создаётся запрос на выдачу количества сотрудников в разных городах. Выданная информация визуализируется, что можно увидеть на рисунке 10. Листинг запроса и визуализации представлен в Приложении.
Рисунок 10 – Количество сотрудников в разных городах
По графику видно, что меньше всего сотрудников в South Brunswick.
Создаётся функция salary_filter, которая выводит фамилию сотрудника и его зарплату. При этом выводятся только те фамилии, зарплата которой выше определенного значения, которая задаётся через параметр функции. Выданная информация визуализируется, что можно увидеть на рисунке 11. Листинг запроса и визуализации представлен в Приложении.
Рисунок 11 – Зарплата сотрудников, у которых она выше 12000
По графику видно, что самая высокая зарплата у King.
Вывод
В ходе лабораторной работы я улучшил знания PostgreSQL, произвел связь базы данных в PostgreSQL и Python, выполнил визуализацию созданных запросов в Python с помощью библиотек pandas и matplotlib.
В ходе работы проблем не возникло.
ПРИЛОЖЕНИЕ
import pandas as pd
import psycopg2
import matplotlib.pyplot as plt
connection = psycopg2.connect(database="students",
user="postgres",
password="admin",
host="127.0.0.1",
port="5432")
cursor = connection.cursor() # курсор для выполнения операций с БД
# Запрос 1
connection.commit()
df1 = pd.read_sql_query('''
select departments.department_name, round(AVG(salary))
as average_salary
from public.employees, public.departments
where employees.department_id = departments.department_id
group by departments.department_name ;''', connection)
x = df1['department_name']
y = df1['average_salary']
plt.figure()
plt.tick_params(axis='x', rotation=90)
plt.bar(x, y)
plt.xlabel('Название отдела')
plt.ylabel('Средняя зарплата')
plt.title('Средняя зарплата в зависимости от отдела')
plt.tight_layout()
plt.show()
# Запрос 1 (2)
plt.figure()
plt.tick_params(axis='x', rotation=90)
plt.barh(x, y, color='red')
plt.ylabel('Название отдела')
plt.xlabel('Средняя зарплата')
plt.title('Средняя зарплата в зависимости от отдела')
plt.tight_layout()
plt.show()
# Запрос 1 (3)
connection.commit()
df1 = pd.read_sql_query('''
select departments.department_name, round(AVG(salary))
as average_salary
from public.employees, public.departments
where employees.department_id = departments.department_id
and salary between 5000 and 10000
group by departments.department_name ;''', connection)
x = df1['department_name']
y = df1['average_salary']
plt.figure()
plt.tick_params(axis='x', rotation=90)
plt.bar(x, y)
plt.xlabel('Название отдела')
plt.ylabel('Средняя зарплата')
plt.title('Средняя зарплата в зависимости от отдела')
plt.tight_layout()
plt.show()
# Запрос 2
connection.commit()
df1 = pd.read_sql_query('''
select jobs.job_title , max(salary)
as max_salary
from public.employees, public.jobs
where employees.job_id = jobs.job_id
group by jobs.job_title;''', connection)
x = df1['job_title']
y = df1['max_salary']
plt.figure()
plt.tick_params(axis='x', rotation=90)
plt.bar(x, y)
plt.xlabel('Название должности')
plt.ylabel('Максимальная зарплата')
plt.title('Максимальная зарплата в зависимости от должности')
plt.tight_layout()
plt.show()
# Запрос 2 (2)
plt.figure()
plt.tick_params(axis='x', rotation=90)
plt.barh(x, y, color='green')
plt.ylabel('Название должности')
plt.xlabel('Максимальная зарплата')
plt.title('Максимальная зарплата в зависимости от должности')
plt.tight_layout()
plt.show()
# Запрос 2 (3)
connection.commit()
df1 = pd.read_sql_query('''
select jobs.job_title , max(salary)
as max_salary
from public.employees, public.jobs
where employees.job_id = jobs.job_id
and max_salary between 10000 and 20000
group by jobs.job_title;''', connection)
x = df1['job_title']
y = df1['max_salary']
plt.figure()
plt.tick_params(axis='x', rotation=90)
plt.bar(x, y)
plt.xlabel('Название должности')
plt.ylabel('Максимальная зарплата')
plt.title('Максимальная зарплата в зависимости от должности')
plt.tight_layout()
plt.show()
# Запрос 3
connection.commit()
df1 = pd.read_sql_query('''
select locations.city as gorod ,
count(employees.location_id) as kol
from public.employees, public.locations
where locations.location_id = employees.location_id
group by locations.location_id''', connection)
x = df1['gorod']
y = df1['kol']
plt.figure()
plt.tick_params(axis='x', rotation=90)
plt.bar(x, y)
plt.xlabel('Город')
plt.ylabel('Количество сотрудников')
plt.title('Количество сотрудников в городах')
plt.tight_layout()
plt.show()
# Запрос 4
connection.commit()
postgresql_func = """
CREATE OR REPLACE FUNCTION public.salary_filter(summa int)
RETURNS table(last_name varchar, salary int) as $$
select last_name, salary
from public.employees
where salary > summa
$$ LANGUAGE SQL;
"""
cursor.execute(postgresql_func)
cursor.callproc('public.salary_filter', [12000, ])
result = cursor.fetchall()
result_proc = pd.DataFrame(result)
x = result_proc[0]
y = result_proc[1]
plt.figure()
plt.tick_params(axis='x', rotation=90)
plt.bar(x, y)
plt.xlabel('Фамилия сотрудника')
plt.ylabel('Зарплата')
plt.title('Зарплаты сотрудников')
plt.tight_layout()
plt.show()