logo
3курс 1 сем / TP_Ianysheva_lr_8

3 Описание разработанной программы

Список входных данных представлен в таблице 1.

Таблица 1 - Список входных данных

Название переменной

Тип

Описание

Iput_file

CSV

CSV-файл с данными подлежащими обработке

p

Int

Число стран, с самым большим значением

k

Int

Число стран с самым низким значением

Список выходных данных представлен в таблице 2.

Таблица 2 - Список выходных данных

Название переменной

Тип

Описание

Output_file

CSV

CSV-файл с результатами обработки входного файла

Output_image

PNG

PNG-изображение с визуализацией данных Output_file

Листинг программного кода:

import random

import matplotlib.pyplot as plt

import csv

#Чтение csv-файла

def csv_reader(name):

with open(name, "r") as csv_file:

reader = csv.reader(csv_file)

lines = []

for row in reader:

lines.append(row)

lines[0][0] = lines[0][0][3:]

return lines

#Запись в csv-файл

def csv_writer(lines, name):

with open(name, 'w', newline='') as csv_file:

writer = csv.writer(csv_file, delimiter=',')

for line in lines:

writer.writerow(line)

#Представление строк файла в удобной форме для обработки

def change(lines):

data = {}

#Получаем структуру: {Location: {Subject: {Measure: {"Time": [Time], "Value": [Value]}}}}

for row in lines[3:]: #Перебираем игнорируя начальные строки файла

loc = row[0]

sub = row[2]

mea = row[3]

time = int(row[5])

if row[6] == "":

continue

else:

value = float(row[6])

if loc not in data:

data[loc] = {}

if sub not in data[loc]:

data[loc][sub] = {}

if mea not in data[loc][sub]:

data[loc][sub][mea] = {"Time": [], "Value": []}

data[loc][sub][mea]["Time"].append(time)

data[loc][sub][mea]["Value"].append(value)

return data

#Представление данных в виде, удобном для записи в файл

def unchange(data):

lines = ["LOCATION,SUBJECT,MEASURE,TIME,Value".split(',')]

for loc in data:

for sub in data[loc]:

for mea in data[loc][sub]:

for i in range(0, len(data[loc][sub][mea]["Time"])):

lines.append([loc, sub, mea, str(data[loc][sub][mea]["Time"][i]), str(data[loc][sub][mea]["Value"][i])])

return lines

#Показ данных

def show(data, name = ""):

if name == "":

#Получение списка случайных стран

countries = []

while countries == []:

for i in data:

if random.randint(1, len(data)) in [1, 2]:

countries.append(i)

else:

countries = data

#Анализ количества и типов требуемых графиков

plots = {} #Структура {Subject: {Measure: int}}

colums = 0

for loc in data:

if loc not in countries:

continue

for sub in data[loc]:

if sub not in plots:

plots[sub] = {}

for mea in data[loc][sub]:

plots[sub][mea] = 0

if colums < len(plots[sub]):

colums = len(plots[sub])

#Инициализация графиков

plt.figure(figsize=(12,6))

i = 0

for s in plots:

j = 0

for m in plots[s]:

j += 1

plots[s][m] = i * colums + j

plt.subplot(len(plots), colums, plots[s][m])

plt.title(s)

plt.xlabel('year')

plt.ylabel(m)

plt.legend(loc='best')

plt.grid

i += 1

#Отображение данных

for loc in data:

if loc not in countries:

continue

for sub in data[loc]:

for mea in data[loc][sub]:

plt.subplot(len(plots), colums, plots[sub][mea])

if len(data[loc][sub][mea]["Time"]) == 1:

plt.scatter(data[loc][sub][mea]["Time"], data[loc][sub][mea]["Value"], label = loc)

else:

plt.plot(data[loc][sub][mea]["Time"], data[loc][sub][mea]["Value"], label = loc)

plt.legend()

if name != "":

plt.savefig(name)

plt.show()

def processing(stat, k, p):

data = {} #Структура {Location: {Subject: {Measure: {Decade: {"MaxValue": MaxValue, "MinValue": MinValue}}}}}

#Сбор данных о максимальном и минимальном значении для каждой страны/показателя/единицы измерения/декады

for loc in stat:

data[loc] = {}

for sub in stat[loc]:

data[loc][sub] = {}

for mea in stat[loc][sub]:

