Olá, percebi que no código utilizado pelo professor para atribuir a quantidade de cursos para cada aluno, alguns alunos estão matriculados em um mesmo curso, algo que não bate com a lógica do exercício que estamos fazendo.
Vi que algumas pessoas também perceberam isso e postaram aqui no fórum, de forma que foi sugerido a utilização da função drop_duplicates do pandas. Realmente o drop_duplicates pode solucionar esse problema de um aluno matriculado em um mesmo curso duas vezes, porém se eu aplico a função e removo essas informações, acaba que terei uma diferença de valor final entre o número total de matrículas por aluno (somando a quantidade de matriculas por cada aluno) e o número de matrículas do meu DataFrame final (Aquele em que removi os resultados duplicados, através do drop_duplicates). Então, buscando resolver esse problema logo na atribuição dos cursos, de forma que ambos os valores finais se igualassem, tentei modificar o código utilizado pelo professor:
for index, row in nomes.iterrows():
id = row.id_aluno
matriculas = row.matriculas
for i in range(matriculas):
mat = [id, np.random.choice(cursos.index, p = prob)]
todas_matriculas.append(mat)
matriculas = pd.DataFrame(todas_matriculas, columns = ['id_aluno', 'id_curso'])
matriculas
Para esse aqui:
for index, row in nomes.iterrows():
id = row.id_aluno
matriculas = row.matriculas
for i in range(matriculas):
mat = [id, np.random.choice(cursos.index, p = prob)]
if mat not in todas_matriculas:
todas_matriculas.append(mat)
else:
i = i - 1
matriculas = pd.DataFrame(todas_matriculas, columns = ['id_aluno', 'id_curso'])
matriculas
Minha ideia era criar uma condição para verificar se o mesmo aluno ainda não havia sido matriculado no curso e, caso a resposta fosse negativa, eu não adicionaria ele na lista final que seriam os dados do meu dataframe. Porém percebi que esse código apresentado não funcionava, pois o 'i' não era subtraído na contagem do range(), gerando o mesmo 'problema' de se utilizar o drop_duplicates (não teríamos alunos/curso duplicados, porém teríamos uma diferença entre valores de matrículas).
Posteriormente consegui resolver o problema a partir deste código:
for index, row in nomes.iterrows():
i = 0
id = row.id_aluno
matriculas = row.matriculas
while i < matriculas:
mat = [id, np.random.choice(cursos.index, p = prob)]
if mat not in todas_matriculas:
todas_matriculas.append(mat)
else:
i = i-1
i = i + 1
Apesar de funcionar a lógica e ter todos os valores iguais, sem repetição de alunos e matrículas, achei a codificação dele meio feia, ou deselegante. Gostaria de saber se é possível eu ter esse mesmo resultado através da minha primeira alteração de código, onde tive o problema da subtração do 'i' não afetar a contagem no range(). Tem algum modo que posso ter esse efeito? Ou, então, tem alguma outra sugestão de código mais bonito e elegante, parecido com o desenvolvido inicialmente pelo professor?
Perdão pela loooonga dúvida!