Creación de particiones temporales
En el vídeo vimos por qué dividir los datos aleatoriamente puede ser peligroso en series temporales: datos del futuro pueden causar sobreajuste en tu modelo. A menudo, con series temporales vas incorporando nuevos datos a medida que aparecen y querrás reentrenar el modelo con la información más reciente. En el vídeo mostramos cómo hacer una división porcentual entre conjuntos de entrenamiento y prueba, pero supongamos que quieres entrenar con todos los datos disponibles excepto los últimos 45 días, que usarás como conjunto de prueba.
En este ejercicio, crearemos una función para obtener la fecha de corte que permita usar los últimos 45 días como prueba y el resto como entrenamiento. Ten en cuenta que timedelta() ya se ha importado para ti de la biblioteca estándar de python, datetime.
Este ejercicio forma parte del curso
Ingeniería de características con PySpark
Instrucciones del ejercicio
- Crea una función
train_test_split_date()que reciba un dataframedf, la columna de fecha para dividirsplit_coly el número de días para el conjunto de pruebatest_days, con un valor por defecto de 45. - Obtén las fechas
minymaxparasplit_colusando,(). - Calcula la fecha para separar entrenamiento y prueba usando
max_datey restandotest_daysmediantetimedelta(), que recibe un parámetrodays; en este caso, pasatest_days. - Usando
OFFMKTDATEcomosplit_col, encuentrasplit_datey úsala para filtrar el dataframe en dos nuevos,train_dfytest_df, dondetest_dfcontenga solo los últimos 45 días de datos. Además, asegúrate de quetest_dfsolo incluya viviendas listadas hasta la fecha de corte filtrandodf['LISTDATE']menor o igual quesplit_date.
ejercicio interactivo práctico
Prueba este ejercicio completando este código de ejemplo.
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)