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
Instruções do exercício
- Crie uma função
train_test_split_date()que receba um dataframedf, a coluna de data a ser usada para a divisãosplit_cole o número de dias a usar no conjunto de testetest_days, definindo 45 como valor padrão. - Encontre as datas
minemaxparasplit_colusando,(). - Encontre a data para dividir os conjuntos de teste e treino usando
max_datee subtraindotest_dayscomtimedelta(), que recebe um parâmetrodays; neste caso, passetest_days. - Usando
OFFMKTDATEcomosplit_col, encontresplit_datee use-a para filtrar o dataframe em dois novos dataframes,train_dfetest_df, ondetest_dfcorresponde apenas aos últimos 45 dias dos dados. Além disso, garanta que otest_dfcontenha apenas imóveis listados até a data de corte filtrandodf['LISTDATE']menor ou igual asplit_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)