Створення часових розбиттів
У відео ми розглянули, чому випадкове розбиття небезпечне для часових рядів: дані з майбутнього можуть призвести до перенавчання моделі. Часто для часових рядів ви отримуєте нові дані щойно вони з'являються і хочете перевчити модель на найновіших даних. У відео ми показали, як зробити відсоткове розбиття на тренувальну і тестову вибірки, але припустімо, що ви хочете навчати на всіх доступних даних, окрім останніх 45 днів, які підуть у тестову вибірку.
У цій вправі ми створимо функцію, що знаходить дату розбиття, щоб використати останні 45 днів даних для тестування, а решту — для тренування. Зверніть увагу, що timedelta() уже імпортовано для вас зі стандартної бібліотеки python datetime.
Ця вправа є частиною курсу
Опрацювання ознак у PySpark
Інструкції до вправи
- Створіть функцію
train_test_split_date(), яка приймає датафреймdf, стовпець дати для розбиттяsplit_colі кількість днів для тестової вибіркиtest_days, задавши для нього значення за замовчуванням 45. - Знайдіть мінімальну та максимальну дати для
split_col, використовуючи,(). - Визначте дату розбиття тестової та тренувальної вибірок, використавши
max_dateі віднявши від ньогоtest_daysза допомогоюtimedelta(), яка приймає параметрdays; у цьому випадку передайтеtest_days. - Використовуючи
OFFMKTDATEякsplit_col, знайдітьsplit_dateі застосуйте його для фільтрування датафрейма на два нові —train_dfіtest_df, деtest_df— це лише останні 45 днів даних. Додатково переконайтеся, щоtest_dfмістить лише будинки, виставлені на продаж станом на дату розбиття, відфільтрувавшиdf['LISTDATE']так, щоб вона була меншою або дорівнювалаsplit_date.
Інтерактивна практична вправа
Спробуйте виконати цю вправу, доповнивши цей зразок коду.
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)