如何根据布尔列从真到假的变化对多索引熊猫系列求和?

问题描述

我想计算熊猫数据帧中保存的一组股票交易中的往返(日内交易者)交易次数。我的数据最初有 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 是为长期持有而购买的,不包括输出中。

我的预期输出: 往返次数 = 5

我的预期输出 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 次往返。

上面的代码感觉很笨拙且难以理解。我做了以下事情:

  1. 按 'TradeDate' 切片,然后按 'ticker' 再切片
  2. 统计 q_bool 中的变化,并把它变成一个新的 temp_multiindex_df
  3. 如果 df_slice 行数为奇数,则从 temp_multiindex_df 中减去 1
  4. 将changes_in_qbool 添加到cumulative_round_trip_count 变量,并且
  5. 使用 for 循环制作切片并遍历我的 df 中的所有日期和代码

我当前工作解决方案的问题:

  1. 如果我在一天的开始和结束时购买长期持有,则重复计算。
  2. 解决方案不输出摘要日交易者 df。

有没有更pythonic的方法来做到这一点?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)