#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 Я рад, что это сработало 🙂 Если вы чувствуете, что мой ответ решил ваш вопрос, пожалуйста, подумайте о том, чтобы пометить его как принятый.