问题描述
我想计算熊猫数据帧中保存的一组股票交易中的往返(日内交易者)交易次数。我的数据最初有 3 列:['ticker','TradeDate','quantity']。我想根据总正数量值汇总数量。
我的输入数据:
df = pd.DataFrame({
'TradeDate':["12/28/2020","12/28/2020","12/27/2020","12/27/2020"],'ticker':["A2","A1","A2","A1"],'quantity':[-3,-2,1,3,-1,-5,-4,5,2,2]
},columns=['TradeDate','ticker','quantity'])
# | TradeDate | 代码 | 数量 |
---|---|---|---|
0 | 12/28/2020 | A2 | -3 |
1 | 12/28/2020 | A1 | -2 |
2 | 12/28/2020 | A1 | 1 |
3 | 12/28/2020 | A2 | 3 |
4 | 12/28/2020 | A1 | 1 |
5 | 12/28/2020 | A1 | -1 |
6 | 12/28/2020 | A1 | 1 |
7 | 12/28/2020 | A2 | -2 |
8 | 12/27/2020 | A2 | 1 |
9 | 12/27/2020 | A2 | -5 |
10 | 12/27/2020 | A1 | -4 |
11 | 12/27/2020 | A2 | 5 |
12 | 12/27/2020 | A1 | 2 |
13 | 12/27/2020 | A2 | 1 |
14 | 12/27/2020 | A1 | 2 |
请注意,指数 7 是从长期持有中出售的,不包括在产出中。 请注意,指数 8 是为长期持有而购买的,不包括在输出中。 请注意,指数 13 是为长期持有而购买的,不包括在输出中。
我的预期输出 df:
# | TradeDate | 代码 | 数量 |
---|---|---|---|
0 | 12/28/2020 | A2 | -3 |
1 | 12/28/2020 | A2 | 3 |
2 | 12/28/2020 | A1 | -2 |
3 | 12/28/2020 | A1 | 2 |
4 | 12/28/2020 | A1 | -1 |
5 | 12/28/2020 | A1 | 1 |
6 | 12/27/2020 | A2 | -5 |
7 | 12/27/2020 | A2 | 5 |
8 | 12/27/2020 | A1 | -4 |
9 | 12/27/2020 | A1 | 4 |
我已经通读了这个问题和链接的骗子,它并没有完全回答如何解决这个问题。 Counting the amount of times a boolean goes from True to False in a column
我尝试制作一列“q_bool”,如果数量 > 0,则该列为 True,然后使用股票代码的切片检查 q_bool 中的更改,但在包含日期时会引发错误。
我目前的工作解决方案是:
df['q_bool'] = (df['quantity'] > 0)
ticker_set = set(df['ticker'])
running_round_trips_counted = 0
for ticker in ticker_set:
ticker_mask = (df['ticker'] == ticker)
temp_df_slice = df[ticker_mask]
date_set = set(temp_df_slice['TradeDate'])
for d in date_set:
d_mask = (temp_df_slice['TradeDate'] == d)
d_temp_df_slice = temp_df_slice[d_mask]
d_temp_df_slice = d_temp_df_slice.groupby([d_temp_df_slice['q_bool'].ne(df['q_bool'].shift()).cumsum(),'q_bool']).size()
half_of_transactions = math.trunc(len(d_temp_df_slice)/2)
running_round_trips_counted = running_round_trips_counted + half_of_transactions
print(running_round_trips_counted)
输出是 6 次往返。
上面的代码感觉很笨拙且难以理解。我做了以下事情:
- 按 'TradeDate' 切片,然后按 'ticker' 再切片
- 统计 q_bool 中的变化,并把它变成一个新的 temp_multiindex_df
- 如果 df_slice 行数为奇数,则从 temp_multiindex_df 中减去 1
- 将changes_in_qbool 添加到cumulative_round_trip_count 变量,并且
- 使用 for 循环制作切片并遍历我的 df 中的所有日期和代码。
我当前工作解决方案的问题:
有没有更pythonic的方法来做到这一点?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)