我有两个数据帧: 自卫队:
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。
我希望这能澄清更多。
有数百种不同的symbols
、qty
和数量。
我将能够循环填充数量,寻找是否可以以更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