У меня вопрос по фрейму данных. У меня есть два кадра данных. 1-й фрейм данных содержит сведения о заказах, а 2-й фрейм данных содержит сведения о катушках. Мне нужно назначить заказы катушкам, чтобы удовлетворить спрос на заказы. Каждый заказ имеет минимальный и максимальный диапазон веса рулонов, поэтому при распределении заказов мне необходимо поддерживать минимальные и максимальные тонны. Например, скажем, в заказе требуется 14 тонн, а минимальный и максимальный диапазон составляет 10 и 14 соответственно, доступный вес рулонов составляет 24, тогда мне нужно разделить рулоны по 24 тонны на две части, по 12 в каждой, а затем из одной 12, Я назначу 12, а затем, начиная со 2-х 12, я назначу 2, чтобы удовлетворить потребность в 14. Мой 1-й кадр данных (порядок обозначает уникальные идентификаторы заказов)
Чтобы решить проблему разделения, я определил функцию. Я написал код, но распределение происходит неправильно. Также обратите внимание, что мы можем удовлетворить более чем потребность (дополнительно 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)
У меня вопрос по фрейму данных. У меня есть два кадра данных. 1-й фрейм данных содержит сведения о заказах, а 2-й фрейм данных содержит сведения о катушках. Мне нужно назначить заказы катушкам, чтобы удовлетворить спрос на заказы. Каждый заказ имеет минимальный и максимальный диапазон веса рулонов, поэтому при распределении заказов мне необходимо поддерживать минимальные и максимальные тонны. Например, скажем, в заказе требуется 14 тонн, а минимальный и максимальный диапазон составляет 10 и 14 соответственно, доступный вес рулонов составляет 24, тогда мне нужно разделить рулоны по 24 тонны на две части, по 12 в каждой, а затем из одной 12, Я назначу 12, а затем, начиная со 2-х 12, я назначу 2, чтобы удовлетворить потребность в 14. Мой 1-й кадр данных (порядок обозначает уникальные идентификаторы заказов) [code] 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 [/code] Вторая ферма данных (mc обозначает уникальный номер катушки) [code] 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 [/code] Чтобы решить проблему разделения, я определил функцию. Я написал код, но распределение происходит неправильно. Также обратите внимание, что мы можем удовлетворить более чем потребность (дополнительно 10%) для полного использования катушки. Мой код ниже [code]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