Срез фрейма данных с индексом иерархии

У меня есть два фрейма данных. Есть операции с акциями (такие как дата покупки, цена покупки, дата продажи, цена продажи). Другой фрейм данных имеет все цены в порядке дат с вызываемым ['symbol', 'date']индексом иерархии индексирования 'close'цены dfPrice.

Не зная лучшего способа отправки фрейма данных в эту группу, я сделал запись первых 10 строк:

ra = dfPrice.to_records()

выход an raиз:

rec.array([('A', Timestamp('2000-09-01 00:00:00'), 39.84),
 ('A', Timestamp('2000-09-05 00:00:00'), 39.8),
 ('A', Timestamp('2000-09-06 00:00:00'), 38.63),
 ('A', Timestamp('2000-09-07 00:00:00'), 39.84),
 ('A', Timestamp('2000-09-08 00:00:00'), 38.15),
 ('A', Timestamp('2000-09-11 00:00:00'), 36.54),
 ('A', Timestamp('2000-09-12 00:00:00'), 35.41),
 ('A', Timestamp('2000-09-13 00:00:00'), 35.41),
 ('A', Timestamp('2000-09-14 00:00:00'), 35.89),
 ('A', Timestamp('2000-09-15 00:00:00'), 36.7)], 
      dtype=[('symbol', 'S1'), ('date', 'O'), ('close', '<f8')])

вы можете получить dfPriceпо:

dfPrice = DataFrame(ra)
dfPrice.set_index(['symbol', 'date'], inplace=True)

я хочу использовать дату покупки и дату продажи и посмотреть минимальную цену в интервале, в котором я держал акции.

Если я купил акции’ A ‘ на 2000-09-07 и продал на 2000-09-14 (держа его в течение выходных без каких-либо ценовых записей), я думал, что могу получить минимальную цену за этот интервал, используя что-то вроде:

minPrice = dfPrice.min['A', '2000-09-07':'2000-09-14']

Ответ 35.41.

Я посмотрел на переполнение стека,но ничего не нашел. Что я могу использовать, чтобы получить то, что я хочу?

1 ответ

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

    >>> dfPrice[('A','2000-09-07'):('A','2000-09-14')]
                       close
    symbol date             
     'A'   2000-09-07  39.84
           2000-09-08  38.15
           2000-09-11  36.54
           2000-09-12  35.41
           2000-09-13  35.41
           2000-09-14  35.89
    >>> dfPrice[('A','2000-09-07'):('A','2000-09-14')].min()
    close    35.41
    dtype: float64
    

    Таким образом, для одного вы должны использовать расширенное индексирование, чтобы срезать второй уровень индексов, и вы должны применить .min()метод к срезанному фрейму данных (вместо того, чтобы пытаться поместить индексы внутри вызова .min()).