Py学习  »  Python

如何使用python按顺序映射销售和购买?

Meet • 3 年前 • 1181 次点击  

我有一个事务数据框架,如下所示:

     Item  Date        Code   Qty  Price   Value
0    A     01-01-01    Buy    10   100.5   1005.0
1    A     02-01-01    Buy    5    120.0   600.0
2    A     03-01-01    Sell   12   125.0   1500.0
3    A     04-01-01    Buy    9    110.0   990.0
4    A     04-01-01    Sell   1    100.0   100.0
#and so on... there are a million rows with about thousand items (here just one item A)

我想要的是以先进先出的顺序方式,将每个销售交易与购买交易进行映射。因此,最先购买的商品将首先售罄。

为此,我添加了一个新专栏 bQty 期初余额与采购数量相同。然后,我迭代每个销售交易的数据帧,以在该日期之前将销售数量与购买交易进行对比。

df['bQty'] = df[df['Code']=='Buy']['Quantity']
for each in df[df['Code']=='Sell']:
    for each in df[(df['Code']=='Buy') & (df['Date'] <= sellDate)]:
        #code#

现在,这需要我一遍又一遍地检查每个销售交易的整个数据帧。

对于1000条记录,大约需要10秒才能完成。所以,我们可以假设,对于一百万条记录来说,这种方法需要很多时间。

有没有更快的方法?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/131444
 
1181 次点击  
文章 [ 1 ]  |  最新文章 3 年前
Arne
Reply   •   1 楼
Arne    3 年前

如果您只对每个项目的最终余额值感兴趣,这里有一种快速计算方法:

添加另外两列,其中包含与相同的绝对值 Qty Value ,但在 Code 价值是 Sell 。然后你可以按项目分组,并对每个项目的这些值求和,以得到剩余的项目数和余额。

sale = df.Code == 'Sell'

df['Qty_signed'] = df.Qty.copy()
df.loc[sale, 'Qty_signed'] *= -1 

df['Value_signed'] = df.Value.copy()
df.loc[sale, 'Value_signed'] *= -1 

qty_remaining = df.groupby('Item')['Qty_signed'].sum()
print(qty_remaining)

money_spent = df.groupby('Item')['Value_signed'].sum()
print(money_spent)

输出:

Item
A    11
Name: Qty_signed, dtype: int64
Item
A    995.0
Name: Value_signed, dtype: float64