#python #pandas #dataframe
#python #pandas #фрейм данных
Вопрос:
Я пытаюсь найти способ вернуть ближайшую предыдущую строку в фрейме данных, которая соответствует двум критериям:
- Строка должна быть первой временной меткой (по времени — следовательно, хронологической) до заданной временной метки
- Строка также должна быть той, чей
Type
столбец == ‘Quote’
Затем я хочу создать два столбца df[‘is_ask_trade’] и df[‘is_bid_trade’]. Для каждой записи в type
столбце с пометкой «Торговля» я хотел бы найти соответствующую котировку, основанную на ее цене в price
столбце. Котировка также должна предшествовать этой сделке по времени, т.Е. Она не может произойти одновременно с сделкой.
Если торговая строка price
<= bid_price
, то ‘1’ еще 0 и наоборот, если цена <= ask_price
.
Индекс отсортирован (DateTime), однако он содержит повторяющиеся значения; некоторые относятся к котировке, другие к сделке. Информация должна быть сохранена.
Данные:
df = pd.DataFrame({
'datetime': [
'2020-11-16 01:39:06.22021017', '2020-11-16 01:39:06.22021020', '2020-11-16 01:39:06.22021022',
'2020-11-16 01:39:06.22021031', '2020-11-16 01:39:06.22021033', '2020-11-16 01:39:06.22021036'],
'type': ['Quote', 'Trade', 'Trade', 'Quote', 'Quote', 'Trade'],
'price': ['NaN', 7026.5, 7026.5, np.NaN, np.NaN, 7024.0],
'ask_price': [7026.5, 7026.5, 7026.0, 7026.5, 7026.0, 7026.5],
'bid_price': [7024.0, 7024.5, 7024.5, 7024.0, 7024.5, 7024.5]})
Мне любезно помогли SO разработать аналогичное решение, однако я не могу адаптировать его к этой новой задаче.
Я попытался использовать: df.index.get_loc[index_of_trade_row, method="ffill"]
и фильтрацию для ближайших строк «кавычек», однако я получаю сообщение об ошибке из-за неуникального индекса.
Ожидаемый результат:
df = pd.DataFrame({
'datetime': [
'2020-11-16 01:39:06.22021017', '2020-11-16 01:39:06.22021020', '2020-11-16 01:39:06.22021022',
'2020-11-16 01:39:06.22021032', '2020-11-16 01:39:06.22021033', '2020-11-16 01:39:06.22021033'],
'type': ['Quote', 'Trade', 'Trade', 'Quote', 'Quote', 'Trade'],
'price': ['NaN', 7026.5, 7026.5, 'NaN', 'NaN', 7024.0],
'ask_price': [7026.5, 7026.5, 7026.0, 7026.5, 7026.0, 7026.5],
'bid_price': [7024.0, 7024.5, 7024.5, 7024.0, 7024.0, 7024.5],
'is_bid_trade': [0, 0, 0, 0, 0, 1],
'is_ask_trade': [1, 1, 0, 0, 0, 0]})
Например, последняя is_bid_trade
строка соответствовала строке bid_price
котировки на 2 строки раньше, поскольку сделка логически произошла после котировки во времени.
Вся помощь с благодарностью получена, спасибо.
Комментарии:
1. Это может сработать:
df.iloc[df[df.datetime < '2020-11-16 01:39:06.22021032'].index[-1]]
Ответ №1:
Если я не ошибся в вопросе, вы хотите получить строку с типом ‘Quote’ и ближайшим предшествующим ‘datetime’. Так что надеюсь, это поможет.
df.iloc[df[(df.datetime < index_of_trade_row) amp; (df.type == 'Quote')].index[-1]]
Комментарии:
1. Спасибо, но это сложнее — я отредактирую OP, чтобы сделать его более понятным.
2. Пожалуйста, если появится более простое решение, я обязательно отредактирую