pandas.IntervalIndex.mid для полуоткрытого IntervalIndex - PullRequest
0 голосов
/ 28 августа 2018

Мне приходится иметь дело с сериями с полуоткрытым интервалом в качестве индекса, как этот:

import pandas as pd

index = pd.interval_range(5,50,9, closed='left')
values = [8, 8, 14, 4, 6, 12, 8, 3, 2]

s = pd.Series(values, index)
s

выход

[5, 10)      8
[10, 15)     8
[15, 20)    14
[20, 25)     4
[25, 30)     6
[30, 35)    12
[35, 40)     8
[40, 45)     3
[45, 50)     2
dtype: int64

Я хочу автоматически вычислить среднюю точку и использовать ее за сценой для вычислений.

Если я использую функцию pandas.IntervalIndex.mid, которая, согласно документации, " возвращает среднюю точку каждого интервала в IntervalIndex в качестве индекса ", я получаю:

Float64Index([7.5, 12.5, 17.5, 22.5, 27.5, 32.5, 37.5, 42.5, 47.5], dtype='float64')

Проблема в том, что мой интервал равен closed='left', поэтому ожидаемый результат:

Float64Index([7., 12., 17., 22., 27., 32., 37., 42., 47.], dtype='float64')

Если интервал был closed='right', я ожидаю:

Float64Index([8., 13., 18., 23., 28., 33., 38., 43., 48.], dtype='float64')

Есть ли способ автоматически получить половину точки для открытого или полуоткрытого интервала без указания смещения для значений, возвращаемых pandas.IntervalIndex.mid? Для серии, использованной в примере, смещение будет равно -0,5.

1 Ответ

0 голосов
/ 28 августа 2018

Для IntervalIndex, закрытого слева, вы можете использовать np.floor, чтобы получить ожидаемый индекс следующим образом:

np.floor(index.mid)

Результат:

Float64Index([7.0, 12.0, 17.0, 22.0, 27.0, 32.0, 37.0, 42.0, 47.0], dtype='float64')

Для более общего решения вы можете определить метод, который проверяет, как закрываются интервалы:

def index_mid(index):
    if index.closed == 'left':
        return np.floor(index.mid)
    elif index.closed == 'right':
        return np.ceil(index.mid)
    else:
        return index.mid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...