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

基于DataFrame中的预测需求计算最优订货批量的Python技术问询

基于DataFrame中的预测需求计算最优订货批量的Python技术问询

嘿,我来帮你搞定这个最优订货批量的计算问题!首先咱们得把你的预测数据规整好,然后根据需求波动情况选合适的库存模型——下面我会用Python代码一步步演示常用的几种方法,你可以根据自己的实际运营数据(比如订货成本、持有成本)调整参数。


第一步:规整预测数据

先把你给出的时间序列预测数据加载成Pandas DataFrame,方便后续计算:

import pandas as pd
import numpy as np

# 导入你的预测需求数据
prediction_data = {
    'date': ['2016-06-30', '2016-07-31', '2016-08-31', '2016-09-30', '2016-10-31',
             '2016-11-30', '2016-12-31', '2017-01-31', '2017-02-28', '2017-03-31',
             '2017-04-30', '2017-05-31', '2017-06-30', '2017-07-31', '2017-08-31',
             '2017-09-30', '2017-10-31', '2017-11-30', '2017-12-31', '2018-01-31',
             '2018-02-28', '2018-03-31', '2018-04-30', '2018-05-31', '2018-06-30',
             '2018-07-31', '2018-08-31', '2018-09-30', '2018-10-31', '2018-11-30',
             '2018-12-31', '2019-01-31', '2019-02-28', '2019-03-31'],
    'demand_forecast': [3196.276292, 2963.649104, 2695.774926, 2595.090061, 2963.573648,
                       2767.602512, 2947.536752, 2907.608736, 3101.192581, 3105.799599,
                       3192.416920, 3260.181956, 3196.769778, 3546.028570, 2854.070753,
                       3234.990407, 3021.252371, 3129.856535, 2967.641519, 3089.990677,
                       2713.715199, 3014.362837, 3219.258500, 3212.581639, 3473.809863,
                       3309.952544, 2991.958277, 2948.191574, 3247.865622, 3087.890549,
                       3227.388069, 3206.638691, 3332.874030, 3372.4684]
}

df = pd.DataFrame(prediction_data)
df['date'] = pd.to_datetime(df['date'])

第二步:选择适合的订货批量模型

1. 经济订货批量(EOQ)——需求相对稳定时用

EOQ是最经典的批量模型,基于恒定需求、固定订货成本、固定持有成本的假设,公式为:
EOQ = √[(2×年需求量×单次订货成本) / 单位年持有成本]

代码实现(示例参数需替换为你的实际运营数据):

# 计算月平均需求,推导年需求
monthly_avg_demand = df['demand_forecast'].mean()
annual_demand = monthly_avg_demand * 12

# 替换为你的实际值:单次订货固定成本S,单位商品年持有成本H
S = 100  # 示例:每次订货花100元手续费/物流费
H = 5    # 示例:每单位商品一年持有成本5元

# 计算EOQ
eoq = np.sqrt((2 * annual_demand * S) / H)
print(f"经济订货批量(EOQ):{round(eoq, 2)} 单位")

2. Silver-Meal动态批量模型——需求波动时用

如果你的月需求波动明显(比如数据里从2595到3546的波动),Silver-Meal方法更合适:它会计算每次订货覆盖多少个周期,让单位时间的平均成本(订货+持有)最低。

代码实现:

def silver_meal_calculator(demand_list, order_cost, holding_cost_per_period):
    """
    计算Silver-Meal动态订货批量
    :param demand_list: 各周期需求列表
    :param order_cost: 单次订货成本
    :param holding_cost_per_period: 单位商品单周期持有成本
    :return: 各批次订货量列表
    """
    num_periods = len(demand_list)
    order_qtys = []
    current_period = 0
    
    while current_period < num_periods:
        min_avg_cost = float('inf')
        best_end_period = current_period
        
        for end_period in range(current_period, num_periods):
            # 计算从current_period到end_period的总成本
            holding_cost = holding_cost_per_period * sum(
                demand_list[k] * (k - current_period) for k in range(current_period + 1, end_period + 1)
            )
            total_cost = order_cost + holding_cost
            avg_cost_per_period = total_cost / (end_period - current_period + 1)
            
            if avg_cost_per_period < min_avg_cost:
                min_avg_cost = avg_cost_per_period
                best_end_period = end_period
            else:
                # 成本开始上升,停止扩展周期
                break
        
        # 计算该批次的订货量
        batch_qty = sum(demand_list[current_period:best_end_period + 1])
        order_qtys.append(round(batch_qty, 2))
        current_period = best_end_period + 1
    
    return order_qtys

# 单周期(月)持有成本 = 年持有成本 / 12
h_per_month = H / 12
# 提取所有月需求
demand_list = df['demand_forecast'].tolist()

# 计算动态订货批量
dynamic_order_qtys = silver_meal_calculator(demand_list, S, h_per_month)

print("\nSilver-Meal动态订货批量结果:")
for idx, qty in enumerate(dynamic_order_qtys, 1):
    print(f"第{idx}批订货量:{qty} 单位")

3. 带安全库存的EOQ——应对需求不确定性

如果需要保证一定的服务水平(比如95%的概率不缺货),可以在EOQ基础上加上安全库存:

  • 安全库存 = Z值 × 需求标准差 × √提前期
  • Z值:对应服务水平(比如95%服务水平取1.645,99%取2.33)
  • 提前期:从下单到到货的时间(比如1个月)

代码实现:

# 计算需求标准差
demand_std = df['demand_forecast'].std()
# 提前期(月)
lead_time = 1
# 95%服务水平对应的Z值
Z = 1.645

# 计算安全库存
safety_stock = Z * demand_std * np.sqrt(lead_time)
# 再订货点 = 提前期需求 + 安全库存
reorder_point = monthly_avg_demand * lead_time + safety_stock

print(f"\n安全库存(95%服务水平):{round(safety_stock, 2)} 单位")
print(f"再订货点:{round(reorder_point, 2)} 单位")
print(f"建议订货策略:库存降到{round(reorder_point,2)}时,按EOQ({round(eoq,2)})补货")

关键提示

所有模型的核心依赖实际的订货成本S和持有成本H,这两个参数需要你从企业运营数据中获取(比如每次订货的物流、人工成本,仓储的租金、损耗成本等)。如果没有准确值,可以先做敏感性分析,测试不同S和H下的结果。

备注:内容来源于stack exchange,提问作者lili80

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 09:58:00