Найти ближайшую предыдущую строку в фрейме данных из заданной временной метки в Pandas

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Я пытаюсь найти способ вернуть ближайшую предыдущую строку в фрейме данных, которая соответствует двум критериям:

  1. Строка должна быть первой временной меткой (по времени — следовательно, хронологической) до заданной временной метки
  2. Строка также должна быть той, чей 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. Пожалуйста, если появится более простое решение, я обязательно отредактирую