Изменить код для захвата значений больше - вместо точного соответствия

python pandas

72 просмотра

2 ответа

Следующий код хорошо работает для определения того, будет ли значение достигнуто или пропущено в следующих строках, и даст выходной столбец, показывающий время выполнения условия.

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

Это изображение показывает выходные данные из приведенного выше кода, которые можно легко воспроизвести, запустив этот код:

текущий рабочий код

Проблема, с которой я столкнулся, заключается в том, что когда этот код используется для реальных данных, цена может не совпадать в точности и / или может не соответствовать значению. Итак, если мы посмотрим на следующее изображение:

желательно

Мы видим, что target1критерии будут выполнены, если мы будем искать значение, >= 7.5а не просто искать значение 7.5. Кто-нибудь может помочь изменить код для достижения этой цели, пожалуйста?

Автор: ade1e Источник Размещён: 08.11.2019 11:04

Ответы (2)


1 плюс

Решение

Некоторые если и это все: 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
'''
Автор: yourstruly Размещён: 20.08.2016 01:37

0 плюса

Без серьезного изменения вашего кода, вот что я придумал:

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 возвращают массив, и вам нужно проверить, есть ли какие-либо элементы в массиве и есть ли элементы в обоих массивах - вам нужно сравнить первые элементы. Прямо сейчас это работает, только если один массив пуст.

Автор: Andrey Vykhodtsev Размещён: 20.08.2016 10:36
Вопросы из категории :
32x32