В чем разница между уникальным индексом и монотонным c индексом? - PullRequest
2 голосов
/ 28 марта 2020

Я пытаюсь использовать pandas .Index.get_lo c, чтобы вернуть индекс (как int) ближайшего значения, но иногда он возвращает объект slice вместо. Согласно документации,

get_lo c возвращает int, если уникальный индекс, slice, если monotoni c index, иначе маска.

Но это не выглядит вроде поведение последовательное. Например, со следующим индексом:

idx = pd.DatetimeIndex(['2019-12-24 12:04:54',
                        '2019-12-26 20:09:22',
                        '2020-12-27 07:44:35'])

Использование idx.get_loc('2019-12-27', method='ffill') возвращает slice(2, 2, None), тогда как idx.get_loc('2019-12-29', method='ffill') возвращает 2. Изменение метода с 'ffill' на 'bfill', похоже, не меняет результат.

Моя цель - вырезать все точки в начале индекса, как idx[:i], где i - целое число возвращается get_loc. Другое решение может изменить начало объекта slice, если это возможно.

Редактировать: По-видимому, slice является встроенным объектом с read -только атрибуты данных start, stop и step (см. документы здесь ). Это означает, что вы можете проверить, является ли результат get_loc значением int, а если нет, используйте idx[:slice.stop], чтобы получить все элементы до нужного индекса.

Меня все еще интересует исходный вопрос хотя.

1 Ответ

2 голосов
/ 28 марта 2020

Давайте начнем с базовых c определений.

Уникальный индекс

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

Чтобы проверить, является ли данный индекс уникальным, можно использовать атрибут pd.Index.is_unique, например:

>>> pd.Index(['s', 'a', 'm']).is_unique
True
>>> pd.Index(['s', 'a', 'm', 'a']).is_unique
False

В качестве документации Как уже упоминалось, примером такого индекса может быть pd.Index(list('abc')), содержащий три уникальные метки a, b и c, который также является монотонным c. уникальным немонотонным c индексом может быть, например, pd.Index(list('acb')), который нарушает прямой ордер при обратном движении от c до b.

Monotoni c Индекс

Монотонность - это математическое свойство, которое указывает, что данная функция поддерживает неубывающий или неубывающий порядок во всей своей области. В pandas, monotoni c index - это индекс, который следует за этим свойством.

Аналогично уникальности, вы можете проверить монотонность индекса с атрибутом, pd.Index.is_monotonic или его производные, т.е. pd.Index.is_monotonic_increasing и pd.Index.is_monotonic_decreasing.

. В этом случае в документации представлен другой пример: pd.Index(list('abbc')), который является неуникальным монотонным c индексом с дублирующейся меткой b. Также упоминается неуникальный немонотонный индекс c, pd.Index(list('abcb')). Дублированная метка снова b, в то время как ордер нарушен на c -> b, что противоречит ранее установленному ордеру a -> b -> c.


pd.Index.get_lo c

Этот pandas метод индекса использует предопределенные концепции для определения его возвращаемого значения. Его ожидаемое поведение определяется следующим образом. Если индекс уникален, то он должен возвращать значение индекса int. Если он не уникален, метод учитывает монотонность индекса. Если он окажется монотонным, он возвращает slice. В противном случае он возвращает маску.

Ваш индекс выборки, idx уникален (и монотонен, хотя и не имеет значения), поэтому вы ожидаете, что get_loc должен вернуть int. Однако это гарантируется только для точных совпадений с метками. Это не верно для частичных совпадений, таких как те, которые вы используете. Я оставляю вас с выводом, который показывает разницу в использовании:

>>> idx.get_loc('2019-12-24')
slice(0, 1, None)
>>> idx.get_loc('2019-12-24 12:04:54')
0
...