Как использовать курс валют с последнего доступного дня для выходных и праздников
Что проверяют
Умеете ли вы превратить разрежённый ряд в календарный и не заглянуть при этом в будущее. Следом спрашивают, как вы отличите законный выходной от дыры в загрузке и что будет, если заполнить пропуск интерполяцией.
Как отвечать
Сначала уточните, что значит дата в источнике. Курс часто устанавливают заранее: у ЦБ РФ значение, установленное в пятницу, действует в субботу, воскресенье и понедельник. Путать дату публикации с датой действия значит сдвинуть весь ряд на день.
Дальше техника зависит от того, где лежат данные:
- pandas, календарь: в реальных выгрузках выходных просто нет строк, поэтому
ffill()сам по себе ничего не заполнит. Нужноdf.set_index("date").asfreq("D")илиreindex(pd.date_range(...)), и только потомffill(); - pandas, сделки к курсам:
pd.merge_asof(deals, rates, on="date", by="currency", direction="backward")берёт для каждой сделки последний курс не позже её даты, оба фрейма должны быть отсортированы поdate; - SQL: в PostgreSQL это
LEFT JOIN LATERALс подзапросомwhere date <= d.date order by date desc limit 1и индексом(currency, date), в ClickHouse естьASOF JOIN; - Spark: окно по валюте с сортировкой по дате и
last("rate", ignorenulls=True).
Обязательно ставьте предел: ffill(limit=...) или проверку длины пропуска. Выходные дают разрыв в два-три дня, новогодние каникулы больше недели, а три недели без курса означают сломанный загрузчик. Полезно хранить флаг, что значение перенесено, а не получено из источника.
Где спотыкаются
Заполняют пропуски через bfill или интерполяцию. В признаках модели это утечка: в субботу вы используете курс, который стал известен только в понедельник.
Делают ffill по всему фрейму без группировки по валюте, и курс доллара перетекает в соседнюю строку евро. Нужно groupby("currency").ffill().
Держат захардкоженный список праздников. Производственный календарь меняется каждый год и различается по странам, его лучше брать из справочника и обновлять.