我 有 三 个 数据 帧 :
- ob ( Orderbook ) - 包含 零件 编号 、 零件 到期 周 数 和 生产 零件 所 需 小时 数 的 订单 。
| 部件 编号|到期 周|构建 小时 数|
| - -| - -| - -|
| A 级|小 行星 2022 - 46|四 个|
| A 级|小 行星 2022 - 46|五 个|
| 乙|小 行星 2022 - 46|八 个|
| C 语言|小 行星 2022 - 47|一 点 六|
- osm ( 操作 员 技能 矩阵 ) - 包含 操作 员 姓名 和 零件 号 的 技能 矩阵
| 操作 员|零件 编号|
| - -| - -|
| Mr.One |A 级|
| Mr.One |乙|
| Mr.Two |A 级|
| Mr.Two |乙|
| 三 太太|C 语言|
- ah ( 可用 小时 数 ) - 包含 操作 员 在 给定 周 内 可 工作 小时 数 的 列表
| 操作 员|年 - 年 - 月|小时 数|
| - -| - -| - -|
| Mr.One |2022 年 至 45 年|四十|
| Mr.One |小 行星 2022 - 46|三十五|
| Mr.Two |小 行星 2022 - 46|三十七|
| Mr.Two |小 行星 2022 - 47|三十九|
| 三 太太|小 行星 2022 - 47|四十|
| 三 太太|小 行星 2022 - 48|四十五|
我 试 着 计算 出 每周 是否 有 足够 的 操作 员 , 有 合适 的 技能 , 工作 足够 的 时间 来 完成 订单 簿 上 的 所有 订单 。 如果 没有 , 找出 无法 完成 的 订单 。
一 步 一 步 看 起来 会 像 这样 :
1.取 订单 簿 第 一 行 的 零件 号 。
1.搜索 技能 矩阵 , 找到 可以 构建 该 部件 的 操作 员 列表 。
1.搜索 工时 表 , 检查 操作 员 在 订单 到期 的 那 一 周 是否 有 可用 的 工时 。
1.如果 操作 员 有 可用 的 小时 数 , 则 将 其 姓名 添加 到 订单 簿 的 该行 。
1.从 Avalible Hours df 中 的 Avalible 小时 数 中 减去 订单 簿 中 的 Build 小时 数 。
1.对 订单 簿 中 的 每 一 行 重复 此 操作 , 直到 所有 订单 都 有 名称 或 没有 剩余 的 可用 小时 数 。
我 唯一 能 想到 的 尝试 是 一 堆 嵌套 的 for 循环 , 但是 由于 有 数千 行 , 完成 一 次 迭代 需要 大约 45 分钟 , 如果 不是 几 周 的 话 , 完成 整个 过程 需要 几 天 。
#for each row in the orderbook
for i, rowi in ob_sum_hours.iterrows():
#for each row in the operator skill matrix
for j, rowj in osm.iterrows():
#for each row in the avalible operator hours
for y, rowy in aoh.iterrows():
if(rowi['Material']==rowj['MATERIAL'] and rowi['ProdYYYYWW']==rowy['YYYYWW'] and rowj['Operator']==rowy['Operator'] and rowy['Hours'] > 0):`
rowy['Hours'] -=rowi['PlanHrs']
rowi['HoursAllocated'] = rowi['Operator']
中 的 每 一 个
最终 结果 如下 所 示 :
| 部件 编号|到期 周|构建 小时 数|操作 员|
| - -| - -| - -| - -|
| A 级|小 行星 2022 - 46|四 个| Mr.One |
| A 级|小 行星 2022 - 46|五 个| Mr.One |
| 乙|小 行星 2022 - 46|八 个| Mr.Two |
| C 语言|小 行星 2022 - 47|一 点 六| Mrs.Three |
有 没有 更 好 的 方法 来 实现 这 一 点 ?
1条答案
按热度按时间ej83mcc01#
每一条线上都有一个线圈。
groupby(Orderbook.index)按索引分组,即my_func遍历每一行,仍然比循环好。
在“aaa”列表中,我们将获得匹配的唯一运算符列表。在“bbb”列表中,筛选可用依据:'YYYYWW'、'Operator'(使用isin作为唯一运算符列表)和'Hours'大于0。进一步在循环中,使用'bbb'索引,我们检查空闲时间,如果'ava'大于零,则使用显式索引loc设置值。
更新18.11.2022我没有周期。但是,你需要检查。如果你发现不正确的地方,请让我知道。你也可以通过在开始处输入以下内容来测量确切的处理时间:
最后打印经过的时间:
代码: