
4сем / tp_lab8_Zhovtyak
.docxГУАП
КАФЕДРА № 41
ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
доц., канд. техн. наук |
|
|
|
А. В. Аграновский |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №8 |
РАБОТА С ДАННЫМ В ФОРМАТЕ CSV |
по курсу: ТЕХНОЛОГИИ ПРОГРАММИРОВАНИЯ |
|
РАБОТУ ВЫПОЛНИЛ
СТУДЕНТ ГР. № |
4016 |
|
|
|
Жовтяк М.О. |
|
|
|
подпись, дата |
|
инициалы, фамилия |
Санкт-Петербург 2022
Вариант 15
Постановка задачи
Файл с данными – TertiaryEducation.csv. На рисунке 1 изображена часть данных этого файла.
Рисунок 1 – Файл по номеру задания
Способ отображения стран: A – Случайный выбор – страны выбираются случайным образом с использованием датчика случайных чисел.
Дополнительное задание: В – Разбиение всего временного интервала на десятилетия. Для каждого десятилетия находится k стран, имеющих самое большое значение показателя и p стран, имеющих самое низкое значение показателя (значения k и p – параметры).
Конечная цель программы: Выполнить импорт данных из csv файла, выполнить анализ этих данных и визуализировать их.
Дополнительные требования к программе не выявлены.
Математическая модель
Программа обрабатывает данные в формате csv, визуализирует избранные данные, затем по условию задачи записывает данные из основного файла в выходные csv-файлы.
В ходе задания использовались библиотеки matplotlib, pandas, numpy. Математические формулы при создании программы не использовались.
Описание разработанной программы
Первым делом, программа читает файл и преобразует данные из неё в DataFrame. После этого строится график уже со случайно выбранными странами и возраста оценивания (subject) с помощью вызова функции task_2. После этого вводятся переменные k и p, которые передаются в функцию task_3, откуда выводятся два типа файлов: файлы с именем десятилетия, где k стран с максимальным показателем; файлы с именем десятилетия, где p стран с минимальным показателем.
Таблица 1 демонстрирует список используемых переменных.
Таблица 1 - Описание переменных
Имя переменной |
Тип переменной |
Назначение переменной |
Read_csv |
TextFileReader |
Хранение считанного файла |
Data |
Database |
Хранение считываемого файла |
Locations |
List |
Массив, хранящий уникальные страны |
Number |
Int |
Случайное число стран |
Final_country |
List |
Страны, выводимые на график |
Subjects |
List |
Массив, хранящий уникальные диапазоны возрастов |
Final_subject |
Str |
Диапазон возраста для графика |
Min_count |
Int |
Кол-во стран для отображения с минимальным показателем |
Max_count |
Int |
Кол-во стран для отображения с максимальным показателем |
Описание алгоритма работы программы представлено в виде блок схемы на рисунке 2.
Рисунок 2 – Блок-схема алгоритма
Код программы:
import random
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# Ввод параметров k и p (по очереди)
def inputNumber():
while True:
number = input()
try:
int(number)
return int(number)
except ValueError:
print("Введенное значение не является числом")
# запись в cvs файлы
def task_3(data, k, p):
# Создание списка уникальных SUBJECTS
ages = data.SUBJECT.unique()
# Цикл по уникальным SUBJECTS
for age in ages:
temp_df = data[data["SUBJECT"] == age]
years = temp_df.TIME.unique()
years.sort()
# Создание списка десятилетий
decade = []
for i in range(len(years)):
decade.append((years[i] // 10) * 10)
decade = np.unique(decade)
for i in range(len(decade)):
# Определение начала и конца десятилетия
first_in_decade = decade[i]
last_in_decade = first_in_decade + 10
# Датафрейм по десятилетию
data = temp_df[(temp_df["TIME"] >= first_in_decade) &
(temp_df["TIME"] < last_in_decade)]
# Датафрейм по минимальным значениям
min_value = data.sort_values(by="Value", ascending=True)
min_value = min_value.iloc[0: p]
name_min = "Decade_" + str(first_in_decade) + "-" + str(last_in_decade) + "_values_min.csv"
min_value.to_csv(name_min)
# Датафрейм по максимальным значениям
max_value = data.sort_values(by="Value", ascending=False)
max_value = max_value.iloc[0: k]
name_max = "Decade_" + str(first_in_decade) + "-" + str(last_in_decade) + "_values_max.csv"
max_value.to_csv(name_max)
# построение графика
def task_2(data, subject, locations):
plot = pd.pivot_table(data[data["SUBJECT"] == subject], index="TIME", columns="LOCATION", values="Value",
aggfunc=sum)
axes = plot[locations].plot()
axes.set_ylabel("Показатель")
axes.set_title("График показателя уровня образования в пределах возраста " + subject)
plt.show()
# основная функция
def LAB_8_VAR_15(path):
# Чтение csv файла и преобразование данных
read_csv = pd.read_csv(path, sep=",", comment="#")
data = pd.DataFrame(read_csv)
del data["INDICATOR"]
del data['Flag Codes']
data['TIME'] = pd.to_numeric(data['TIME'])
# Построение графика с уникальными странами и уникальным subject
locations = data.LOCATION.unique()
number = np.random.randint(2, 6)
final_country = []
for i in range(number):
final_country.append(locations[np.random.randint(0, len(locations) - 1)])
subjects = data.SUBJECT.unique()
final_subject = random.choice(subjects)
final_country = np.unique(final_country)
task_2(data, final_subject, final_country)
# Ввод кол-ва стран для отображения
print("Введите кол-во стран для отображения стран с минимальным показателем: ")
min_count = inputNumber()
print("Введите кол-во стран для отображения стран с максимальным показателем: ")
max_count = inputNumber()
task_3(data, max_count, min_count)
LAB_8_VAR_15("TertiaryEducation.csv")
Примеры работы программы
Выводимый график после выполнения работы программы представлен на рисунке 3.
Рисунок 3 – Выводимый график
Ввод данных: переменных k и p, - представлен на рисунке 4.
Рисунок 4 – Ввод данных
В результате работы программы были сформированы следующие файлы с отображением десятилетия и параметром максимального или минимального значения. Это можно увидеть на рисунке 5.
Рисунок 5 – Файлы, созданные main.py
Например, на рисунке 6 можно увидеть список стран с максимальным показателем в 1980-1990 года, а на рисунке 7 можно увидеть список стран с минимальным показателем в 1990-2000 года.
Рисунок 6 – Файл “Decade_1980-1990_values_max”
Рисунок 7 – Файл “Decade_1990-2000_values_min”
Выводы:
В процессе выполнения данной лабораторной работы были изучены и выполнены следующие этапы:
1) Постановка задачи. Разделил программы на чёткие этапы для более удобного просмотра кода и работы кода с помощью простых действий. Ввёл ограничения на ввод данных и рассчитал возможные завершения программы.
2) Математическая модель. Написал код с помощью математических действий, разделив задачу на простые математические действия в цикле.
3) Описание разработанной программы. По коду программы построил блочную модель программы. Выбрал наиболее подходящий способ написания кода с помощью массивов. Изучил библиотеки для построения графиков matplotlib, pandas и numpy.
Благодаря данной работе закрепил свои навыки программирования, построения алгоритма решения задачи, разбив ее на несколько этапов, укрепил навыки работы с условными конструкциями.