Python 修改代码以捕获大于-的值,而不是精确匹配的值
下面的代码可以很好地识别以下行中的值是否命中,并给出显示满足条件时间的输出列Python 修改代码以捕获大于-的值,而不是精确匹配的值,python,pandas,Python,Pandas,下面的代码可以很好地识别以下行中的值是否命中,并给出显示满足条件时间的输出列 import datetime,numpy as np,pandas as pd; nan = np.nan; a = pd.DataFrame( {'price': {datetime.time(9, 0): 1, datetime.time(10, 0): 0, datetime.time(11, 0): 3, datetime.time(12, 0): 4, datetime.time(13,
import datetime,numpy as np,pandas as pd;
nan = np.nan;
a = pd.DataFrame( {'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_time']=a['target_miss_time']=nan;
a['target1']=a['reversal']+1;
a['target2']=a['reversal']-a['reversal'];
a.sort_index(1,inplace=True);
hits = a.ix[:,:-2].dropna();
for row,hit in hits.iterrows():
forwardRows = [row]<a['price'].index.values
targetHit = a.index.values[(hit['target1']==a['price'].values) & forwardRows][0];
targetMiss = a.index.values[(hit['target2']==a['price'].values) & forwardRows][0];
if targetHit>targetMiss:
a.loc[row,"target_miss_time"] = targetMiss;
else:
a.loc[row,"target_hit_time"] = targetHit;
a
导入日期时间,numpy作为np,pandas作为pd;
nan=np.nan;
a=pd.DataFrame({'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},'Reversion':{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\u hit\u time']=a['target\u miss\u time']=nan;
a['target1']=a['reversion']+1;
a['target2']=a['reversion']-a['reversion'];
a、 排序索引(1,原地=真);
hits=a.ix[:,:-2].dropna();
对于行,在hits中单击。iterrows():
forwardRows=[行]
我遇到的问题是,当在实际数据上使用此代码时,价格可能不完全匹配和/或可能与某个值存在差距。因此,如果我们看下图:
我们发现,如果我们寻找的是=7.5
的值,而不仅仅是7.5
的值,就可以满足target1
的标准。有人能帮我修改代码来实现这一点吗?在不大量修改代码的情况下,我想到了以下几点:
import numpy as np
for row,hit in hits.iterrows():
print ("row", row)
print ("hit",hit)
forwardRows = a[a.index.values > row]
targetHit = forwardRows[(hit['target1'] <= forwardRows['price'].values)].head(1).index.values
targetMiss = forwardRows[(hit['target2'] >= forwardRows['price'].values)].head(1).index.values
if targetHit>targetMiss:
a.loc[row,"target_miss_time"] = targetMiss
else:
a.loc[row,"target_hit_time"] = targetHit
price reversal target1 target2 target_hit_time target_miss_time
09:00:00 1 NaN NaN NaN NaN NaN
10:00:00 0 NaN NaN NaN NaN NaN
11:00:00 3 NaN NaN NaN NaN NaN
12:00:00 4 NaN NaN NaN NaN NaN
13:00:00 7 NaN NaN NaN NaN NaN
14:00:00 6 6.5 7.5 0.0 [20:00:00] NaN
15:00:00 5 NaN NaN NaN NaN NaN
16:00:00 4 NaN NaN NaN NaN NaN
17:00:00 2 NaN NaN NaN NaN NaN
18:00:00 2 NaN NaN NaN NaN NaN
19:00:00 4 NaN NaN NaN NaN NaN
20:00:00 8 NaN NaN NaN NaN NaN
将numpy导入为np
对于行,在hits中单击。iterrows():
打印(“行”,行)
打印(“点击”,点击)
forwardRows=a[a.index.values>row]
targetHit=forwardRows[(点击['target1']=forwardRows['price'].values)].head(1).index.values
如果targetHit>targetMiss:
a、 loc[行,“目标未命中时间”]=目标未命中
其他:
a、 loc[行,“目标命中时间”]=targetHit
价格反转目标1目标2目标命中时间目标未命中时间
09:00:00 1楠楠
10:00:00 0楠楠楠楠楠楠
11:00:00 3楠楠楠楠
12:00:00 4楠楠楠楠
13:00:00 7楠楠楠楠
14:00:00 6 6.5 7.5 0.0[20:00:00]南
15:00:00 5楠楠楠楠
16:00:00 4楠楠楠楠
17:00:00 2楠楠
18:00:00 2楠楠楠
19:00:00 4楠楠楠楠
20:00:00 8楠楠楠楠
这仍有待改进,因为targetIt、targetMiss返回一个数组,您需要检查数组中是否有元素,以及两个数组中是否都有元素,您需要比较第一个元素。现在,它只在一个数组为空时才起作用。一些如果,仅此而已:D
import datetime,numpy as np,pandas as pd;
nan = np.nan;
a = pd.DataFrame( {'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): 2, datetime.time(18, 0): 2, datetime.time(19, 0): 4, datetime.time(20, 0): 8}, '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_time']=a['target_miss_time']=nan;
a['target1']=a['reversal']+1;
a['target2']=a['reversal']-a['reversal'];
a.sort_index(1,inplace=True);
hits = a.ix[:,:-2].dropna();
for row,hit in hits.iterrows():
forwardRows = a[a.index.values > row];
targetHit = hit['target1']<=forwardRows['price'].values;
targetMiss = hit['target2']==forwardRows['price'].values;
targetHit = forwardRows[targetHit].head(1).index.values;
targetMiss = forwardRows[targetMiss].head(1).index.values;
targetHit, targetMiss = \
targetHit[0] if targetHit else [], \
targetMiss[0] if targetMiss else [];
goMiss,goHit = False,False
if targetHit and targetMiss:
if targetHit>targetMiss: goMiss=True;
else: goHit=True;
elif targetHit and not targetMiss:goHit = True;
elif not targetHit and targetMiss:goMiss = True;
if goMiss:a.loc[row,"target_miss_time"] = targetMiss;
elif goHit:a.loc[row,"target_hit_time"] = targetHit;
print '#'*50
print a
'''
##################################################
price reversal target1 target2 target_hit_time target_miss_time
09:00:00 1 NaN NaN NaN NaN NaN
10:00:00 0 NaN NaN NaN NaN NaN
11:00:00 3 NaN NaN NaN NaN NaN
12:00:00 4 NaN NaN NaN NaN NaN
13:00:00 7 NaN NaN NaN NaN NaN
14:00:00 6 6.0 7.0 0.0 20:00:00 NaN
15:00:00 5 NaN NaN NaN NaN NaN
16:00:00 4 NaN NaN NaN NaN NaN
17:00:00 2 NaN NaN NaN NaN NaN
18:00:00 2 NaN NaN NaN NaN NaN
19:00:00 4 NaN NaN NaN NaN NaN
20:00:00 8 NaN NaN NaN NaN NaN
'''
导入日期时间,numpy作为np,pandas作为pd;
nan=np.nan;
a=pd.DataFrame({'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):2,datetime.time(18,0):2,datetime.time(19,0):4,datetime.time(20,0):8},'Reversion':{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\u hit\u time']=a['target\u miss\u time']=nan;
a['target1']=a['reversion']+1;
a['target2']=a['reversion']-a['reversion'];
a、 排序索引(1,原地=真);
hits=a.ix[:,:-2].dropna();
对于行,在hits中单击。iterrows():
forwardRows=a[a.index.values>row];
targetHit=hit['target1']targetMiss:goMiss=True;
否则:goHit=True;
elif targetHit而非targetMiss:goHit=True;
elif not targetHit和targetMiss:goMiss=True;
如果goMiss:a.loc[row,“target\u miss\u time”]=targetMiss;
elif goHit:a.loc[row,“target\u hit\u time”]=targetHit;
打印“#”*50
打印
'''
##################################################
价格反转目标1目标2目标命中时间目标未命中时间
09:00:00 1楠楠
10:00:00 0楠楠楠楠楠楠
11:00:00 3楠楠楠楠
12:00:00 4楠楠楠楠
13:00:00 7楠楠楠楠
14:00:00 6.0 7.0 0.0 20:00:00南
15:00:00 5楠楠楠楠
16:00:00 4楠楠楠楠
17:00:00 2楠楠
18:00:00 2楠楠楠
19:00:00 4楠楠楠楠
20:00:00 8楠楠楠楠
'''
今天我花了一些时间来阅读您的代码并理解它。谢谢你的努力,因为这对我很有用。请帮助我理解为什么我们需要a.sort\u索引(1,inplace=True)代码>。我知道我们是根据列进行排序的,但为什么请?排序前的列是:“价格反转目标\命中\时间目标\未命中\时间目标1 target2”;它们变成:“价格反转目标1目标2目标命中时间目标错过时间”。这就是你应该知道的。。。只是让你的灵魂变成了尝试/例外,只有这样才会烦恼