我有一个像这样的数据集:
SKU,Date,Inventory,Sales,Incoming
2010,2017-01-01 0:00:00,85,126,252
2010,2017-02-01 0:00:00,382,143,252
2010,2017-03-01 0:00:00,414,139,216
2010,2017-04-01 0:00:00,468,120,216
7770,2017-01-01 0:00:00,7,45,108
7770,2017-02-01 0:00:00,234,64,216
7770,2017-03-01 0:00:00,160,69,36
7770,2017-04-01 0:00:00,150,50,72
7870,2017-01-01 0:00:00,41,29,36
7870,2017-02-01 0:00:00,95,18,36
7870,2017-03-01 0:00:00,112,16,36
7870,2017-04-01 0:00:00,88,19,0
库存数量是“实际”记录的数量,可能与我要计算的假设剩余数量有所不同。
销售数量实际上可以延长到未来更长的时间。在这些行中,其他两列将具有NA。
我要创建以下内容:
仅采用每个SKU的第一个Inventory
值
使用第一个值通过使用递归公式[Earliest inventory] - [Sales for that month] - [Incoming qty for that month]
计算假设的剩余量(注意:Earliest inventory
是每个SKU的固定量)。将输出存储在名为“月末第1部分”的列中。
使用以下条件创建另一个称为“购买数量”的列:如果剩余数量少于50,则创建一个新列以指示购买数量(假设所有3个SKU为30)数量减少30)。如果剩余数量大于50,则购买数量为零。
创建另一个名为“月末第2部分”的列,为“月末第1部分”添加“购买数量”
我可以使用以下代码获取每个SKU的第一个数量,并将其合并到数据集中的名为first_qty
的列中
first_qty_series = dataset.groupby(by=['SKU']).nth(0)['Inventory']
first_qty_series = pd.DataFrame(dataset).reset_index().rename(columns={'Inventory': 'Earliest inventory'})
dataset = pd.merge(dataset, pd.DataFrame(first_qty_series), on='SKU' )
对于剩余数量,我考虑过在两列dataset['Sales']
和dataset['Incoming']
上使用cumsum(),但是我认为这将不起作用,因为cumsum()将对所有SKU求和。
这就是为什么我认为我需要在groupby中执行计算。但是我不知道该怎么办。
谢谢你们!
答案 0 :(得分:0)
这是一种处理所需的4列的方法。
1-另一种方法,使用loc
和drop_duplicates
用“库存”中的值填充每个“ SKU”的第一行,然后使用ffill
填充以下内容行,但是您的方法很好。
dataset.loc[dataset.drop_duplicates(['SKU']).index,'Earliest inventory'] = dataset['Inventory']
dataset['Earliest inventory'] = dataset['Earliest inventory'].ffill().astype(int)
2-实际上,您需要cumsum
和groupby
来创建“月末第1部分”列,而不是在“最早的库存”列上,因为对于某列,每一行的值都相同相同的“ SKU”。注意:根据您的结果(和逻辑),我在“传入”列之前将-
更改为+
,如果我误解了问题,只需更改符号即可。
dataset['End of Month Part 1'] = (dataset['Earliest inventory']
- dataset.groupby('SKU')['Sales'].cumsum()
+ dataset.groupby('SKU')['Incoming'].cumsum())
3-可以再次使用loc
来实现“购买数量”列,该条件再次满足“月末第1部分”列中值小于50的条件,然后满足fillna
且值为0
dataset.loc[dataset['End of Month Part 1'] <= 50, 'Buy Quantity'] = 30
dataset['Buy Quantity'] = dataset['Buy Quantity'].fillna(0).astype(int)
4-最后,最后一列只是添加创建的两个鞋last
dataset['End of Month Part 2'] = dataset['End of Month Part 1'] + dataset['Buy Quantity']
如果我对这4点很了解,则应该使用新列获取数据集