我有两个数据框: 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填充。
我希望这可以澄清更多。
有成百上千种symbols
,qty
和数量。
我可以遍历填充量,以寻求有关是否可以更pandas
友好的方式完成操作的建议?
答案 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