Внутреннее устройство
В этом разделе представлен обзор внутренней структуры pandas. Он предназначен в первую очередь для разработчиков самих библиотек pandas.
Индексирование
В pandas реализовано несколько объектов, которые могут служить контейнерами для меток осей:
-
Index: обобщённый объект «упорядоченного множества», массив ndarray с типом данных object, не делающий предположений о содержимом. Метки должны быть хешируемыми (и, вероятно, неизменяемыми) и уникальными. Заполняет словарь меток и их позиций в Cython для выполненияO(1)поисков. -
Int64Index: версияIndex, высокооптимизированная для данных целого типа 64 бит, таких как временные метки -
Float64Index: версияIndex, высокооптимизированная для данных с плавающей запятой 64 бит -
MultiIndex: стандартный объект иерархического индекса -
DatetimeIndex: Объект Index сTimestampупакованными элементами (реализация — значения int64) -
TimedeltaIndex: Объект Index сTimedeltaупакованными элементами (реализация — значения int64) -
PeriodIndex: Объект Index с элементами Period
Существуют функции, которые упрощают создание обычного индекса:
-
date_range: диапазон дат с фиксированной частотой, сгенерированный по правилу времени или смещению DateOffset. Массив ndarray объектов Python datetime -
period_range: диапазон дат с фиксированной частотой, сгенерированный по правилу времени или смещению DateOffset. Массив ndarray объектовPeriod, представляющих временные интервалы
Мотивация наличия класса Index в первую очередь заключалась в возможности различных реализаций индексирования. Это означает, что вы, пользователь, можете реализовать пользовательский подкласс Index, который может быть более подходящим для конкретного приложения, чем те, которые предоставляет pandas.
С точки зрения внутренней реализации, релевантные методы, которые должен определить Index, — это один или несколько из следующих (в зависимости от того, насколько несовместимы внутренности нового объекта с функциями Index):
-
get_loc: возвращает «индексатор» (целое число или, в некоторых случаях, объект среза) для метки -
slice_locs: возвращает «диапазон» для среза между двумя метками -
get_indexer: Вычисляет вектор индексирования для целей повторного индексирования/выравнивания данных. Подробнее об этом см. исходный код/строки документации -
get_indexer_non_unique: Вычисляет вектор индексирования для целей повторного индексирования/выравнивания данных, когда индекс не уникален. Подробнее об этом см. исходный код/строки документации -
reindex: Выполняет предварительную конвертацию входного индекса, а затем вызываетget_indexer -
union,intersection: вычисляет объединение или пересечение двух объектов Index -
insert: Вставляет новую метку в Index, возвращая новый объект -
delete: Удаляет метку, возвращая новый объект -
drop: Удаляет набор меток -
take: Аналогично ndarray.take
Многоуровневый индекс
Внутренне, MultiIndex состоит из нескольких вещей: уровней, целых кодов (до версии 0.24 назывались метками) и названий уровней:
In [1]: index = pd.MultiIndex.from_product([range(3), ['one', 'two']],
...: names=['first', 'second'])
...:
In [2]: index
Out[2]:
MultiIndex([(0, 'one'),
(0, 'two'),
(1, 'one'),
(1, 'two'),
(2, 'one'),
(2, 'two')],
names=['first', 'second'])
In [3]: index.levels
© 2008–2012, AQR Capital Management, LLC, Lambda Foundry, Inc. and PyData Development Team
Licensed under the 3-clause BSD License.
https://pandas.pydata.org/pandas-docs/version/0.25.0/development/internals.html