Skapa tidsuppdelningar
I videon lärde vi oss varför slumpmässig uppdelning av data kan vara problematisk för tidsserier, eftersom data från framtiden kan leda till överanpassning i modellen. Med tidsserier tillkommer ofta ny data efterhand, och du vill då träna om modellen med de senaste uppgifterna. I videon visade vi hur man gör en procentuell uppdelning i test- och träningsset – men tänk dig att du vill träna på all tillgänglig data utom de sista 45 dagarna, som du vill använda som testset.
I den här övningen skapar vi en funktion som hittar uppdelningsdatumet och använder de sista 45 dagarna som testdata och resten som träningsdata. Observera att timedelta() redan har importerats från standardbiblioteket datetime i python.
Den här övningen är en del av kursen
Feature Engineering med PySpark
Övningsinstruktioner
- Skapa en funktion
train_test_split_date()som tar emot en dataram,df, den datumkolumn som ska användas för uppdelningensplit_col, samt antalet dagar att använda för testsetet,test_days, med standardvärdet 45. - Hitta
min- ochmax-datumen försplit_colmed hjälp av,(). - Beräkna det datum som ska användas för att dela upp test- och träningsset genom att utgå från
max_dateoch subtraheratest_daysmedtimedelta(), som tar parameterndays– skicka intest_dayshär. - Använd
OFFMKTDATEsomsplit_colför att hittasplit_date, och filtrera sedan dataramen till två nya:train_dfochtest_df, därtest_dfendast innehåller de sista 45 dagarnas data. Se dessutom till atttest_dfbara innehåller bostäder som listades före uppdelningsdatumet, genom att filtreradf['LISTDATE']till värden som är mindre än eller lika medsplit_date.
Interaktiv övning med praktiskt arbete
Testa den här övningen genom att slutföra den här exempelkoden.
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)