Внутреннее устройство
В этом разделе представлен взгляд на внутреннее устройство 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: диапазон дат с фиксированной частотой, сгенерированный по временным правилам или смещениям дат. Массив ndarray объектов Python datetime -
period_range: диапазон дат с фиксированной частотой, сгенерированный по временным правилам или смещениям дат. Массив 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(levels=[[0, 1, 2], ['one', 'two']],
codes=[[0, 0, 1, 1, 2, 2], [0, 1, 0, 1, 0, 1]],
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.24.2/development/internals.html