paper2skills Playbook

Demand Forecasting for Supply Chain

Skill-Demand-Forecasting-Supply-Chain · 04-供应链

experimentforecastingpricing供应链与补货定价与利润WF-A 智能补货WF-F 动态定价
年化 ROI30万
实现难度⭐⭐⭐☆☆
业务优先级⭐⭐⭐⭐⭐
业务视角
适用角色供应链负责人 · 采购负责人 · CEO / 运营 VP
适用平台Amazon FBA · 海外仓 · 多国仓位(美/欧/日)
什么情况下用库存周转率低,资金压在海外仓出不来;SKU 断货紧急空运,物流成本吃掉毛利;多仓库存分布不均
成功是什么样的库存周转天数从 90 天降到 60 天,断货率 <3%,海外仓综合成本降低 15-25%
业务痛点
库存周转天数太长资金压死了断货了只能空运救急成本爆了多市场库存分配不均

1. 解决的问题

供应链的需求预测不同于通用时序预测——它必须考虑促销日历、竞品行动、渠道库存、季节性生命周期等商业因素。

2. 核心算法逻辑

核心问题:供应链的需求预测不同于通用时序预测——它必须考虑促销日历、竞品行动、渠道库存、季节性生命周期等商业因素。预测不准的代价是:过高→库存积压,过低→断货丢单。

3. 业务应用场景

业务问题:Momcozy 代理某品牌奶粉在欧洲销售,涉及5个段位×3个规格×4个仓库=60个SKU-仓库组合。需要预测未来4周的周需求量,用于向供应商下采购单( lead time 6周)。

预测流程: 1. 数据准备: - 历史销量:过去104周(2年)的周销量 - 促销日历:黑五、圣诞、复活节、Prime Day - 价格数据:自身价格 + 竞品价格 - 外部数据:Google Trends("baby formula"搜索指数)

2. 特征工程: - 滞后销量:上周、上月同期、去年同期的销量 - 促销特征:是否促销周、促销深度、促销类型 - 生命周期:SKU上市周数(新品效应) - 季节特征:周数、是否节假日

4. 输入数据要求

请查看原始代码模板获取输入规格。

5. 输出结果

请查看原始代码模板获取输出规格。

6. 业务价值 / ROI

  • ROI:缺货率降低50%,库存周转提升50%,年节省库存成本30万+
  • 难度:⭐⭐⭐☆☆(3/5)
  • 优先级:⭐⭐⭐⭐⭐(5/5)— 供应链决策的起点,没有预测就没有优化

7. 代码模板

代码块数量:1 · 路径:未检测到

"""
Demand Forecasting for Supply Chain — 供应链需求预测
支持:分层预测、促销效应建模、多SKU批量预测
"""

import numpy as np
import pandas as pd
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.metrics import mean_absolute_error


class SupplyChainDemandForecaster:
    """供应链需求预测器"""

    def __init__(self, model=None):
        self.model = model or GradientBoostingRegressor(n_estimators=100, max_depth=4)
        self.is_fitted = False

    def build_features(self, df):
        """构建供应链需求预测特征"""
        df = df.copy()
        df = df.sort_values(['sku', 'date'])

        # 滞后特征
        for lag in [1, 2, 4, 12]:
            df[f'sales_lag_{lag}'] = df.groupby('sku')['sales'].shift(lag)

        # 滚动统计
        for window in [4, 12]:
            df[f'sales_ma_{window}'] = df.groupby('sku')['sales'].transform(
                lambda x: x.rolling(window=window, min_periods=1).mean()
            )

        # 促销特征
        if 'is_promo' in df.columns:
            df['promo_depth'] = df.get('discount_rate', 0)
            df['promo_lag_1'] = df.groupby('sku')['is_promo'].shift(1)

        # 季节特征
        df['week_of_year'] = pd.to_datetime(df['date']).dt.isocalendar().week
        df['month'] = pd.to_datetime(df['date']).dt.month
        df['is_holiday'] = df['week_of_year'].isin([47, 48, 49, 50, 51]).astype(int)

        # 价格特征
        if 'price' in df.columns:
            df['price_lag_1'] = df.groupby('sku')['price'].shift(1)
            df['price_change'] = (df['price'] - df['price_lag_1']) / df['price_lag_1']

        return df.dropna()

    def fit(self, df, feature_cols, target_col='sales'):
        """训练模型"""
        df_train = df.dropna(subset=feature_cols + [target_col])
        X = df_train[feature_cols]
        y = df_train[target_col]
        self.model.fit(X, y)
        self.feature_cols = feature_cols
        self.is_fitted = True
        return self

8. 论文来源

未自动抽取;请查看原始 Skill 卡片。