Я работаю над этим соревнованием Kaggle как финальным проектом для курса, который я беру, и для этого я пытался скопировать этот ноутбук , но естьфункция, которую он использует, чтобы получить отстающие функции, которые просто используют слишком много памяти для меня.Вот его код:
def lag_feature(df, lags, col):
tmp = df[['date_block_num','shop_id','item_id',col]]
for i in lags:
shifted = tmp.copy()
shifted.columns = ['date_block_num','shop_id','item_id', col+'_lag_'+str(i)]
shifted['date_block_num'] += i
df = pd.merge(df, shifted, on=['date_block_num','shop_id','item_id'], how='left')
return df
После неудачного запуска с его кодом я сделал несколько небольших изменений, чтобы попытаться уменьшить использование памяти, и я начал использовать Google Colab, потому что он имеет больше памяти, чем мой ноутбук, поэтому здесьмой код:
def lag_feature(df, lags, col):
df = dd.from_pandas(df, chunksize=1000)
tmp = df[['date_block_num','shop_id','item_id',col]]
for i in lags:
shifted = tmp[tmp.date_block_num + i <= 34].copy()
shifted.columns = ['date_block_num','shop_id','item_id', col+'_lag_'+str(i)]
shifted['date_block_num'] += i
df = dd.merge(df, shifted, on=['date_block_num','shop_id','item_id'], how='left')
return df.compute()
Но все еще использует слишком много памяти, дошло до того, что мой код использовал 10 ГБ памяти, которую Google предлагает для вызова этой функции
sales_train = lag_feature(sales_train, [1, 2, 3, 12, 20], 'item_cnt_month')
есть ли способы уменьшить использование памяти?Просто чтобы показать, что это мой фрейм данных:
Int64Index: 2829445 entries, 0 to 3134798
Data columns (total 8 columns):
date object
date_block_num int8
item_cnt_day float16
item_id int16
item_price float16
shop_id int8
item_cnt_month float16
item_category_id int8
dtypes: float16(3), int16(1), int8(3), object(1)
memory usage: 152.9+ MB
Просто чтобы добавить больше информации, в столбце date_block_num хранится число, которое определяет, в каком месяце произошла эта функция, и я пытаюсь получить несколькоданные за предыдущий месяц в эту строку.Итак, если у меня была задержка 1, это означает, что я хочу получить данные за месяц назад для каждого продукта в моем фрейме данных и добавить их в другой столбец с именем «feature_lag_1».Например, с этим фреймом данных:
date date_block_num item_cnt_day item_id item_price shop_id \
0 14.09.2013 8 1.0 2848 99.0 24
1 14.09.2013 8 1.0 2848 99.0 24
2 14.09.2013 8 1.0 2848 99.0 24
3 01.09.2013 8 1.0 2848 99.0 24
4 01.09.2013 8 1.0 2848 99.0 24
item_cnt_month item_category_id
0 2.0 30
1 2.0 30
2 2.0 30
3 2.0 30
4 2.0 30
и вызовом этой функции:
sales_train = lag_feature(sales_train, [1], 'item_cnt_month')
Я хочу этот вывод:
date date_block_num item_cnt_day item_id item_price shop_id \
0 14.09.2013 8 1.0 2848 99.0 24
1 14.09.2013 8 1.0 2848 99.0 24
2 14.09.2013 8 1.0 2848 99.0 24
3 01.09.2013 8 1.0 2848 99.0 24
4 01.09.2013 8 1.0 2848 99.0 24
item_cnt_month item_category_id item_cnt_month_lag_1
0 2.0 30 3.0
1 2.0 30 3.0
2 2.0 30 3.0
3 2.0 30 3.0
4 2.0 30 3.0