Rozdělení dat podle času
Ve videu jsme se dozvěděli, proč může být náhodné rozdělení dat u časových řad nebezpečné – data z budoucnosti mohou způsobit přetrénování modelu. U časových řad obvykle přibývají nová data postupně, jak jsou k dispozici, a model je třeba pravidelně přetrénovat na nejnovějších datech. Ve videu jsme ukázali, jak provést procentuální rozdělení na trénovací a testovací sady. Tentokrát ale chceme trénovat na všech dostupných datech s výjimkou posledních 45 dní, které použijeme jako testovací sadu.
V tomto cvičení vytvoříme funkci, která najde datum rozdělení tak, aby posledních 45 dní sloužilo k testování a zbytek k trénování. Funkce timedelta() je již naimportována ze standardní knihovny python – datetime.
Toto cvičení je součástí kurzu
Feature Engineering with PySpark
Pokyny k cvičení
- Vytvoř funkci
train_test_split_date(), která přijímá datový rámecdf, název sloupce s datem pro rozdělenísplit_cola počet dní pro testovací sadutest_dayss výchozí hodnotou 45. - Pomocí
min()amax()najdi nejmenší a největší datum ve sloupcisplit_col. - Vypočítej datum rozdělení trénovací a testovací sady tak, že od
max_dateodečteštest_dayspomocí funkcetimedelta(), která přijímá parametrdays– předej jí hodnotutest_days. - Jako
split_colpoužijOFFMKTDATE, najdisplit_datea podle něj rozdel datový rámec na dva nové –train_dfatest_df, přičemžtest_dfbude obsahovat pouze posledních 45 dní dat. Zároveň zajisti, abytest_dfobsahoval pouze domy nabízené k datu rozdělení nebo dříve – vyfiltruj záznamy, kdedf['LISTDATE']je menší nebo rovnosplit_date.
Interaktivní cvičení na vyzkoušení si v praxi
Vyzkoušejte si toto cvičení dokončením tohoto ukázkového kódu.
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)