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

6сем / lab8_database

.docx
Скачиваний:
2
Добавлен:
27.08.2024
Размер:
366.31 Кб
Скачать

ГУАП

КАФЕДРА № 41

ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ

ПРЕПОДАВАТЕЛЬ

доц., канд. техн. наук

Е.Л.Турнецкая

должность, уч. степень, звание

подпись, дата

инициалы, фамилия

ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №8

ВИЗУАЛИЗАЦИЯ ДАННЫХ ИЗ СУБД POSTGRESQL В PYTHON

по курсу: БАЗЫ ДАННЫХ

РАБОТУ ВЫПОЛНИЛ

СТУДЕНТ ГР. №

4016

М.О. Жовтяк

подпись, дата

инициалы, фамилия

Санкт-Петербург 2023

  1. Цель работы

Произвести связь базы данных в PostgreSQL и Python, изучить операции по манипулированию с данными БД, выполнить анализ данных в БД с помощью визуализации в Python.

  1. Ход работы

В ходе работы будет вестись работа с базой данных администрации некой компании со списком работ, департаментов и работников, созданной в ходе предыдущей лабораторной работы.

Вариант задания для работы с запросами представлен на рисунках 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.

  1. Вывод

В ходе лабораторной работы я улучшил знания 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()

Соседние файлы в папке 6сем