ComeçarComece de graça

Criando divisões por tempo

No vídeo, vimos por que dividir dados aleatoriamente pode ser perigoso para séries temporais, já que dados do futuro podem causar overfitting no nosso modelo. Em séries temporais, é comum você receber novos dados conforme ficam disponíveis e querer retreinar o modelo usando as informações mais recentes. No vídeo, mostramos como fazer uma divisão percentual para conjuntos de teste e treino, mas suponha que você queira treinar com todos os dados disponíveis, exceto os últimos 45 dias, que serão usados como conjunto de teste.

Neste exercício, vamos criar uma função para encontrar a data de corte usando os últimos 45 dias de dados para teste e o restante para treino. Observe que timedelta() já foi importado para você da biblioteca padrão python, datetime.

Este exercício faz parte do curso

Feature Engineering com PySpark

Ver curso

Instruções do exercício

  • Crie uma função train_test_split_date() que receba um dataframe df, a coluna de data a ser usada para a divisão split_col e o número de dias a usar no conjunto de teste test_days, definindo 45 como valor padrão.
  • Encontre as datas min e max para split_col usando ,().
  • Encontre a data para dividir os conjuntos de teste e treino usando max_date e subtraindo test_days com timedelta(), que recebe um parâmetro days; neste caso, passe test_days.
  • Usando OFFMKTDATE como split_col, encontre split_date e use-a para filtrar o dataframe em dois novos dataframes, train_df e test_df, onde test_df corresponde apenas aos últimos 45 dias dos dados. Além disso, garanta que o test_df contenha apenas imóveis listados até a data de corte filtrando df['LISTDATE'] menor ou igual a split_date.

Exercício interativo prático

Experimente este exercício completando este código de exemplo.

def train_test_split_date(df, split_col, test_days=____):
  """Calculate the date to split test and training sets"""
  # Find how many days our data spans
  max_date = df.____({____: ____}).collect()[0][0]
  min_date = df.____({____: ____}).collect()[0][0]
  # Subtract an integer number of days from the last date in dataset
  split_date = ____ - timedelta(days=____)
  return split_date

# Find the date to use in spitting test and train
split_date = train_test_split_date(df, ____)

# Create Sequential Test and Training Sets
____ = df.where(df[____] < split_date) 
____ = df.where(df[____] >= split_date).where(df[____] <= split_date) 
Editar e executar o código