【问题标题】:Function to allocate a changing proportion分配变化比例的功能
【发布时间】:2019-10-23 18:40:01
【问题描述】:

原材料,钢板,以矩形板的形式购买

制造的零件是钢板的圆形切割,但零件要求和成本计算基于正方形,零件直径 = 正方形长度和宽度

生产中消耗的印版总量按比例分配给生产的工作/零件

圆形和方形的SQIN差异以及板的嵌套效率/低效率影响分配

库存是根据测量单位、长度和宽度发出的。

我们的 ERP 系统无法有效地按比例分配库存。手动计算用于“菊花链”分配库存。完整的钢板分配给一个作业,不需要的部分从作业分配回库存,并且这个过程会针对与钢板相关的每个作业/项目重复进行。

此过程效率低下且容易出错。我正在尝试提出自动化此过程或至少自动化计算以减少错误所需的逻辑。我遇到的问题是我的分配使发放的金额偏向计算的第一个工作。基本上随着计算每个作业后返回库存的板材百分比减少,分配给下一个作业的库存百分比也减少

import pandas as pd

# Dimensions of a steel plate and the portions that will consumed in 
# production and returned to inventory
plateLength = 480
plateWidth = 96
plateSQIN = plateLength * plateWidth

plateReturnedLength = 60
plateReturnedWidth = 45
plateReturnedSQIN = plateReturnedLength * plateReturnedWidth

consumedLength = plateLength - plateReturnedLength
consumedWidth = plateWidth - plateReturnedWidth
consumedSQIN = plateSQIN - plateReturnedSQIN

# DataFrame for the job details and material requirements that will be 
# needed for production
data = {'JOB':[128576,128518,128577,128667,128630],
        'Length':[90,90,90,84,36],
        'Width':[90,90,90,84,36],
        'QTY':[1,2,1,1,2]}
layout = pd.DataFrame(data=data)

# Adding calculated values to the DataFrame
layout['REQUIRED'] = (layout['Length'] * layout['Width'])*layout['QTY']
totalRequired = layout['REQUIRED'].sum()

layout['CALC_USE'] = (layout['REQUIRED']/totalRequired) * consumedSQIN
totalUsed = layout['CALC_USE'].sum()

layout['CALC_%'] = layout['REQUIRED'] / totalRequired
totalAllocatedPcnt = layout['CALC_%'].sum()

# Creating DataFrame columns that will be populated by function
layout['I_L'] = None # issue length
layout['I_W'] = None # issue width
layout['R_L'] = None # return length
layout['R_W'] = None # return width
layout['issued'] = None # SQIN issued
layout['issue%'] = None # %of total SQIN issued

# Function for calculating how much material to issue to each job and 
# how much to return to inventory

def issue(data):

    issueLength = plateLength
    issueWidth = plateWidth

    for index, row in layout.iterrows():

        pcnt = data.loc[index,'CALC_%']

        returnLength = issueLength - consumedLength  * pcnt
        returnWidth = issueWidth - consumedWidth  * pcnt

        data.at[index,'I_L'] = round(issueLength,2)
        data.at[index,'I_W'] = round(issueWidth,2)        
        data.at[index,'R_L'] = round(returnLength,2)
        data.at[index,'R_W'] = round(returnWidth,2)

        issueLength = returnLength
        issueWidth = returnWidth

        data[['I_L','I_W','R_L','R_W']] = 
        data[['I_L','I_W','R_L','R_W']].astype(float).round(0)

        data['issued'] = (data['I_L'] * data['I_W']) - 
                         (data['R_L'] * data['R_W'])

    issueTotal = data['issued'].sum()

    data['issue%'] = data['issued']/issueTotal

    return data

# call function and view results
issue(layout)

我需要能够为每个作业计算要发布和返回的长度和宽度,这将生成与基于总需求总和计算的分配百分比相匹配的已发布百分比。

任何关于如何实现这一点的建议将不胜感激

谢谢大家

附言

我还没有将代码格式化为纯粹的复制和粘贴。第 71 行和第 73 行会产生错误,但它是单行代码之间的间距,它被分成两行以便两个适合代码块

【问题讨论】:

    标签: python-3.x pandas math logic


    【解决方案1】:

    只是需要我的老朋友代数的帮助,谢谢大家,我明白了。 改函数如下。

    L * W = SQIN

    L = SQIN / W

    可以通过在每次迭代中将板宽度的总减少量减去线 % 来计算返回宽度。
    返回的 SQIN 可以通过在每次迭代中将发布的 SQIN 减去所需的 SQIN 来计算。

    对于每一行,长度的返回值 = 返回的 SQIN / 返回的宽度

    def issue(data):
    
        issueLength = plateLength
        issueWidth = plateWidth
    
        for index, row in layout.iterrows():
    
            pcnt = data.loc[index,'CALC_%']       
            reqSQIN = pcnt * (consumedSQIN)   
            issueSQIN = issueLength * issueWidth
            returnSQIN = issueSQIN - reqSQIN
    
            if returnSQIN <= 0:
                returnLength = 0
                returnWidth = 0
            else:
                returnWidth = issueWidth - (consumedWidth * pcnt)
                returnLength = returnSQIN/returnWidth
    
            data.at[index,'I_L'] = round(issueLength,2)
            data.at[index,'I_W'] = round(issueWidth,2)        
            data.at[index,'R_L'] = round(returnLength,2)
            data.at[index,'R_W'] = round(returnWidth,2)
    
            issueLength = returnLength
            issueWidth = returnWidth
    
        data[['I_L','I_W','R_L','R_W']] = 
        data[['I_L','I_W','R_L','R_W']].astype(float).round(0)
    
        data['issued'] = (data['I_L'] * data['I_W']) - (data['R_L'] * data['R_W'])
    
        issueTotal = data['issued'].sum()
    
        data['issue%'] = data['issued']/issueTotal
    
        return data
    
    # call function and view results
    issue(layout)
    

    【讨论】:

      猜你喜欢
      • 2021-11-28
      • 1970-01-01
      • 2021-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-26
      • 1970-01-01
      相关资源
      最近更新 更多