Я новичок в кодировании и ищу питонский способ реализации следующего кода.Вот примерный кадр данных с кодом:
np.random.seed(1111)
df2 = pd.DataFrame({
'Product':np.random.choice( ['Prod 1','Prod 2','Prod 3', 'Prod 4','Prod 5','Prod 6','Box 1','Box 2','Box 3'], 10000),
'Transaction_Type': np.random.choice(['Produced','Transferred','Scrapped','Sold'], 10000),
'Quantity':np.random.randint(1,100, size=(10000)),
'Date':np.random.choice( pd.date_range('1/1/2017','12/31/2018',
freq='D'), 10000)})
idx = pd.IndexSlice
В наборе данных каждый «ящик» («Ящик 1», «Ящик 2» и т. Д.) Является сырьем, которое соответствует нескольким продуктам.Например, «Box 1» используется для «Prod 1» и «Prod 2», «Box 2» используется для «Prod 3» и «Prod 4», а «Box 3» используется для «Prod 5» &«Прод 6».
Набор данных, с которым я работаю, намного больше, но у меня эти наборы данных хранятся в виде списков, например, у меня 'Box 1' = ['Prod 1', 'Prod 2', 'Prod3' ].При необходимости я мог бы хранить в виде словаря с кортежем типа Box1 = {'Box 1' :( 'Prod 1', 'Prod 2') - что угодно, что лучше.
Для каждой группы я рассчитываю рассчитать общее количество используемых ящиков, которое является суммой произведенных + списанных запасов.Чтобы получить это значение, в настоящее время я делаю ручной фильтр по группам каждого продукта и вручную.Вы можете видеть, что я вручную пишу список продуктов в качестве второго оператора присваивания.
Например, чтобы подсчитать, сколько «Бокса 1» необходимо извлечь из инвентаря, каждый месяц вы должны суммировать значения «Бокса 1», которые были произведены и сданы на слом.Затем вы должны рассчитать значения от «Prod 1» до «Prod 3» (поскольку они используют «Box 1»), которые были произведены и сданы в лом, и сложить их все вместе, чтобы получить общее значение «Box 1», использованное и утилизированное для каждого разаРамка.Вот пример того, что я сейчас делаю:
box1 = ['Box 1','Prod 1','Prod 2']
df2[df2['Transaction_Type'].isin(['Produced','Scrapped'])].groupby([pd.Grouper(key='Date',freq='A' ),'Product','Transaction_Type']).agg({'Quantity':'sum'})\
.unstack()\
.loc[idx[:,box1],idx[:]]\
.assign(Box_1 = lambda x: 'Box 1')\
.assign(List_of_Products = lambda x: 'Box 1, Prod 1, Prod 2')\
.reset_index()\
.set_index(['Box_1','List_of_Products','Date','Product'])\
.groupby(level=[0,1,2]).sum()\
Затем я должен был бы выполнить то же самое неуклюжее ручное то же упражнение для «Коробки 2» и т. Д.
Есть либолее питонический способ?Я хотел бы завершить этот анализ каждый месяц вперед.Фактические данные намного сложнее, примерно с 20 различными «блоками», которые имеют различное количество продуктов, связанных с каждым.Я не уверен, стоит ли мне искать создание функции или использовать словарь или списки, но я был бы признателен за любую помощь на этом пути.В качестве последнего запроса я хотел бы иметь возможность записать каждый из этих «Box_1» на другой лист Excel.
Заранее спасибо!