修改代码以捕获大于而不是完全匹配的值

2024-06-12 08:32:13 发布

您现在位置:Python中文网/ 问答频道 /正文

下面的代码可以很好地识别以下行中的值是否命中,并给出显示满足条件时间的输出列。你知道吗

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

此图显示了上述代码的输出,通过运行此代码可以轻松地再现这些输出:

current working code

我的问题是,当这个代码用于实际数据时,价格可能不完全匹配和/或可能有差距。如果我们看下面的图片:

desired

我们看到,如果我们寻找的是值>= 7.5,而不仅仅是值7.5,那么target1标准就会得到满足。有人能帮我修改代码来实现这一点吗?你知道吗


Tags: 代码targetdatetimeindextimenanpricerow
2条回答

在不大量修改代码的情况下,我得出了以下结论:

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

这仍有待改进,因为targetHit、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
'''

相关问题 更多 >