Python.Нужно создать функцию,которая выводит гистограмму поступивших по определенной специальности
Задание:
В конце общего скрипта написать функцию, на вход которая принимает специальность, а она выдаёт гистограмму поступивших студентов. На каждого студентом 3 столбца (баллы по всем предметам).
Я не могу вывести эту гистограмму, потому что не могу согласовать список поступивших из общего скрипта по определенной специальности со списком поступающих в моем скрипте.
Скрипт:
import os
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from inspect import getsourcefile
from os.path import abspath
#Папка со специальностями
CSV_DATA_URL = 'C:/Users/Lenovo/Desktop/ПРАКТИКА/data/spbgu'
#CSV_DATA_URL = abspath(getsourcefile(lambda:0))
#CSV_DATA_URL = CSV_DATA_URL[:-10]
files_error = dict() #Те файлы, которые не удалось считать
places = dict() #Колличество бюджетных мест для каждой специальности ('специальность':'количество')
postupivshie = pd.DataFrame(columns = ['regnum','spec','summ','prioritet','fio'])
#------------------------- Заполняет колличество бюджетных мест -------------------------
#Заполняет колличество бюджетных мест в словарь для каждой специальности
def create_places_count(path):
places = dict() #Колличество бюджетных мест для каждой специальности ('специальность':'количество')
for i in os.listdir(path):
if(os.path.isfile(path + '\\' + i) and (i[-4:]=='.csv')):
places.update([(i[:-4], 10 + int(np.random.random()*10))])
#ostatok_mest.update([(i[:-4], places[i[:-4]])])
return places
#----------------------------------------------------------------------------------------
#-------------------------- СПИСОК ПОСТУПИВШИХ --------------------------
#выводит список поступивших, без учёта оригинала и примечания, возвращая минимальный балл
def postuplenie(path, places):
postupivshie = pd.DataFrame(columns = ['regnum','spec','summ','prioritet','fio'])
ostatok_mest = dict()
for i in places:
ostatok_mest.update([(i, places[i])])
def prioritet_cicle(prioritet):
#------------------------ Основная функция ------------------------
def func(spec_name):
#Определяю переменные бюджетных мест
places_count = places[spec_name]
places_ostatok = ostatok_mest[spec_name]
#Формирую фрейм и правлю типизацию данных
df = pd.read_csv(path + '\\' + spec_name + '.csv')[['regnum','fio','prioritet','summ']]
df['summ'] = df['summ'].map(lambda r: int(r.strip()[:-3]))
df['prioritet'] = df['prioritet'].map(lambda r: int(r))
i = 0 #итератор
c = 0 #счётчик не поступивших
while c < places_count:
if(i >= len(df)):
break
if(len(postupivshie[ postupivshie['regnum'] == df['regnum'][i] ]) == 0): #Проверка на то, что студент ещё не поступил
if(df['prioritet'][i] <= prioritet): #Проверка приоритета студента
c = c + 1
#Если есть свободные места, будет добавлять новые элементы в список
if(places_ostatok > 0):
postupivshie.loc[ len(postupivshie) ] = [df['regnum'][i], spec_name, df['summ'][i], df['prioritet'][i], df['fio'][i]]
places_ostatok -= 1
#Если свободные места закончились, будет убирать тех, у кого меньше баллов
else:
k = postupivshie[postupivshie['spec'] == spec_name]['summ'].min()
id = postupivshie[(postupivshie['spec'] == spec_name) & (postupivshie['summ'] == k)].index.tolist()[0]
if( df['summ'][i] > postupivshie['summ'][id] ):
postupivshie.loc[id] = [df['regnum'][i], spec_name, df['summ'][i], df['prioritet'][i], df['fio'][i]]
i = i + 1
ostatok_mest[spec_name] = places_ostatok
#------------------------------------------------------------------
#------------------------ Перебор файлов в папке ------------------------
for i in os.listdir(path):
if(os.path.isfile(path + '\\' + i) and (i[-4:]=='.csv')):
try:
func(i[:-4])
except Exception:
files_error.update([(i[:-4],Exception)])
#------------------------------------------------------------------------
#---------------------- Перебор приоритетов ----------------------
prioritet = 1
while prioritet <=5:
prioritet_cicle(prioritet)
prioritet = prioritet + 1
#-----------------------------------------------------------------
return postupivshie
#------------------------------------------------------------------------
#---------------------------------------+ ПЕЧАТЬ +---------------------------------------#
def print_spec(path, postupivshie):
def some_spec(spec_name):
if(spec_name in files_error):
return
print('\n\n\n')
print('----------------------------------------------+ {0} (мест: {1}) +----------------------------------------------'.format(spec_name, places[spec_name]))
print('id','\t','summ','\t','prioritet','\t','fio')
df = postupivshie[ postupivshie['spec'] == spec_name ]
df = df.sort_values(by=['summ'], ascending=False, na_position='first')
c = 1
for i, j in df.iterrows():
print(c,'\t',j['summ'],'\t',j['prioritet'],'\t\t',j['fio'])
c+=1
for i in places:
some_spec(i)
#----------------------------------------------------------------------------------------#
Списки в формате csv: https://drive.google.com/drive/folders/1jq1EDc3zSYDBa3CfucDSfGL9SjKJPRqw?usp=sharing
Помогите пожалуйста, уже пятый час бьюсь.