基于两个数据集创建周度库存水平表的技术问询
解决周度库存水平表空值问题的可行方案
一、先统一数据集结构与字段定义
首先修正第二个数据集的列名错误(原列名标注混乱):
- 第一个数据集字段:
Item Number(物品编号)、Date(日期)、Inventory(当日库存结存) - 第二个数据集修正后字段:
Item Number(物品编号)、Date(入库日期)、Total Item Qty(当日入库数量)
二、核心调整思路:补全时间维度,避免空值
直接分组透视出现大量空值的原因是:部分物品在某些周没有数据,导致透视表对应位置缺失。解决关键是先生成完整的周日期序列,再为每个物品补全所有周的记录(无数据则填充0)。
步骤1:生成目标时间范围内的完整周序列
以最早日期2023-06-17为起点,生成3个月内所有周的标识(格式为YYYY-WXX):
import pandas as pd # 定义时间范围 start_date = pd.to_datetime("2023-06-17") end_date = start_date + pd.DateOffset(months=3) # 生成每周一的日期,并转换为周标识 weekly_dates = pd.date_range(start=start_date, end=end_date, freq="W-MON") weekly_labels = weekly_dates.strftime("%Y-W%U")
步骤2:处理数据集,映射周标识
将两个数据集的日期字段转换为对应的周标识:
# 处理第一个数据集(库存结存) df1["Date"] = pd.to_datetime(df1["Date"]) df1["Week"] = df1["Date"].dt.strftime("%Y-W%U") # 处理第二个数据集(入库数量,先修正列名) df2.columns = ["Item Number", "Date", "Total Item Qty"] df2["Date"] = pd.to_datetime(df2["Date"]) df2["Week"] = df2["Date"].dt.strftime("%Y-W%U")
步骤3:生成全量索引,填充空值
通过物品编号和周标识的笛卡尔积,生成所有可能的组合,再将原数据重新索引到这个全量索引上,空值填充为0:
# 获取所有唯一物品编号和周标识 all_items = pd.Series(pd.concat([df1["Item Number"], df2["Item Number"]]).unique(), name="Item Number") all_weeks = pd.Series(weekly_labels, name="Week") # 生成笛卡尔积全量索引 full_index = pd.MultiIndex.from_product([all_items, all_weeks], names=["Item Number", "Week"]) # 分组求和后重新索引,填充空值为0 df1_grouped = df1.groupby(["Item Number", "Week"])["Inventory"].sum().reindex(full_index, fill_value=0) df2_grouped = df2.groupby(["Item Number", "Week"])["Total Item Qty"].sum().reindex(full_index, fill_value=0)
步骤4:计算周度库存并生成透视表
根据业务逻辑计算周度库存(示例为库存结存+当期入库,需根据实际业务调整,比如滚动库存要用上期结存),再生成透视表:
# 合并计算周度库存 weekly_inventory = pd.DataFrame({ "Weekly_Inventory": df1_grouped + df2_grouped }).reset_index() # 生成透视表 pivot_result = weekly_inventory.pivot(index="Item Number", columns="Week", values="Weekly_Inventory")
三、原思路的问题与调整点
原思路(直接分组透视)的问题是没有补全时间维度的缺失值,导致透视表出现大量空值。调整核心:
- 必须先构建完整的周时间序列,确保每个物品都覆盖所有周
- 用笛卡尔积生成全量的物品-周组合,避免数据缺失
- 空值统一填充为0(或符合业务逻辑的默认值)后再做透视
内容的提问来源于stack exchange,提问作者user6541792
相关产品推荐
相关产品推荐

