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}')