1
resposta

Tem um campo que apareceu na tabela mas não existia nas aulas anteriores

query = 'select curso.nome, count(*) from curso join matricula on matricula.curso_id = curso.id join aluno on aluno.id = matricula.aluno_id;'

pd.read_sql(query, engine)

Na hora de executar a query acima ela vai retornar o erro no sqlite porque a coluna "quantidade_de_alunos" não existia no Dataframe que originou a tabela.

OperationalError: (sqlite3.OperationalError) no such column: quantidade_de_alunos

1 resposta

Boa noite Carlos, tudo bem com você?

Percebi que você estudou outras possibilidades do sql com o Python, parabéns pela iniciativa. Como não consegui reproduzir o seu erro, vou explicar o que eu fiz e qual saída obtive, tudo bem?

Criei as tabelas aluno, curso e matricula com o seguinte código:

nomes.to_sql('aluno', engine)
cursos.to_sql('curso', engine)
matriculas.to_sql('matricula', engine)

Executei o código que você postou:

query = 'select curso.nome, count(*) from curso join matricula on matricula.curso_id = curso.id join aluno on aluno.id = matricula.aluno_id;'

pd.read_sql(query, engine)

E tive a seguinte saída:

nomecount(*)
0Análise de dados859

Imaginei que não era esse resultado que você estava esperando, já que 859 é o número total de matrículas existentes e não a quantidade de matrículas do curso Análise de dados. Você pode validar isso executando matriculas.shape[0], a saída será 859.

Mas ainda queremos a quantidade de matrículas de cada curso, como conseguimos fazer isso com a biblioteca do pandas? Podemos agrupar o nosso dataframe matriculas pela coluna 'curso_id' contando quantas vezes ele aparece no grupo, assim cada grupo teria o total de matrículas de cada curso. Legal, temos as quantidades, mas como fazemos para mostrar o nome do curso juntamente com as quantidades? Podemos fazer isso cruzando a coluna 'curso_id' do dataframe matriculas com a coluna id do dataframe cursos. O instrutor Guilherme resolveu esse problema da seguinte maneira na aula:

matriculas_por_curso = matriculas.groupby('curso_id').count().join(cursos['nome']).rename(columns={'aluno_id':'quantidade_de_alunos'})
matriculas_por_curso.head(3)

Saída:

curso_idquantidade_de_alunosnome
162Lógica de programação
252Java para Web
325C# para Web

Agora temos um novo dataframe matriculas_por_curso com as informações que queríamos.

Como você estava estudando outras possibilidades com sql, fazendo um pequeno ajuste, adicionando group by curso.nomeao final da sua query, vamos conseguir fazer a mesma coisa que fizemos com pandas com sql, olha só que legal:

query = 'select curso.nome, count(*) from curso join matricula on matricula.curso_id = curso.id join aluno on aluno.id = matricula.aluno_id group by curso.nome;'
pd.read_sql(query, engine)

Saída dos 10 primeiros:

nomecount(*)
0.NET para web56
1Análise de dados82
2Boas práticas em Java67
3C# para Web25
4Cursos de Python59
5Código limpo com C#12
6Desenvolvendo jogos31
7Estatística básica16
8Hardware básico22
9Internet das coisas44

Outra forma de obter as mesmas informações com sql é :

query = 'select count(curso_id) as quantidade_de_alunos, nome from matricula join curso on matricula.curso_id = curso.id group by matricula.curso_id'
pd.read_sql(query, engine)

Saída dos 10 primeiros:

quantidade_de_alunosnome
062Lógica de programação
152Java para Web
225C# para Web
333Ruby on Rails
459Cursos de Python
517PHP com MySql
656.NET para web
737Novas integrações com Java
870TDD com Java
912Código limpo com C#

Espero ter conseguido ajudar, mas qualquer coisa é só mandar mensagem viu?!

Abraço e bons estudos.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.Bons Estudos!