基于大熊猫规则更改数量的Python方式?

时间:2020-09-13 10:39:45

标签: python pandas

我有两个数据框: posdf:

          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。

如果qty中的quantity大于qty,则eqdf列的数字等于quantity

如果qty较高且一个符号有多个tradingsymbol,则将剩余数量填入下一个数量。

如果没有qty则用0填充。

我希望这可以澄清更多。

有成百上千种symbolsqty和数量。

我可以遍历填充量,以寻求有关是否可以更pandas友好的方式完成操作的建议?

1 个答案:

答案 0 :(得分:1)

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

从这里开始,我们可以对cumsum使用numpy.maximum来防止其低于零。

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