ERP企业资源计划 用python实现制作MPS报表

ERP企业资源计划 用python实现制作MPS报表

    • 运行环境
    • 题目
        • 导入模块
        • 用例1
        • 用例2
        • 显示制作结果
      • 代码实现

运行环境

用pandas实现
运行:jupyter notebook

题目

编写自行车ZXCA-G 的 MPS,编写 MPS 的日期是2011年10月12日,现有库存量为150,安全库存量为50,生产批量为200,批量增量为200,提前期为1个时段,库存初值为150。

导入模块

import pandas as pd
import numpy as np

用例1

# 现有库存量
now_stock = 150
# 安全库存量
safe_stock = 50
# 生成批量
product_batch = 200
# 批量增量
batch_increment = 200
# 提前期
pre_date = "1个时段"
# 预测量
pre = [150,150,150,150,160,160,160,200,200,200]
# 订单量
order = [160,170,180,130,170,160,150,190,200,210]

用例2

# 现有库存量
now_stock = 120
# 安全库存量
safe_stock = 20
# 生成批量
product_batch = 160
# 批量增量
batch_increment = 160
# 提前期
pre_date = "1个时段"
# 预测量
pre = [70,70,70,70,70,80,80,80,80,80]
# 订单量
order = [100,90,80,60,70,90,50,100,90,70]

显示制作结果

ERP企业资源计划 用python实现制作MPS报表_第1张图片

代码实现

# 定义DataFrame
df = pd.DataFrame(index=["预测量", "订单量", "毛需求量", "PAB初值", "净需求值", "计划产出量", "PAB", "计划投入量", "ATP"], 
                 columns=[1,2,3,4,5,6,7,8,9,10])
df.columns = [["需求时区", "需求时区", "计划时区", "计划时区", "计划时区", "计划时区", "预测时区", "预测时区", "预测时区", "预测时区"], 
            [1,2,3,4,5,6,7,8,9,10]]
df.columns.names = ["时区", "时段"]

# 预测量、订单量 赋值
df.loc["预测量"] = pre
df.loc["订单量"] = order
# 插入当期列
df.insert(0,'当期',["" for i in range(9)])
# 插入附表
df.insert(11,'----',"")
df.insert(12,'-----------------',["现有库存量", "安全库存量", "生成批量", "批量增量", "提前期"]+["" for i in range(4)])
df.insert(13,'--------',[now_stock, safe_stock, product_batch, batch_increment, pre_date]+["" for i in range(4)])
df.loc["毛需求量", "需求时区"] = list(df.loc["订单量", "需求时区"])
df.loc["毛需求量", "计划时区"] = [max(list(df.loc["订单量", "计划时区"])[i],list(df.loc["预测量", "计划时区"])[i]) for i in range(len(df.loc["毛需求量", "计划时区"]))]
df.loc["毛需求量", "预测时区"] = list(df.loc["预测量", "预测时区"])
# 当期的PAB初值
df.loc["PAB初值", "当期"] = now_stock

# 保存第一个PAB初值
pre_PAB = df.loc["PAB初值"][0]
# 定义列表用来保存各个时段的 [PAB初值、净需求值、计划产出量、PAB]
values = [[pre_PAB, "", "", ""]]

for i in range(10):
    # 一个时段的[PAB初值、净需求值、计划产出量、PAB]
    value = [] 
    # 计算 PAB初值,并追加到list
    PAB_start = pre_PAB - df.loc["毛需求量"][i+1]
    value.append(PAB_start)
    # 如果 PAB初值 >= 安全库存量
    if PAB_start>=safe_stock:
        #将 净需求值、计划产出量 都置为0,并追加到列表
        value.append(0)
        value.append(0)
        # 由于 计划产出量 = 0,PAB=PAB初值,追加到列表
        PAB = PAB_start
        value.append(PAB)
        # 保存PAB,用于下一时段的计算
        pre_PAB = PAB
    # 如果 PAB初值 < 安全库存量
    else:
        # 净需求值 = 安全库存量 - PAB初值,追加到列表
        need = safe_stock-PAB_start
        value.append(need)
        # 计划产出量 = N * 生成批量 > 净需求值, 计算并追加到列表
        N = 1
        while N*product_batch<need:
            N += 1
        value.append(N*product_batch)
        # PAB = 上一时段的PAB - 当前时段的毛需求量 + 净需求值, 计算并追加到列表
        PAB = pre_PAB - df.loc["毛需求量"][i+1] + N*product_batch
        value.append(PAB)
        # 保存PAB,用于下一时段的计算
        pre_PAB = PAB
    # 将各个时段的[PAB初值、净需求值、计划产出量、PAB] 追加到大的列表
    values.append(value) 
    
# 矩阵转置list
arrays = np.transpose(values).tolist()
# 计划投入量
plan_input = []
# ATP
ATP = [""]
for i in range(1,11):
    # 计算计划投入量
    # 计划投入量 = 下一时段的 计划产出量
    plan_input.append(arrays[2][i])
    
    # 计算ATP
    # 第一时段的时候:ATP = 计划产出量 + 当期的PAB初值 - 订单量
    if i == 1:
        n = int(arrays[2][i]) + int(arrays[0][i-1]) - df.loc["订单量"][i]
        ATP.append(str(n))
    # 其他时段
    # 如果 计划产出量 > 0
    elif int(arrays[2][i]) > 0:
        # ATP = 计划产出量 - 订单量 - 后面衔接时段计划产出量为0的订单量
        n = int(arrays[2][i]) - df.loc["订单量"][i]
        # 最后时段,ATP = 计划产出量 - 订单量
        if i==10:
            ATP.append(str(n))
        # 非最后时段:如果衔接的后时段的计划产出量 = 0,再减去订单量
        else:
            j = i+1
            while int(arrays[2][j]) == 0:
                n = n - df.loc["订单量"][j]
                j += 1
            ATP.append(str(n))
    # 如果 计划产出量 = 0
    else:
        ATP.append("")
# 计划投入量的最后时段赋为0
plan_input.append(0)
# 拼接到最后的列表当中
arrays.append(plan_input)
arrays.append(ATP)

# 将求出的结果赋值到 DataFrame 中
df.loc[["PAB初值","净需求值","计划产出量","PAB","计划投入量","ATP"],["当期","需求时区","计划时区","预测时区"]] = arrays
# 显示 DataFrame
df

你可能感兴趣的:(ERP)