data[loc][sub][mea] = {stat[loc][sub][mea]["Time"][0]//10: {"MaxValue": stat[loc][sub][mea]["Value"][0], "MinValue": stat[loc][sub][mea]["Value"][0]}}

for i in range(0, len(stat[loc][sub][mea]["Time"])):

temp_d = stat[loc][sub][mea]["Time"][i] // 10

if temp_d not in data[loc][sub][mea]:

data[loc][sub][mea][temp_d] = {"MinValue": stat[loc][sub][mea]["Value"][i], "MaxValue": stat[loc][sub][mea]["Value"][i]}

else:

if data[loc][sub][mea][temp_d]["MaxValue"] < stat[loc][sub][mea]["Value"][i]:

data[loc][sub][mea][temp_d]["MaxValue"] = stat[loc][sub][mea]["Value"][i]

if data[loc][sub][mea][temp_d]["MinValue"] > stat[loc][sub][mea]["Value"][i]:

data[loc][sub][mea][temp_d]["MinValue"] = stat[loc][sub][mea]["Value"][i]

#Отбор значений по условию задачи для декад

decades = {} #Структура {Subject: {Measure: {Decade: {"Max": {"Location": [Loc], "MaxValue": [Value]}, "Min": {"Location": [Loc], "MinValue": [Min]}}}}}

for loc in data:

for sub in data[loc]:

if sub not in decades:

decades[sub] = {}

for mea in data[loc][sub]:

if mea not in decades[sub]:

decades[sub][mea] = {}

for dec in data[loc][sub][mea]:

if dec not in decades[sub][mea]:

decades[sub][mea][dec] = {"Max": {"Location": [], "MaxValue": []}, "Min": {"Location": [], "MinValue": []}}

if k > 0:

decades[sub][mea][dec]["Max"] = {"Location": [loc], "MaxValue": [data[loc][sub][mea][dec]["MaxValue"]]}

if p > 0:

decades[sub][mea][dec]["Min"] = {"Location": [loc], "MinValue": [data[loc][sub][mea][dec]["MinValue"]]}

else:

if len(decades[sub][mea][dec]["Max"]["Location"]) < k:

decades[sub][mea][dec]["Max"]["Location"].append(loc)

decades[sub][mea][dec]["Max"]["MaxValue"].append(data[loc][sub][mea][dec]["MaxValue"])

elif k > 0:

temp_i = decades[sub][mea][dec]["Max"]["MaxValue"].index(min(decades[sub][mea][dec]["Max"]["MaxValue"]))

decades[sub][mea][dec]["Max"]["Location"][temp_i] = loc

decades[sub][mea][dec]["Max"]["MaxValue"][temp_i] = data[loc][sub][mea][dec]["MaxValue"]

if len(decades[sub][mea][dec]["Min"]["Location"]) < p:

decades[sub][mea][dec]["Min"]["Location"].append(loc)

decades[sub][mea][dec]["Min"]["MinValue"].append(data[loc][sub][mea][dec]["MinValue"])

elif p > 0:

temp_i = decades[sub][mea][dec]["Min"]["MinValue"].index(max(decades[sub][mea][dec]["Min"]["MinValue"]))

decades[sub][mea][dec]["Min"]["Location"][temp_i] = loc

decades[sub][mea][dec]["Min"]["MinValue"][temp_i] = data[loc][sub][mea][dec]["MinValue"]

#Приведение значений к виду, пригодному для отображения

res = {} #Структура: {Location: {Subject: {Measure: {"Time": [Time], "Value": [Value]}}}}

for sub in decades:

for mea in decades[sub]:

for dec in decades[sub][mea]:

for i in range(0, len(decades[sub][mea][dec]["Max"]["Location"])):

loc = decades[sub][mea][dec]["Max"]["Location"][i]

if loc not in res:

res[loc] = {}

if sub not in res[loc]:

res[loc][sub] = {}

if mea not in res[loc][sub]:

res[loc][sub][mea] = {"Time": [], "Value": []}

res[loc][sub][mea]["Time"].append(dec*10)

res[loc][sub][mea]["Value"].append(decades[sub][mea][dec]["Max"]["MaxValue"][i])

for i in range(0, len(decades[sub][mea][dec]["Min"]["Location"])):

if decades[sub][mea][dec]["Min"]["Location"][i] in decades[sub][mea][dec]["Max"]["Location"]:

continue

loc = decades[sub][mea][dec]["Min"]["Location"][i]

if loc not in res:

res[loc] = {}

if sub not in res[loc]:

res[loc][sub] = {}

if mea not in res[loc][sub]:

res[loc][sub][mea] = {"Time": [], "Value": []}

res[loc][sub][mea]["Time"].append(dec*10)

res[loc][sub][mea]["Value"].append(decades[sub][mea][dec]["Min"]["MinValue"][i])

#Сохранение таблицы данных

csv_writer(unchange(res), 'Result.csv')

#Отображение результата с сохранением

show(res, name='Result.png')

#Старт

File = csv_reader("WorkingAgePopulation.csv")

Data = change(File)

show(Data)

processing(Data, 1, 2)