在熊猫中根据规则改变数量的 pythonic 方式?



我有两个数据帧: 自卫队:

tradingsymbol quantity   symbol
0  BRITANNIA20SEP3850CE     -200   BRITANNIA
1  BRITANNIA20SEP3900CE     -200   BRITANNIA

我将quantity更改为绝对:

posdf['quantity'] = abs(posdf['quantity'])

eqdf:

symbol  qty
0   BRITANNIA  225  

merge他们:

posdf = pd.merge(posdf, eqdf, how='outer', on='symbol')

并获得:

tradingsymbol quantity  qty
0  BRITANNIA20SEP3850CE     -200  225
1  BRITANNIA20SEP3900CE     -200  225

我想得到什么:

tradingsymbol quantity  qty  symbol
0  BRITANNIA20SEP3850CE     200  200   BRITANNIA
1  BRITANNIA20SEP3900CE     200  25    BRITANNIA

即使qty列等于quantity,如果没有足够的qty则等于余数或 0。

如果eqdf中的qty大于quantity,则该列qty具有等于quantity的数字。

如果qty较高,并且某个符号的tradingsymbol超过 1 个,则将剩余数量填充到下一个数量中。

如果没有剩余qty则填充 0。

我希望这能澄清更多。

有数百种不同的symbolsqty和数量。

我将能够循环填充数量,寻找是否可以以更pandas友好的方式完成的建议?

TLDR- 也许重新考虑您的数据结构?

我不认为合并是要走的路。基本上,我的想法是你想在"时间点"保持某种运行"平衡"。因此,您想说的是"在我$X的时间段开始时",我想知道如果我继续进行这些交易,结果余额是多少。

所以我的想法是,我们想要使用pd.concat,然后是累积总和,条件是我们不能变成负数。

import pandas as pd
import numpy as np
posdf = pd.DataFrame(
{
"tradingsymbol": ["BRITANNIA20SEP3850CE", "BRITANNIA20SEP3900CE"],
"quantity": [-200, -200],
"symbol": ["BRITANNIA", "BRITANNIA"]
}
)
eqdf = pd.DataFrame(
{
"symbol": ["BRITANNIA"],
"quantity": [225]
}
)
alldf = pd.concat([eqdf, posdf]).sort_values(by="tradingsymbol", na_position="first")

alldf输出:

symbol  quantity         tradingsymbol
0  BRITANNIA       225                   NaN
0  BRITANNIA      -200  BRITANNIA20SEP3850CE
1  BRITANNIA      -200  BRITANNIA20SEP3900CE

从这里,我们可以对numpy.maximum进行cumsum,以防止它低于零。

In []: np.maximum(alldf['quantity'].cumsum(), 0)                                                                         
Out[]: 
0    225
0     25
1      0
Name: quantity, dtype: int64

然后把它放在一起就变成了获得目标输出的微不足道的练习。

alldf['qty'] = np.maximum(alldf['quantity'].cumsum(), 0).shift() - np.maximum(alldf['quantity'].cumsum(), 0)

输出

In []: alldf                                                                                                             
Out[]: 
symbol  quantity         tradingsymbol    qty
0  BRITANNIA       225                   NaN    NaN
0  BRITANNIA      -200  BRITANNIA20SEP3850CE  200.0
1  BRITANNIA      -200  BRITANNIA20SEP3900CE   25.0

最新更新