Python 是否可以在没有循环的有序事件序列中选择正确的行?

Python 是否可以在没有循环的有序事件序列中选择正确的行?,python,pandas,numpy,vector,Python,Pandas,Numpy,Vector,示例行: B1 S1 B2 B3/S2 B4 B5 B6/S4 S3 规则: 一行可以是B(买入)、S(卖出)或两者兼而有之 谁卖谁买都知道,反之亦然 买的是订单,卖的可能不是订单 当一次买入没有匹配的卖出时,所有后续买入都将被丢弃 我们想要所有的买入行,如果该行有卖出,则从该点到相应卖出行的所有买入行都将被丢弃 这可以通过一个简单的循环来完成,它跳过了重叠的购买,但是尝试用向量来实现这一点是很有挑战性的,我想知道这是否可能 我尝试过的最有希望的方法是填充买入指数和回填卖出指数,并理解可能

示例行:

B1
S1
B2
B3/S2
B4
B5
B6/S4
S3
规则:

  • 一行可以是B(买入)、S(卖出)或两者兼而有之
  • 谁卖谁买都知道,反之亦然
  • 买的是订单,卖的可能不是订单
  • 当一次买入没有匹配的卖出时,所有后续买入都将被丢弃
  • 我们想要所有的买入行,如果该行有卖出,则从该点到相应卖出行的所有买入行都将被丢弃
这可以通过一个简单的循环来完成,它跳过了重叠的购买,但是尝试用向量来实现这一点是很有挑战性的,我想知道这是否可能

我尝试过的最有希望的方法是填充买入指数和回填卖出指数,并理解可能的组合,尽管我不确定它们是否能给出一个独特的状态视图

示例的输出为:

B1
B2
B4

这里有一个建议,使用
pandas
。我不知道它是否比你正在做的更有效率,但如果目标是避免循环,我认为这会做到

我将假设您的买入/卖出数据可以分为两个数据帧,一个用于买入,一个用于卖出。我还为每个帧添加了一个“时间”列。即何时下订单进行买卖。将数据放在一个数据帧中,并将其拆分为上述两个数据帧可能是一个简单的练习,但我将跳过它

import pandas as pd

# Your data split into two frames (for instance, in df_buy, num=2, would be equivalent 
# to B2 occuring at the second, zero-indexed, time-step)
df_buy = pd.DataFrame({'Num': [1, 2, 3, 4, 5, 6],
                       'Time': [0, 2, 3, 4, 5, 6]})
# S1, S2, S4, S3 happening at time 1, 3, 6 and 7
df_sell = pd.DataFrame({'Num':[1, 2, 4, 3],
                        'Time': [1, 3, 6, 7]})

# Merge buy/sell to find all possible trades
df_trades = pd.merge(df_buy, df_sell, on='Num', suffixes=['_Buy', '_Sell'])
# Order all trades according to which time they would happen, i.e. time_sell.
# (or perhaps at max(time_sell, time_buy)?)
df_trades.sort_values(by='Time_Sell', inplace=True)

# Only trades that happen in increasing order would be allowed. So we filter
# out the trades that happen in decreasing order (ie. trade 3. cannot come 
# after trade 4)
df_final = df_trades[df_trades['Num'].sub(df_trades['Num'].shift(), fill_value=0)>=0]

# Here we have Num = 1, 2, 4 i.e. B1/S1, B2/S2 and B4/S4
Out[11]: 
   Num  Time_Buy  Time_Sell
0    1         0          1
1    2         2          3
3    4         4          6

你能添加你想要的输出吗?我添加了它,并稍微调整了示例,否则输出将只是B1,这提醒你指定当没有Sell时会发生什么。你的问题听起来很有顺序。
numpy
vectors背后的思想是将任务视为一个整体。几乎是以一种并行的方式,你不在乎先处理哪个元素。你是对的,但是发生重叠的可能性是有限的,我希望我知道一种工具,它允许我通过指定规则来绘制所有元素。可能有一组核心序列不经过迭代就无法识别,所以最好是通过向量化操作将其简化,然后在最小的序列集上进行迭代。感谢您的回答,但是这没有考虑到长交易和短交易之间的情况。如果按
time\u sell
(或
max
,在本例中无所谓)排序,则较长的交易显示在较短的交易之后,由于其指数较低,因此将被丢弃。确定。我怀疑可能有我没有涵盖的案例。由于时间序列如此短,很难找到一个涵盖所有问题的答案。但我明白,很难包含涵盖一切的数据系列。