python
January 21, 2023

Инструмент для удобной отладки кода

Легким способом выявления внутренних неочевидных ошибок программы является использование инструкции assert. Она получает условие, при нарушении которого инициирует вызов исключения AssertionError. При этом вторым параметром опционально assert передается сообщение, которое появится на экране при возникновении исключения. Синтаксис такой:

assert условие, сообщение

Мой опыт работы с моделями машинного обучения свидетельствует об очень частой ошибке из-за разногласия дат. Допустим, программа настроена на запуск в текущем месяце для предсказания результатов на будущий период. Однако на практике при отладке кода данное условие рано или поздно нарушится (например, когда вы будете исследовать расчеты за прошлые периоды), и признаки для матрицы предсказаний будут еще не готовы (кстати, для этого текущий период я задаю параметром и меняю на прошлые значения, если надо). В этом случае у вас слетит прогноз и появится ошибка с непонятным описанием, и вы будете недоумевать, как вчера или на прошлой неделе все запускалось, а сегодня уже нет (однако сегодня - это следующий месяц или новый год). Если же снабдить код инструкцией assert вы поймете, в чем проблема:

import pandas as pd
from datetime import datetime

cur = datetime.now().strftime('%Y-%m')
pred_df = pd.DataFrame([['id1', 2, '2022-12'], ['id2', 1, '2022-01']], columns=['id', 'val', 'mon'])

assert pred_df[pred_df.mon==cur].shape[0]!=0, f' Текущий месяц {cur}, данные для предказаний отсутствуют' 

Если месяц поменять на прошлый, то исключение не возникнет:

cur = '2022-12'
assert pred_df[pred_df.mon==cur].shape[0]!=0, f' Текущий месяц {cur}, данные для предказаний отсутствуют'

Таким образом, assert является емким и удобным способом (в отличие от if/else) пометки мест, в которых могут возникнуть проблемы. Делайте это и быстрее находите ошибки в своем коде.