Introdução
Um estúdio comunitário prepara materiais sete dias antes de cada oficina. Prever a presença com leituras de entrada feitas após o evento poderia parecer impressionante, mas seria inútil nesse prazo. Primeiro você estabelecerá uma referência simples e depois decidirá quais linhas e colunas uma previsão realmente antecipada pode usar.
Você precisa conhecer funções Python, entrada básica no terminal, seleção e junções com pandas e conceitos introdutórios de regressão e divisão entre treino e teste. Python e as bibliotecas científicas estão preparados. Todas as tabelas são dados sintéticos originais para ensino; a pequena amostra demonstra um fluxo de trabalho, não garante previsões em produção. Os 55 minutos são uma estimativa do autor, incluindo leitura e correções comuns.
Medir uma referência simples em pessoas
Nesta etapa, você preverá duas oficinas posteriores a partir de uma mediana anterior e interpretará o erro absoluto médio.
Comece em WebIDE e abra Terminal → New Terminal. O editor e o terminal compartilham arquivos. cd muda o diretório de trabalho deste terminal; um novo terminal precisa de seu próprio cd.
cd /home/labex/project/workshop-attendance
O inicializador preparado ./python usa o ambiente Python do curso. ./ significa “o executável neste diretório”. Use-o, em vez do Python do sistema, para executar os arquivos do curso. cat exibe um arquivo de texto sem editá-lo.
cat warmup-early.csv
Este pequeno aquecimento tem três contagens reais anteriores: 12, 18 e 24. A mediana, o valor central após ordenar, é 18 pessoas. A referência prevê 18 para cada evento posterior sem usar características do evento.
cat warmup-later.csv
As contagens posteriores são 20 para L-7 e 27 para L-2. Seus erros absolutos são abs(20 - 18) = 2 e abs(27 - 18) = 9. O erro absoluto médio (MAE) é a média: (2 + 9) / 2 = 5.5 pessoas. “Erro médio de 5,5 pessoas” tem significado; uma “acurácia” sem unidade esconderia o que está sendo medido. Este aquecimento é separado da temporada completa usada em seguida.
Crie uma função de referência reutilizável. O redirecionamento do shell > substitui baseline.py. O here-document entre aspas <<'PY' envia tudo até uma linha contendo apenas PY para esse arquivo, sem expansão pelo shell. Cole o bloco inteiro, inclusive o PY final. Você também pode editar o mesmo arquivo no WebIDE e salvar com File → Save.
O executor passa duas tabelas pandas para summarize. itertuples() percorre linhas com campos nomeados; o dicionário associa o ID de cada oficina posterior ao seu próprio erro. float converte valores numéricos pandas em números comuns do Python para saída JSON.
cat > baseline.py <<'PY'
def summarize(early, later):
baseline = float(early.actual_attendance.median())
errors = {
row.session_id: float(abs(row.actual_attendance - baseline))
for row in later.itertuples()
}
return {
"median_attendance": baseline,
"absolute_errors": errors,
"mae": sum(errors.values()) / len(errors),
}
PY
Execute o programa auxiliar preparado para escrever arquivos. Seu argumento baseline seleciona esta etapa; ele salva o resultado da função em output/baseline.json. JSON armazena valores e objetos nomeados em vez de linhas CSV.
./python run.py baseline
Os valores exibidos devem incluir mediana 18.0, erros 2.0 e 9.0, e MAE 5.5. Leia o artefato salvo com o leitor preparado, que nunca recria resultados ausentes.
./python show_results.py baseline
Agora você tem uma referência cujo erro usa as mesmas unidades do problema de planejamento. Um modelo posterior deve ser comparado nos mesmos eventos de avaliação; superar o valor deste aquecimento em outra amostra não seria uma comparação justa.
Separar o momento do treino do momento da previsão
Nesta etapa, você associará resultados por ID de oficina e reservará datas posteriores para avaliar.
Continue no mesmo terminal do WebIDE, em /home/labex/project/workshop-attendance. Leia o limite da temporada e as três tabelas principais.
cat season.json
cat history.csv
cat labels.csv
cat future.csv
O dicionário de dados é:
| Campo | Significado e disponibilidade | Uso |
|---|---|---|
session_id |
Identidade estável da oficina; ordem do arquivo arbitrária | Associar linhas, nunca uma característica do modelo |
event_date |
Dia programado do evento, ISO YYYY-MM-DD |
Determinar a divisão temporal |
booked_7d |
Retrato das reservas salvo exatamente sete dias antes do evento | Característica numérica permitida |
duration_minutes |
Duração já anunciada no prazo de sete dias | Característica numérica permitida |
final_bookings |
Total final de reservas no evento | Indisponível no prazo da previsão |
scanned_entries |
Leituras de entrada coletadas no evento | Indisponível no prazo da previsão |
actual_attendance |
Resultado conhecido até o fim do dia do evento | Alvo de treino ou rótulo de avaliação reservado |
Uma célula numérica CSV vazia indica informação ausente, não zero reservas. Cada característica permitida tem pelo menos um valor observado de treino. Os IDs são únicos em cada tabela; labels.csv contém exatamente um resultado por ID histórico, intencionalmente em outra ordem. future.csv não tem resultados nem colunas posteriores ao evento. Chaves inválidas, características inteiramente vazias no treino e atualizações contínuas do modelo estão fora do escopo de entrada do curso.
O modelo é treinado uma vez e congelado em 1º de abril de 2026 às 00:00 UTC, as_of_date. Apenas eventos anteriores podem fornecer rótulos de treino. Nesta temporada, o último evento de treino é 8 de março, então esses rótulos já estão disponíveis. O conjunto reservado começa em 12 de abril, holdout_start; seu primeiro prazo de previsão de sete dias é 5 de abril, depois do congelamento. Não há eventos históricos fornecidos nesse intervalo.
São relógios diferentes: 1º de abril congela o modelo ajustado; cada evento posterior fornece seu próprio retrato booked_7d na sua data de previsão. O retrato de 5 de abril do evento de 12 de abril é usado em 5 de abril, sem afirmar que era conhecido no dia 1º. Este exercício em arquivos reproduz retratos salvos. Os rótulos reais posteriores só são revelados para medir desempenho retrospectivamente. As oficinas de maio em future.csv continuam previsões sem rótulos.
Substitua a divisão incompleta baseada em posições. Um merge um para um associa rótulos por session_id; não supõe que a primeira linha corresponde à primeira linha. pd.to_datetime interpreta datas do calendário, pd.Timestamp os limites configurados, e máscaras booleanas selecionam as linhas correspondentes. Ordenar por data e depois por ID facilita a leitura; a grafia do ID nunca define o período. .copy() cria tabelas selecionadas independentes.
cat > split.py <<'PY'
import pandas as pd
def split_events(history, labels, season):
events = history.merge(labels, on="session_id", validate="one_to_one")
dates = pd.to_datetime(events["event_date"])
train = events.loc[dates < pd.Timestamp(season["as_of_date"])].copy()
holdout = events.loc[dates >= pd.Timestamp(season["holdout_start"])].copy()
return (
train.sort_values(["event_date", "session_id"]),
holdout.sort_values(["event_date", "session_id"]),
)
PY
./python run.py split
A ordem de treino deve ser W-91, W-04, W-77, W-12, W-63, W-02; os IDs reservados são W-88, W-09. Esses IDs irregulares mostram por que nem ordem alfabética nem as duas últimas linhas do arquivo definem a divisão.
./python show_results.py split
Verifique W-88: ele deve preservar presença real 46 do rótulo correspondente, não do rótulo na mesma posição. Os arquivos salvos training.csv e holdout.csv ainda incluem colunas posteriores ao evento para inspeção. A próxima etapa seleciona somente as duas características permitidas; armazenar uma coluna como número não a torna legítima para prever.
Se fechar o terminal sem querer, abra Terminal → New Terminal e repita o cd acima. “No such file or directory” normalmente indica diretório errado ou nome digitado incorretamente. Use pwd para mostrar o caminho atual e ls para listar arquivos, volte ao espaço de trabalho e repita o comando correto. Não reinicie o laboratório para corrigir um erro comum de caminho.
Aprender médias de valores ausentes somente no treino
Nesta etapa, você ajustará um imputador nas oficinas anteriores e o reutilizará em retratos posteriores sem aprender com eles.
Continue no WebIDE, em /home/labex/project/workshop-attendance. Você pode editar baseline.py, split.py, prepare.py e seus arquivos output/. Preserve todas as entradas CSV/JSON fornecidas, python, run.py, coursekit.py, show_results.py e cada starter-*.py. As cópias iniciais permitem recuperar um módulo; você também pode colar novamente sua versão completa ensinada. As funções principais devem continuar reutilizáveis quando datas, ordem das linhas e valores numéricos mudarem.
A imputação substitui uma característica ausente por um valor aprendido. SimpleImputer(strategy="mean") aprende a média aritmética de cada coluna. Aqui, as observações de treino de booked_7d são 10, 20, 40, 25 e 35: a média é 26. As seis durações conhecidas têm média de 80 minutos. Usar todos os períodos permitiria que oficinas posteriores influenciassem essas escolhas de treino, mesmo sem seus rótulos de resultado. Ajuste depois da divisão, não antes.
FEATURES, fornecido por coursekit, é exatamente ['booked_7d', 'duration_minutes']. Colchetes duplos selecionam essas duas colunas nessa ordem. fit_transform aprende médias e preenche a matriz de treino; transform reutiliza as mesmas médias nas matrizes reservada e futura. statistics_ expõe as médias aprendidas na ordem das características. Os arrays retornados preservam a ordem de linhas de cada tabela de entrada para que o programa auxiliar mantenha seus IDs.
cat > prepare.py <<'PY'
from sklearn.impute import SimpleImputer
from coursekit import FEATURES
def prepare_features(train, holdout, future):
imputer = SimpleImputer(strategy="mean")
training_values = imputer.fit_transform(train[FEATURES])
holdout_values = imputer.transform(holdout[FEATURES])
future_values = imputer.transform(future[FEATURES])
return training_values, holdout_values, future_values, imputer.statistics_
PY
./python run.py prepare
As médias aprendidas devem ser booked_7d: 26.0 e duration_minutes: 80.0.
./python show_results.py prepare
Em holdout-features.csv, W-88 usa 26 reservas e seus 150 minutos observados; W-09 mantém 90 reservas e usa 80 minutos. Em future-features.csv, F-101 usa a mesma média de reservas do treino. Não entram nessas matrizes numéricas reservas finais, leituras, datas, IDs ou resultados. As células vazias originais permanecem intactas nos arquivos fonte.
Você preparou uma fronteira real de avaliação do anterior para o posterior. Isso não demonstra que o futuro se comporte como o passado. O próximo laboratório independente ajustará um modelo pequeno e comparará erros contínuos com uma referência de mediana de treino no mesmo conjunto reservado rotulado. Cálculos equivalentes e outras ordens de saída são aceitos se mantiverem associações por ID e significado numérico; as comparações permitem tolerância absoluta e relativa de 1e-8.
Resumo
Você criou uma referência reutilizável de mediana, mediu o MAE em pessoas, associou resultados por ID e separou datas anteriores de treino das posteriores de avaliação. Selecionou somente informações disponíveis sete dias antes e ajustou médias de preenchimento apenas nas linhas de treino. As tabelas salvas mantêm as identidades originais, e os dados de origem permanecem intactos para a próxima etapa da análise.



