1
resposta

[Sugestão] 11 Desafio: bora praticar?

import pandas as pd
import matplotlib.pyplot as plt
from urllib.request import urlopen
from urllib.parse import urlparse
import io
import csv
import logging
import os
from datetime import datetime

# Configuração de logging
logging.basicConfig(level=logging.INFO, format='%(levelname)s: %(message)s')

def detectar_separador(conteudo_bytes):
    try:
        amostra = conteudo_bytes[:1024].decode('utf-8', errors='ignore')
        dialeto = csv.Sniffer().sniff(amostra)
        return dialeto.delimiter
    except Exception as e:
        logging.warning(f'Não foi possível detectar o separador: {e}')
        return ','

def extrair_extensao(url):
    return urlparse(url).path.split('.')[-1].lower()

def carregar_dados(url):
    extensao = extrair_extensao(url)
    try:
        conteudo = urlopen(url).read()
    except Exception as e:
        raise RuntimeError(f'Erro ao acessar a URL: {e}')
    
    buffer = io.BytesIO(conteudo)

    match extensao:
        case 'csv':
            sep = detectar_separador(conteudo)
            try:
                return pd.read_csv(buffer, encoding='utf-8', sep=sep)
            except UnicodeDecodeError:
                buffer.seek(0)
                return pd.read_csv(buffer, encoding='latin1', sep=sep)
        case 'xls' | 'xlsx':
            return pd.read_excel(buffer)
        case 'json':
            return pd.read_json(buffer)
        case _:
            raise ValueError(f'Extensão não suportada: .{extensao}')

def criar_pasta_saida(base='output'):
    timestamp = datetime.now().strftime('%Y-%m-%d_%H-%M-%S')
    caminho = os.path.join(base, timestamp)
    os.makedirs(caminho, exist_ok=True)
    return caminho

# URL de dados
url = 'https://raw.githubusercontent.com/alura-cursos/pandas-conhecendo-a-biblioteca/main/desafios/alunos.csv'

# Carregar dados
dados = carregar_dados(url)
dados['Notas'] = pd.to_numeric(dados['Notas'], errors='coerce')
logging.info('Dados carregados com sucesso.')

# Agrupar por status
grupos = {
    'Aprovados': dados[dados['Notas'] >= 7],
    'Reprovados': dados[dados['Notas'] < 7],
    'Sem Notas': dados[dados['Notas'].isnull()]
}
total = len(dados)
porcentagens = {k: (len(v) / total) * 100 for k, v in grupos.items()}

# Gráfico
plt.figure(figsize=(10, 6))
plt.bar(porcentagens.keys(), porcentagens.values(), color=['green', 'red', 'gray'])
plt.ylabel('Porcentagem')
plt.title('Distribuição de Alunos por Situação')
plt.ylim(0, 100)
for i, (grupo, df) in enumerate(grupos.items()):
    plt.text(i, porcentagens[grupo] + 1, str(len(df)), ha='center')
plt.tight_layout()
plt.show()

# Criar diretório de saída com timestamp
pasta_saida = criar_pasta_saida()

# Salvar grupos em arquivos CSV
for grupo, df in grupos.items():
    nome_arquivo = f"alunos_{grupo.lower().replace(' ', '_')}.csv"
    caminho_arquivo = os.path.join(pasta_saida, nome_arquivo)
    df.to_csv(caminho_arquivo, index=False)
    logging.info(f'{grupo}: {len(df)} alunos salvos em {caminho_arquivo}')
1 resposta

Ei, Marinaldo! Tudo bem?

Muito bom o seu código! Você fez um ótimo trabalho organizando as etapas de carregamento, análise e visualização dos dados. Parabéns por todo empenho que vem tendo!

Estes conteúdos podem abrir em inglês e se preferir ler em português, recomendo que utilize o tradutor automático do navegador.

Até mais, Marinaldo!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado!