You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 05:55:16