После группировки найдите ближайший из каждой группы в Python Python - PullRequest
0 голосов
/ 08 декабря 2018

Я новичок в пандах и застрял в расчете.Это мой образец DF.Я заинтересован в том, чтобы получить ближайшую strike_price строки close цены для каждой группы.(группа по дате, времени, тип_опции)

        name      date   time      open      high       low     close       option_type  strike_price  open_opn  high_opn  low_opn  close_opn 
0       NIFTY  20180903  09:16  11736.05  11736.10  11699.35  11720.15      CE              11800       104.95    109.45   104.50     107.25 
1       NIFTY  20180903  09:16  11736.05  11736.10  11699.35  11720.15      CE              11700       160.00    164.25   159.90     161.60
2       NIFTY  20180903  09:16  11736.05  11736.10  11699.35  11720.15      CE              11600       223.20    229.10   223.20     226.30  
0       NIFTY  20180903  09:16  11736.05  11736.10  11699.35  11720.15      PE              11800       166.05    166.95   163.55     165.95  
1       NIFTY  20180903  09:16  11736.05  11736.10  11699.35  11720.15      PE              11600       88.80     89.45    86.45      89.00
2       NIFTY  20180903  09:16  11736.05  11736.10  11699.35  11720.15      PE              11700       122.35    122.65   119.40     122.30

Это мой ожидаемый результат.

        name      date   time      open      high       low     close       option_type  strike_price  open_opn  high_opn  low_opn  close_opn 

1       NIFTY  20180903  09:16  11736.05  11736.10  11699.35  11700.15      CE              11700       160.00    164.25   159.90     161.60
2       NIFTY  20180903  09:16  11736.05  11736.10  11699.35  11700.15      PE              11700       122.35    122.65   119.40     122.30

Если цена закрытия равна 11760, ожидаемое значение o / p будет.

0       NIFTY  20180903  09:16  11736.05  11736.10  11699.35  11720.15      CE              11800       104.95    109.45   104.50     107.25
0       NIFTY  20180903  09:16  11736.05  11736.10  11699.35  11720.15      PE              11800       166.05    166.95   163.55     165.95

Пожалуйста, помогите мне в этом.высоко ценится.

1 Ответ

0 голосов
/ 08 декабря 2018

Сначала используйте sub с abs, а затем получите минимальное значение для групп по sort_values с drop_duplicates:

df['diff'] = df['close'].sub(df['strike_price']).abs()

df = df.sort_values('diff').drop_duplicates(['date', 'time', 'option_type'])
print (df)
    name      date   time      open     high       low     close option_type  \
1  NIFTY  20180903  09:16  11736.05  11736.1  11699.35  11720.15          CE   
2  NIFTY  20180903  09:16  11736.05  11736.1  11699.35  11720.15          PE   

   strike_price  open_opn  high_opn  low_opn  close_opn   diff  
1         11700    160.00    164.25    159.9      161.6  20.15  
2         11700    122.35    122.65    119.4      122.3  20.15  

Другое решение с DataFrameGroupBy.idxmin с loc:

df = df.reset_index(drop=True)
df['diff'] = df['close'].sub(df['strike_price']).abs()

df = df.loc[df.groupby(['date', 'time', 'option_type'])['diff'].idxmin()]
print (df)

    name      date   time      open     high       low     close option_type  \
1  NIFTY  20180903  09:16  11736.05  11736.1  11699.35  11720.15          CE   
5  NIFTY  20180903  09:16  11736.05  11736.1  11699.35  11720.15          PE   

   strike_price  open_opn  high_opn  low_opn  close_opn   diff  
1         11700    160.00    164.25    159.9      161.6  20.15  
5         11700    122.35    122.65    119.4      122.3  20.15    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...