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

Помогите пожалуйста, уже пятый час бьюсь.


Ответы (0 шт):