修改代码以捕获大于-而不是完全匹配的值 [英] Modify code to capture values greater than - instead of exact match

查看:46
本文介绍了修改代码以捕获大于-而不是完全匹配的值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

下面的代码可以很好地识别在接下来的行中值是命中还是未命中,并在输出列中显示满足条件的时间.

The following code works well for identifying whether a value is hit or missed over following rows and giving the output column showing the time the condition was met.

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

此图显示了上述代码的输出,可以通过运行以下代码轻松地复制它们:

This image shows the output from the above code which can easily be reproduced by running this code:

我遇到的问题是,当将此代码用于实际数据时,价格可能不完全匹配和/或可能会有一定的差距.因此,如果我们看下面的图片:

The issue I have is that when this code is utilised on real data the price may not exactly match and/or may gap though a value. So if we look at the following image:

我们看到,如果我们正在寻找值>= 7.5而不仅仅是寻找值7.5,那么将满足target1标准.有人可以帮忙修改代码来实现这一点吗?

We see that target1 criteria would be met if we were looking for a value >= 7.5 and not just looking for the value 7.5. Can anybody help modify the code to achieve this please?

推荐答案

某些if和多数民众赞成全部:D ...

Some ifs and thats all :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
'''

这篇关于修改代码以捕获大于-而不是完全匹配的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