Python Pandas:按分组偏移日期块生成滞后销量特征
为item_id/shop_id组合生成前序日期块的销量滞后特征
核心问题在于原数据集可能存在item_id/shop_id组合在部分date_block_id无记录的情况,直接分组偏移会跳过缺失的日期块,导致滞后值对应错误。以下是可靠的解决方案(基于Pandas):
步骤1:补全所有可能的组合
先构建item_id、shop_id、date_block_id的完整笛卡尔积,确保每个组合在所有日期块都有记录,缺失的销量填充0:
import pandas as pd # 假设你的原始数据集名为df # 获取所有唯一值 unique_items = df['item_id'].unique() unique_shops = df['shop_id'].unique() unique_dates = df['date_block_id'].unique() # 创建全量多索引 full_index = pd.MultiIndex.from_product( [unique_items, unique_shops, unique_dates], names=['item_id', 'shop_id', 'date_block_id'] ) # 对齐原数据,缺失销量补0 full_df = df.set_index(['item_id', 'shop_id', 'date_block_id'])\ .reindex(full_index, fill_value=0)\ .reset_index()
步骤2:分组计算滞后特征
按item_id和shop_id分组,先确保日期块有序,再用shift(1)获取前一个日期块的销量,最后将空值(第一个日期块无前序)填充为0:
# 按组合和日期排序,保证偏移顺序正确 full_df = full_df.sort_values(['item_id', 'shop_id', 'date_block_id']) # 生成lag1特征 full_df['lag1_items_sold'] = full_df.groupby(['item_id', 'shop_id'])['items_sold'].shift(1).fillna(0)
可选:对齐回原始数据集
如果只需要保留原始数据中存在的行,可通过合并筛选:
final_df = df.merge( full_df[['item_id', 'shop_id', 'date_block_id', 'lag1_items_sold']], on=['item_id', 'shop_id', 'date_block_id'], how='left' )
常见问题排查
- 若之前尝试失败,大概率是未补全缺失的日期块:直接分组shift只会在现有行之间偏移,比如某组合在date_block=2无记录,那么date_block=3的lag值会取date_block=1的销量,而非预期的0。
- 务必确保分组后按
date_block_id排序,否则偏移逻辑会混乱。
内容的提问来源于stack exchange,提问作者Henkie
相关产品推荐
相关产品推荐

