LoslegenKostenlos starten

Zeitlich basierte Splits erstellen

Im Video haben wir gelernt, warum ein zufälliges Splitten bei Zeitreihen riskant ist: Daten aus der Zukunft können zu Overfitting führen. Bei Zeitreihen erhältst du oft neue Daten, sobald sie verfügbar sind, und möchtest dein Modell mit den neuesten Daten neu trainieren. Im Video haben wir gezeigt, wie man prozentuale Splits für Test- und Trainingsmengen erstellt. Angenommen, du willst auf allen verfügbaren Daten trainieren – außer auf den letzten 45 Tagen, die du als Testmenge verwenden möchtest.

In dieser Übung erstellen wir eine Funktion, die das Split-Datum ermittelt, sodass die letzten 45 Tage für das Testen und der Rest für das Training genutzt werden. Beachte, dass timedelta() bereits aus der Standardbibliothek python (datetime) für dich importiert wurde.

Diese Übung ist Teil des Kurses

<Kurs>Feature Engineering mit PySpark</Kurs>
Kurs ansehen

Übungsanweisungen

  • Erstelle eine Funktion train_test_split_date(), die ein DataFrame df, die Datumsspalte zum Splitten split_col sowie die Anzahl der Tage für das Test-Set test_days entgegennimmt und einen Standardwert von 45 für test_days setzt.
  • Ermittle die min- und max-Daten für split_col mithilfe von ,().
  • Bestimme das Datum für den Split zwischen Test- und Trainingsmenge, indem du von max_date test_days abziehst. Verwende dazu timedelta(), das einen Parameter days erwartet; übergib hier test_days.
  • Verwende OFFMKTDATE als split_col, ermittle split_date und filtere das DataFrame in zwei neue DataFrames, train_df und test_df, wobei test_df nur die letzten 45 Tage der Daten enthält. Stelle außerdem sicher, dass test_df nur Objekte enthält, die bis zum Split-Datum gelistet wurden, indem du df['LISTDATE'] auf kleiner oder gleich split_date filterst.

Interaktive praktische Übung

Versuche dich an dieser Übung, indem du diesen Beispielcode vervollständigst.

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) 
Code bearbeiten und ausführen