Я работаю над проблемой Kaggle для прогнозирования будущих продаж на основе временных рядов, представляющих исторические продажи. Более конкретно, входные данные состоят из записей, каждая из которых представляет продажи некоторого товара в каком-то магазине для определенного месяца , имеющего следующие поля:
- shop_id: указывает, какой магазин
- item_id: указывает, какой тип товара
- date_block_num: указывает, в каком месяце произошли продажи (0-33)
- item_cnt_month : Продажи в "shop_id" для "item_id" во время "date_block_num"
Проблема состоит в том, чтобы предсказать для каждого shop_id / item_id, каким будет его item_cnt_month для date_block_num 34. Чтобы сделать это, я хотите построить модель, которая использует в качестве функций shop_id, item_id и отстающие значения от item_cnt_month. Например, для ввода
{ shop_id:52, item_id:8201, date_block_num:23, item_cnt_month: 3.0 }
я хочу, чтобы (обучающие) функции были:
{ shop_id:52, item_id:8201, date_block_num:23,
item_cnt_month_lag_1:<item_cnt_month for month 22>,
item_cnt_month_lag_2:<item_cnt_month for month 21>,
...
}
, а тестовая функция была { item_cnt_month:3.0 }
I написал следующий код для генерации функций, в том числе item_cnt_month_lag_<n>
, на основе входных данных и списка лагов:
def create_lagged_columns( sales_train, lags, value_column ):
for lag in lags:
lagged_column = value_column + "_lag_" + str( lag )
temp = sales_train[ [ "date_block_num", "shop_id", "item_id", value_column ] ]
temp[ "date_block_num" ] += lag
temp = temp.rename( columns = { value_column : lagged_column } )
sales_train = sales_train.merge( temp, on = [ "date_block_num", "shop_id", "item_id" ], how = "left" )
return sales_train
Поскольку я с подозрением относился к этой логике c (будучи Python newb), я написал отдельную процедуру проверки, которая пересчитывает отстающие функции для случайно выбранных строк, используя другой последовательный метод. К моему огорчению, я обнаружил, что при проверке 1000 строк на 5 значений запаздывания я обнаружил 401 несоответствие, все из которых указывали, что значение, рассчитанное с помощью приведенного выше кода, было> 0, а значение, рассчитанное проверкой рутина была 0. Каким-то образом оказалось, что некоторые фиктивные значения проникли в результаты create_lagged_columns
. После одного дня расследования я обнаружил, что было не так, но мне стало интересно, о чем это.
Проблема заключается в следующем: Предположим, вы работаете с входной записью, у которой есть date_block_num (месяц) из 7, и предположим, что лаги {1,2,3,6,12}. В этом случае функции для этой записи не будут иметь действительного item_cnt_month_lag_12 (который должен был бы прийти из data_block_num -5).
Итак, я решил, что после вычисления функций для ВСЕХ входных строк я будет отбрасывать результаты для строк с date_month_block меньше, чем максимальная задержка. Вот этот код:
sales_train = create_lagged_columns( sales_train, item_cnt_month_lags, "item_cnt_month" )
sales_train = sales_train.loc[ sales_train[ "date_block_num" ] >= max_lag, : ]
sales_train = sales_train.reset_index( drop = True )
Что я обнаружил, так это то, что если я удалил второе утверждение, которое выбирает только те строки, которые имеют достаточно поздний date_block_num, чтобы получить их полное дополнение к лагам, моя процедура проверки больше не жаловалась ! Я тоже с подозрением относился к третьему утверждению, поэтому попробовал его с reset_index
и без него, но это, казалось, не имело никакого значения, только второе утверждение.
Итак (наконец-то!) Я озадачен. Я делаю что-то с этим вторым утверждением, которое путает вещи таким образом, чтобы объяснить проблему, с которой я столкнулся? Если это так, я на самом деле не понимаю DataFrames или Pandas очень необычно.
Может кто-нибудь объяснить, пожалуйста?