Фрагмент фрейма данных с индексом иерархии

#python #indexing #dataframe #slice #hierarchy

#python #индексирование #фрейм данных #фрагмент #иерархия

Вопрос:

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

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

 ra = dfPrice.to_records()
  

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() метод к нарезанному фрейму данных (вместо того, чтобы пытаться поместить индексы внутри вызова to .min() ).

Комментарии:

1. я попробовал это с большим фреймом данных (более 2 000 000 строк) и получил сообщение об ошибке: KeyError: «Длина ключа (2) была больше, чем глубина многоиндексной сортировки (0)», и я не понимаю, почему — любая помощь?

2. я попробовал это с большим фреймом данных (более 2 000 000 строк) и получил сообщение об ошибке: KeyError: ‘Длина ключа (2) была больше, чем глубина многоиндексной сортировки (0)’. экспериментируя, я обнаружил, что он работает со 100 строками и не работает с 1000 строками. есть ли обходной путь для больших фреймов данных?

3. @jeff97005 если это работает для меньшего случая, возможно, что-то не так с вашим большим. Вы уверены, что большой фрейм данных правильно имеет ту же иерархию? Можете ли вы сравнить dfPrice.index для малого и большого случая? Я имею в виду просмотр dfPrice.index.names dfPrice.index.levels , и т. Д.

4. когда я отсортировал индекс, все заработало. я нашел ответ сортировки в stackoverflow. stackoverflow — замечательный ресурс, спасибо всем за щедрую поддержку!

5. @jeff97005 Я рад, что это сработало 🙂 Если вы чувствуете, что мой ответ решил ваш вопрос, пожалуйста, подумайте о том, чтобы пометить его как принятый.