Python 遍历行以查看哪个值最先出现
使用Pandas时,我可以使用.shift()检查前面和后面的行,以查看是否满足某些条件 如果我需要查看是否满足一个条件,即在我比较的行之后可能有100行或更多行?我知道在数据帧中循环不是最有效的,但是有人能帮我看一下下面的例子吗 当df['reversion']列有信号时-如下面14:00显示6.0的示例所示-我想知道在14:00行之后首先看到以下哪一项:Python 遍历行以查看哪个值最先出现,python,pandas,Python,Pandas,使用Pandas时,我可以使用.shift()检查前面和后面的行,以查看是否满足某些条件 如果我需要查看是否满足一个条件,即在我比较的行之后可能有100行或更多行?我知道在数据帧中循环不是最有效的,但是有人能帮我看一下下面的例子吗 当df['reversion']列有信号时-如下面14:00显示6.0的示例所示-我想知道在14:00行之后首先看到以下哪一项: df.price的值为df.reversion+1(我们可以看到它是在20:00被击中的,因为6+1=7) df.price的值为df.
的值为df.price
+1(我们可以看到它是在20:00被击中的,因为6+1=7)df.reversion
的值为df.price
-df.reversion
(本例中未命中该值,因为价格未命中6-6=0)df.reversion
df.to_dict()
以复制:
{'move_start': {datetime.time(9, 0): nan,
datetime.time(10, 0): nan,
datetime.time(11, 0): nan,
datetime.time(12, 0): nan,
datetime.time(13, 0): nan,
datetime.time(14, 0): datetime.time(9, 0),
datetime.time(15, 0): nan,
datetime.time(16, 0): nan,
datetime.time(17, 0): nan,
datetime.time(18, 0): nan,
datetime.time(19, 0): nan,
datetime.time(20, 0): nan},
'price': {datetime.time(9, 0): 1,
datetime.time(10, 0): 2,
datetime.time(11, 0): 3,
datetime.time(12, 0): 4,
datetime.time(13, 0): 5,
datetime.time(14, 0): 6,
datetime.time(15, 0): 5,
datetime.time(16, 0): 4,
datetime.time(17, 0): 3,
datetime.time(18, 0): 2,
datetime.time(19, 0): 4,
datetime.time(20, 0): 7},
'reversal': {datetime.time(9, 0): nan,
datetime.time(10, 0): nan,
datetime.time(11, 0): nan,
datetime.time(12, 0): nan,
datetime.time(13, 0): nan,
datetime.time(14, 0): 6.0,
datetime.time(15, 0): nan,
datetime.time(16, 0): nan,
datetime.time(17, 0): nan,
datetime.time(18, 0): nan,
datetime.time(19, 0): nan,
datetime.time(20, 0): nan}}
让它变得更好更干净,想
import datetime,numpy as np,pandas as pd
nan = np.nan
a = pd.DataFrame({'move_start': {datetime.time(9, 0): nan, datetime.time(10, 0): nan, datetime.time(11, 0): nan, datetime.time(12, 0): nan, datetime.time(13, 0): nan, datetime.time(14, 0): datetime.time(9, 0), datetime.time(15, 0): nan, datetime.time(16, 0): nan, datetime.time(17, 0): nan, datetime.time(18, 0): nan, datetime.time(19, 0): nan, datetime.time(20, 0): nan}, 'price': {datetime.time(9, 0): 1, datetime.time(10, 0): 0, datetime.time(11, 0): 3, datetime.time(12, 0): 4, datetime.time(13, 0): 7, datetime.time(14, 0): 6, datetime.time(15, 0): 5, datetime.time(16, 0): 4, datetime.time(17, 0): 0, datetime.time(18, 0): 2, datetime.time(19, 0): 4, datetime.time(20, 0): 7}, 'reversal': {datetime.time(9, 0): nan, datetime.time(10, 0): nan, datetime.time(11, 0): nan, datetime.time(12, 0): nan, datetime.time(13, 0): nan,
datetime.time(14, 0): 6.0, datetime.time(15, 0): nan, datetime.time(16, 0): nan, datetime.time(17, 0): nan, datetime.time(18, 0): nan, datetime.time(19, 0): nan, datetime.time(20, 0): nan}})
a['target_hit']=nan;
a['target_miss']=nan;
a['reversal1']=a['reversal']+1;
a['reversal2']=a['reversal']-a['reversal'];
a.sort_index(1,inplace=True);
hit = a.ix[:,:-2].dropna()
takeBoth = False
targetIsHit,targetIsMiss = False,False
if takeBoth:
targetHit = a[(hit['reversal1'].values==a['price'].values) & (hit['reversal1'].index.values<a['price'].index.values)];
targetMiss = a[(hit['reversal2'].values==a['price'].values) & (hit['reversal2'].index.values<a['price'].index.values)];
targetIsHit,targetIsMiss = not targetHit.empty, not targetMiss.empty
else:
targetHit = a[(hit['reversal1'].values==a['price'].values) & (hit['reversal1'].index.values<a['price'].index.values)];
targetIsHit = not targetHit.empty
if not targetIsHit:
targetMiss = a[(hit['reversal2'].values==a['price'].values) & (hit['reversal2'].index.values<a['price'].index.values)];
targetIsMiss = not targetMiss.empty
if targetIsHit:a.loc[hit.index.values,"target_hit"] = targetHit.index.values;
if targetIsMiss:a.loc[hit.index.values,"target_miss"] = targetMiss.index.values;
print '#'*50
print a
'''
##################################################
move_start price reversal reversal1 reversal2 target_hit \
09:00:00 NaN 1 NaN NaN NaN NaN
10:00:00 NaN 0 NaN NaN NaN NaN
11:00:00 NaN 3 NaN NaN NaN NaN
12:00:00 NaN 4 NaN NaN NaN NaN
13:00:00 NaN 7 NaN NaN NaN NaN
14:00:00 09:00:00 6 6.0 7.0 0.0 20:00:00
15:00:00 NaN 5 NaN NaN NaN NaN
16:00:00 NaN 4 NaN NaN NaN NaN
17:00:00 NaN 0 NaN NaN NaN NaN
18:00:00 NaN 2 NaN NaN NaN NaN
19:00:00 NaN 4 NaN NaN NaN NaN
20:00:00 NaN 7 NaN NaN NaN NaN
target_miss
09:00:00 NaN
10:00:00 NaN
11:00:00 NaN
12:00:00 NaN
13:00:00 NaN
14:00:00 NaN
15:00:00 NaN
16:00:00 NaN
17:00:00 NaN
18:00:00 NaN
19:00:00 NaN
20:00:00 NaN
'''
导入日期时间,numpy作为np,pandas作为pd
nan=np.nan
a=pd.DataFrame({'move_start':{datetime.time(9,0):nan,datetime.time(10,0):nan,datetime.time(11,0):nan,datetime.time(12,0):nan,datetime.time(13,0):nan,datetime.time(14,0):datetime.time(9,0),datetime.time(15,0):nan,datetime.time(16,0):nan,datetime.time(17,0):nan,datetime.time.time(18,0):nan,datetime.time(19,0):nan,datetime.time(20,0):nan},'price':{datetime.time(9,0):1,datetime.time(10,0):0,datetime.time(11,0):3,datetime.time(12,0):4,datetime.time(13,0):7,datetime.time(14,0):6,datetime.time(15,0):5,datetime.time(16,0):4,datetime.time(17,0):0,datetime.time(18,0):2,datetime.time(19,0):4,datetime.time(20,0):7},'反转':{datetime.time(9,0):nan,datetime.time(10,0):nan,datetime.time(11,0):nan,datetime.time(12,0):nan,datetime.time(13,0):nan,
datetime.time(14,0):6.0,datetime.time(15,0):nan,datetime.time(16,0):nan,datetime.time(17,0):nan,datetime.time(18,0):nan,datetime.time(19,0):nan,datetime.time(20,0):nan})
a['target_hit']=nan;
a['target_miss']=nan;
a['reversal1']=a['reversal1']+1;
a['reversal2']=a['reversal']-a['reversal'];
a、 排序索引(1,原地=真);
hit=a.ix[:,:-2].dropna()
takeBoth=False
targetIsHit,targetIsMiss=False,False
如果两者都有:
targetHit=a[(点击['reversal1'].values==a['price'].values)&(点击['reversal1'].index.valuesHi Robert,看起来您的代码已经解决了这个问题,但不幸的是,当我将10:00
a.price
单元格更改为0
时,您的代码会向后查看,并将其用作目标。\u miss
。重要的是只考虑未来的行。您能看一下吗?感谢您的帮助。还有我需要将第一个if not
更改为if
以获得如下任何输出:if targetMiss.empty:a.loc[hit.index.values,“target\u hit”]=targetHit.index.values;
这是否正确?啊,我当时正在睡觉xD…w8我会检查它有错误…如果不是targetHit:…
应该是,如果不是targetMiss:…
我正在复制行如果不是targetMiss:…
以生成行如果不是targetHit:…
并正确地更改了所有内容,但不是targetMiss
至targetHit
…但目标命中是否仅为目标命中后的未命中,而不是命中后的未命中?了解其他人如何执行此任务也很有意思。