Creare suddivisioni temporali
Nel video abbiamo visto perché suddividere i dati in modo casuale può essere rischioso per le serie temporali: dati “dal futuro” possono causare overfitting nel modello. Spesso, con le serie temporali, acquisisci nuovi dati man mano che arrivano e vorrai riaddestrare il modello usando quelli più recenti. Nel video abbiamo mostrato come fare una suddivisione percentuale tra test e training set, ma supponiamo che tu voglia addestrare su tutti i dati disponibili tranne gli ultimi 45 giorni, che userai come test set.
In questo esercizio creeremo una funzione per trovare la data di split in modo da usare gli ultimi 45 giorni di dati per il test e il resto per il training. Nota che timedelta() è già stato importato per te dalla libreria standard python datetime.
Questo esercizio fa parte del corso
Feature Engineering con PySpark
Istruzioni dell'esercizio
- Crea una funzione
train_test_split_date()che accetti un dataframedf, la colonna data da usare per lo splitsplit_cole il numero di giorni da usare per il test settest_days, impostandolo di default a 45. - Trova le date
minemaxpersplit_colusando,(). - Trova la data in cui suddividere test e training set usando
max_datee sottraendotest_dayscontimedelta(), che accetta un parametrodays; in questo caso passatest_days. - Usando
OFFMKTDATEcomesplit_col, trovasplit_datee usala per filtrare il dataframe in due nuovi data frame,train_dfetest_df, dovetest_dfcontiene solo gli ultimi 45 giorni di dati. Inoltre, assicurati chetest_dfincluda solo le case elencate alla data di split filtrandodf['LISTDATE']minore o uguale asplit_date.
esercizio interattivo pratico
Prova questo esercizio completando questo codice di esempio.
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)