Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
1
resposta

[Sugestão] Desafio: bora praticar? | Pandas: conhecendo a biblioteca

Resolução dos 4 desafios propostos:

  1. Criar coluna "Pontos_extras" (40% da nota atual)
  2. Criar coluna "Notas_finais" (nota + pontos extras)
  3. Criar coluna "Aprovado_final" (True se >= 6, False caso contrário)
  4. Selecionar alunos aprovados após pontos extras
    """

========== CARREGANDO OS DADOS ==========

print("\n" + "="*80)
print("CARREGANDO DADOS DOS ALUNOS")
print("="*80 + "\n")

df = pd.read_csv('/home/claude/alunos.csv')

print("Dataset original:")
print(df)
print(f"\nDimensões: {df.shape[0]} alunos e {df.shape[1]} colunas")

========== DESAFIO 1: PONTOS EXTRAS ==========

print("\n" + "="*80)
print("DESAFIO 1: Criando coluna 'Pontos_extras' (40% da nota atual)")
print("="*80 + "\n")

df['Pontos_extras'] = df['Nota'] * 0.40

print("Cálculo: Pontos_extras = Nota × 0.40")
print("\nResultado:")
print(df[['Aluno', 'Nota', 'Pontos_extras']])

========== DESAFIO 2: NOTAS FINAIS ==========

print("\n" + "="*80)
print("DESAFIO 2: Criando coluna 'Notas_finais' (nota + pontos extras)")
print("="*80 + "\n")

df['Notas_finais'] = df['Nota'] + df['Pontos_extras']

print("Cálculo: Notas_finais = Nota + Pontos_extras")
print("\nResultado:")
print(df[['Aluno', 'Nota', 'Pontos_extras', 'Notas_finais']])

========== DESAFIO 3: APROVAÇÃO ANTERIOR E FINAL ==========

print("\n" + "="*80)
print("DESAFIO 3: Criando colunas de aprovação")
print("="*80 + "\n")

Aprovação com base na nota original

df['Aprovado_anterior'] = df['Nota'] >= 6.0

Aprovação final

df['Aprovado_final'] = df['Notas_finais'] >= 6.0

print("Critério de aprovação: nota >= 6.0")
print("\nResultado:")
print(df[['Aluno', 'Nota', 'Notas_finais', 'Aprovado_anterior', 'Aprovado_final']])

========== DESAFIO 4: ALUNOS APROVADOS PELA SEGUNDA CHANCE ==========

print("\n" + "="*80)
print("DESAFIO 4: Alunos aprovados APÓS os pontos extras")
print("="*80 + "\n")

Selecionando: não aprovados antes (False) E aprovados depois (True)

alunos_segunda_chance = df[(~df['Aprovado_anterior']) & (df['Aprovado_final'])]

print(f"Alunos que NÃO estavam aprovados mas foram aprovados após pontos extras:\n")
print(alunos_segunda_chance[['Aluno', 'Nota', 'Pontos_extras', 'Notas_finais', 'Aprovado_anterior', 'Aprovado_final']])

print(f"\nTOTAL: {len(alunos_segunda_chance)} alunos ganharam uma segunda chance!")

========== ESTATÍSTICAS FINAIS ==========

print("\n" + "="*80)
print("ESTATÍSTICAS E RESUMO GERAL")
print("="*80 + "\n")

print(f"Total de alunos: {len(df)}")
print(f"\n✓ Aprovados ANTES dos pontos extras: {df['Aprovado_anterior'].sum()} alunos ({df['Aprovado_anterior'].sum()/len(df)*100:.1f}%)")
print(f"✓ Aprovados APÓS os pontos extras: {df['Aprovado_final'].sum()} alunos ({df['Aprovado_final'].sum()/len(df)*100:.1f}%)")
print(f"Alunos salvos pela segunda chance: {len(alunos_segunda_chance)} alunos")

print(f"\nMelhoria: {df['Aprovado_final'].sum() - df['Aprovado_anterior'].sum()} alunos a mais aprovados")

========== COMPARAÇÃO ANTES E DEPOIS ==========

print("\n" + "="*80)
print("COMPARAÇÃO: ANTES vs DEPOIS")
print("="*80 + "\n")

comparacao = df[['Aluno', 'Nota', 'Notas_finais', 'Aprovado_anterior', 'Aprovado_final']].copy()
comparacao['Mudança'] = comparacao['Aprovado_anterior'].astype(str) + ' → ' + comparacao['Aprovado_final'].astype(str)
comparacao['Status'] = comparacao.apply(
lambda row: 'APROVADO (novo)' if (row['Aprovado_anterior'] == False and row['Aprovado_final'] == True)
else ('PERMANECE APROVADO' if row['Aprovado_final'] == True
else 'PERMANECE REPROVADO'), axis=1
)

print(comparacao[['Aluno', 'Nota', 'Notas_finais', 'Status']])

========== DATAFRAME FINAL COMPLETO ==========

print("\n" + "="*80)
print("DATAFRAME FINAL COMPLETO")
print("="*80 + "\n")

print(df.to_string(index=False))

========== EXPORTANDO RESULTADO ==========

print("\n" + "="*80)
print("EXPORTANDO RESULTADOS")
print("="*80 + "\n")

Salvando o DataFrame completo

df.to_csv('/mnt/user-data/outputs/alunos_processado.csv', index=False)
print("✓ Arquivo salvo: alunos_processado.csv")

Salvando apenas os alunos com segunda chance

alunos_segunda_chance.to_csv('/mnt/user-data/outputs/alunos_segunda_chance.csv', index=False)
print("✓ Arquivo salvo: alunos_segunda_chance.csv")

print("\nDesafio concluído com sucesso!\n")

1 resposta
solução!

Olá, Estudante. Como vai?

Uau! Que resolução fantástica e caprichada. Você foi muito além de apenas resolver os desafios; estruturou um verdadeiro pipeline de dados acadêmico, completo com logs de execução, métricas percentuais de impacto e exportação limpa dos resultados em arquivos .csv.

O seu script está impecável. A lógica de manipulação das colunas demonstra que você compreendeu perfeitamente o poder da vetorização do Pandas (fazer operações matemáticas diretas na coluna inteira sem precisar usar loops for), o que é a melhor prática absoluta em Data Science para performance.

Analisando a sua solução bloco a bloco, separei alguns destaques técnicos e uma dica avançada de otimização:


1. O Grande Destaque: A Lógica de Filtragem (Desafio 4)

O seu filtro para encontrar os alunos que se salvaram na "segunda chance" ficou excelente:

alunos_segunda_chance = df[(~df['Aprovado_anterior']) & (df['Aprovado_final'])]
  • Por que isso é nível profissional? Você utilizou corretamente o operador de negação do Pandas (~) para inverter os valores booleanos da coluna Aprovado_anterior (transformando quem era False em True) e combinou com o operador comercial (&) para a interseção. Essa operação booleana é executada diretamente em nível de linguagem C por baixo dos panos do Pandas, tornando o filtro extremamente rápido.

2. Visão de Negócio nas Estatísticas Finais

A criação da seção de "Estatísticas Finais" mostra que você já tem a mentalidade de um analista de dados. Em ambientes corporativos, a diretoria ou coordenação não quer ler o DataFrame completo linha por linha; eles querem exatamente o resumo que você construiu: o impacto percentual de aprovação antes e depois da ação (ex: "Melhoria: X alunos a mais aprovados").


3. Dica de Otimização: Substituindo o .apply(axis=1)

No bloco de comparação, você utilizou uma função lambda com .apply(axis=1) para classificar o Status:

comparacao['Status'] = comparacao.apply(
    lambda row: 'APROVADO (novo)' if (row['Aprovado_anterior'] == False and row['Aprovado_final'] == True)
    ...
    axis=1
)
  • Ponto de Atenção: O método .apply() com axis=1 obriga o Pandas a percorrer o DataFrame linha por linha (como se fosse um loop for disfarçado). Para tabelas pequenas, funciona perfeitamente, mas se a sua base de alunos tivesse 500 mil linhas, essa linha pesaria bastante no processamento.
  • A Alternativa Perfeita (np.select): Uma forma muito mais elegante e performática de criar colunas condicionais baseadas em múltiplos critérios no Pandas é utilizando a função np.select() do NumPy. Veja como o código fica limpo e vetorizado:
import numpy as np

# Definimos as condições como filtros booleanos
condicoes = [
    (~comparacao['Aprovado_anterior']) & comparacao['Aprovado_final'], # Falso -> Verdadeiro
    comparacao['Aprovado_final']                                        # Já era Verdadeiro
]

# Definimos os resultados para cada condição
resultados = ['APROVADO (novo)', 'PERMANECE APROVADO']

# Criamos a coluna. O que não entrar nas condições acima vira o "default"
comparacao['Status'] = np.select(condicoes, resultados, default='PERMANECE REPROVADO')

Parabéns pela dedicação em documentar os passos, pela organização visual dos separadores no console e pelo capricho no código! Você dominou com maestria os fundamentos de manipulação de dados com o Pandas.

Espero que possa ter lhe ajudado!