基于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
相关产品推荐
相关产品推荐

