鉴于来自csv的pandas Dataframe看起来像这样:
DATE,DESCRIPTION,SELL,BUY:
2014-01-16 15:25:57.817728,"text1",7,10
2014-01-16 15:26:01.445759,"text2",5,8
2014-01-16 15:26:57.856787,"text3",4,10
...
最好的方法是检查BUY列中的值是否在给定时间范围内超过某个阈值,例如,例如,在.minute 40和.minute 50之间,然后返回行号码? (仅当交叉发生时,如果在给定时间内价值已经低于某个阈值,则不会发生交叉)
答案 0 :(得分:3)
假设您的行按递增的时间顺序排序,就像在您的示例中一样(并且'DATE'是数据列而不是索引),那么这是实现您想要的一种方法:
在第t行的THRESHOLD
以下交叉意味着t为BUY < threshold
,t-1为BUY >= THRESHOLD
。假设D
是您的数据框,这是通过条件实现的:
cond = (D['BUY'] < threshold) & (D['BUY'].shift(1) >= threshold)
。
获取START_TIME
和END_TIME
之间的所有杂交时间行索引:
d = D[cond]
cross_row_inds = d[(d['DATE'] >= START_TIME) & (d['DATE'] <= END_TIME)].index
您还可以先选择时间,如果DATE
是排序的日期时间索引而不是数据列,则可能会稍快一些。但是,根据您的语义,您可能需要在START_TIME之前包含一个时间实例。