Распределение заказов по ресурсам, объединяющим два кадра данных PythonPython

Программы на Python
Ответить
Anonymous
 Распределение заказов по ресурсам, объединяющим два кадра данных Python

Сообщение Anonymous »

У меня вопрос по фрейму данных. У меня есть два кадра данных. 1-й фрейм данных содержит сведения о заказах, а 2-й фрейм данных содержит сведения о катушках. Мне нужно назначить заказы катушкам, чтобы удовлетворить спрос на заказы. Каждый заказ имеет минимальный и максимальный диапазон веса рулонов, поэтому при распределении заказов мне необходимо поддерживать минимальные и максимальные тонны. Например, скажем, в заказе требуется 14 тонн, а минимальный и максимальный диапазон составляет 10 и 14 соответственно, доступный вес рулонов составляет 24, тогда мне нужно разделить рулоны по 24 тонны на две части, по 12 в каждой, а затем из одной 12, Я назначу 12, а затем, начиная со 2-х 12, я назначу 2, чтобы удовлетворить потребность в 14. Мой 1-й кадр данных (порядок обозначает уникальные идентификаторы заказов)

Код: Выделить всё

     order   bct  TOP_MIN_COIL_WT  TOP_MAX_COIL_WT  demand
0     o1  bct2                3               25    12.000
1     o2  bct2                3               25    11.340
2     o3  bct2                3               25    9.460
3     o4  bct2                3               25    6.540
4     o5  bct1                4                7    51.000
5     o6  bct1                5                7    51.000
6     o7  bct1                3                5    34.000
7     o8  bct1                3                5    22.260
8     o9  bct1                4                6    17.000
9    o10  bct1                5                7    17.000
10   o11  bct1                3                5    17.000
11   o12  bct1                4                7    6.605
Вторая ферма данных (mc обозначает уникальный номер катушки)

Код: Выделить всё

     mc   bct  coiltons
0    c1  bct2     24.45
1    c2  bct2     24.10
2    c3  bct1     17.08
3    c4  bct1     17.04
4    c5  bct1     17.03
5    c6  bct1     17.01
6    c7  bct1     16.98
7    c8  bct1     16.98
8    c9  bct1     15.88
9   c10  bct1     15.76
10  c11  bct1     15.72
11  c12  bct1     15.65
12  c13  bct1     15.59
13  c14  bct1     13.16
14  c15  bct1     13.14
Чтобы решить проблему разделения, я определил функцию. Я написал код, но распределение происходит неправильно. Также обратите внимание, что мы можем удовлетворить более чем потребность (дополнительно 10%) для полного использования катушки. Мой код ниже

Код: Выделить всё

import numpy as np
import pandas as pd

def splitNumber(n, a, b):
if n < a or n < b:
return 1
lb = int(np.floor(n/a))
ub = int(np.floor(n/b))
for i in range(ub, lb+1):
s = n/i
if (s > a) and (s < b):
return i
return 1

outputRows = []
for index, row in dfo.iterrows():
order = row['order']
bct = row['bct']
minton = row['TOP_MIN_COIL_WT']
maxton = row['TOP_MAX_COIL_WT']
dem = row['demand']

matchedcoil = dfmc[dfmc['bct'] == bct]

for index, row in matchedcoil.iterrows():
coil = row['mc']
coilt = row['coiltons']
if (coilt > minton) and (coilt < maxton):
alloc = min(dem, coilt)
outputRows.append([order, bct, coil, alloc, coilt, 0])
dem = dem - alloc
coilt = coilt - alloc
dfmc.at[index, 'coiltons'] = coilt
if dem == 0:
break
else:
noParts = splitNumber(coilt, minton, maxton)
if noParts > 0:
alloc = min(dem, coilt / noParts)
for part in range(1, noParts + 1):
outputRows.append([order, bct, f"{coil}_{part}", alloc, coilt, 1])
dem = dem - alloc
coilt = coilt - alloc
dfmc.at[index, 'coiltons'] = coilt
if dem == 0:
break

outputColumns = ['order', 'typebc', 'coil', 'allocatedQuantity', 'ton', 'flag']
df_output = pd.DataFrame(outputRows, columns=outputColumns)
Пожалуйста, помогите.

Подробнее здесь: https://stackoverflow.com/questions/792 ... -dataframe
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»