Странное Pandas поведение DataFrame после выбора подмножества строк - PullRequest
0 голосов
/ 20 января 2020

Я работаю над проблемой Kaggle для прогнозирования будущих продаж на основе временных рядов, представляющих исторические продажи. Более конкретно, входные данные состоят из записей, каждая из которых представляет продажи некоторого товара в каком-то магазине для определенного месяца , имеющего следующие поля:

  1. shop_id: указывает, какой магазин
  2. item_id: указывает, какой тип товара
  3. date_block_num: указывает, в каком месяце произошли продажи (0-33)
  4. 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 очень необычно.

Может кто-нибудь объяснить, пожалуйста?

...