Имеют два кадра данных: машины и требуют следующим образом:
машины
import pandas as pd
import numpy as np
import itertools
dates = pd.Series([d.date() for d in pd.date_range('1/1/2018', periods=4, freq='W')])
sites = pd.Series('TH, ID'.split(','))
product = list('AB')
machine = ['M1', 'M2'] # can have multiple machines per site for a product
machines = pd.DataFrame([e for e in itertools.product(dates, sites, product, machine)],
columns=['Date', 'Site', 'Product', 'Machine'])
machines['Capacity'] = np.random.randint(10, 35, size=len(machines))
machines['Week'] = pd.to_datetime(machines.Date).dt.strftime('%Y-%U')
machines.head()
спрос
s = 'TH, ID, IN'.split(',')
s = s + s[::-1]
demand_days = pd.date_range('1/1/2018', periods=12*7, freq='D')
demand_days
demand = pd.DataFrame([e for e in itertools.product([d.date() for d in demand_days], s, product)],
columns=['Date', 'Site', 'Product'])
demand['Qty'] = np.random.randint(1,50, len(demand))
demand['Week'] = pd.to_datetime(demand.Date).dt.strftime('%Y-%U')
demand.head()
объединено групповой для спрос. Количество показывает:
pd.merge(demand, machines[['Week', 'Site', 'Product', 'Machine', 'Capacity']], on=['Week', 'Site', 'Product']).set_index('Week').groupby(['Week', 'Site', 'Product']).Qty.sum()[:5]
объединено групповой для machine.Capacity показывает:
pd.merge(demand, machines[['Week', 'Site', 'Product', 'Machine', 'Capacity']], on=['Week', 'Site', 'Product']).set_index('Week').groupby(['Week', 'Site', 'Product', 'Machine']).Capacity.sum()[:5]
Как объединить машины и запросить и создать единый кадр данных такой, что:
- , если Qty спроса больше, чемЕмкость первой машины на Сайте, следующая машина заполнена
- Если машин больше не осталось, последняя машина принимает оставшуюся нагрузку (т.е. перегружена)
- В запросе могут быть дополнительные строки