Нисходящая фильтрация для Dataframe - PullRequest
0 голосов
/ 10 октября 2018

У меня есть такой фрейм данных, как

Index   Results  Price
0       Buy      10
1       Sell     11
2       Buy      12
3       Neutral  13
4       Buy      14
5       Sell     15

. Я хотел бы в конечном итоге вернуть разницу в цене для первой непрерывной комбинации Buy и затем Sell Results в убывающем порядке.Так, что первый вывод равен разности 1, второй вывод 3.

for buy in df: 
        if buy:
              df['Buy Price'] = df['Price']
           for sell in df:
                  if sell:
                      df['Sell Price'] = df['Price']
                      df['Difference'] = df['Sell Price'] - df['Buy Price']

Желаемый вывод

Index Results Price Difference
0     Buy     10    
1     Sell    11    1
2     Buy     12    
3     Neutral 13    
4     Buy     14    
5     Sell    15    3

Я попытался реализовать счетчик, но безуспешно.Заранее спасибо.

1 Ответ

0 голосов
/ 10 октября 2018

Вы можете использовать ручной цикл с парой логических флагов.Здесь я использую numba, чтобы добавить элемент оптимизации:

from numba import njit

@njit
def get_diffs(results, prices):
    res = np.full(prices.shape, np.nan)
    prev_one, prev_zero = True, False
    for i in range(len(results)):
        if prev_one and (results[i] == 0):
            price_start = prices[i]
            prev_zero, prev_one = True, False
        elif prev_zero and (results[i] == 1):
            res[i] = prices[i] - price_start
            prev_zero, prev_one = False, True
    return res

results = df['Results'].map({'Buy': 0, 'Sell': 1})

df['Difference'] = get_diffs(results.values, df['Price'].values)

print(df)

   Index  Results  Price  Difference
0      0      Buy     10         NaN
1      1     Sell     11         1.0
2      2      Buy     12         NaN
3      3  Neutral     13         NaN
4      4      Buy     14         NaN
5      5     Sell     15         3.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...