Zacznij terazZacznij za darmo

Tworzenie podziałów czasowych

Na wideo omówiliśmy, dlaczego losowy podział danych może być niebezpieczny w przypadku szeregów czasowych – dane z przyszłości mogą powodować przeuczenie modelu. W przypadku szeregów czasowych często pozyskujemy nowe dane w miarę ich dostępności i chcemy ponownie trenować model na najnowszych danych. Na wideo pokazaliśmy, jak wykonać podział procentowy na zbiór testowy i treningowy, ale załóżmy, że chcesz trenować na wszystkich dostępnych danych z wyjątkiem ostatnich 45 dni, które mają posłużyć jako zbiór testowy.

W tym ćwiczeniu utworzysz funkcję wyznaczającą datę podziału, tak by ostatnie 45 dni danych trafiło do zbioru testowego, a pozostałe – do treningowego. Pamiętaj, że timedelta() zostało już zaimportowane ze standardowej biblioteki python o nazwie datetime.

To ćwiczenie jest częścią kursu

Inżynieria cech z PySpark

Zobacz kurs

Instrukcje do ćwiczenia

  • Utwórz funkcję train_test_split_date(), która przyjmuje ramkę danych df, kolumnę z datami używaną do podziału split_col oraz liczbę dni przeznaczonych na zbiór testowy test_days – ustaw dla niej domyślną wartość 45.
  • Wyznacz minimalne i maksymalne daty dla split_col za pomocą ,().
  • Oblicz datę podziału na zbiór testowy i treningowy, odejmując test_days od max_date przy użyciu timedelta(), które przyjmuje parametr days – w tym przypadku przekaż do niego test_days.
  • Używając OFFMKTDATE jako split_col, wyznacz split_date i użyj jej do podzielenia ramki danych na dwie nowe: train_df i test_df, gdzie test_df zawiera wyłącznie ostatnie 45 dni danych. Zadbaj przy tym, by test_df obejmował tylko nieruchomości wystawione nie później niż w dniu podziału – odfiltruj df['LISTDATE'] tak, by była mniejsza lub równa split_date.

Interaktywne ćwiczenie praktyczne

Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.

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) 
Edytuj i uruchom kod