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目标命中时间目标错过时间”。这就是你应该知道的。。。只是让你的灵魂变成了尝试/例外,只有这样才会烦恼