import pandas idx = pandas.interval_range(start=None, end=None, periods=None, freq=None, name=None, closed='right')
start=None
- левая граница для создания интервалов. Приминает число для цифровых интервалов или объект pandas.Timestamp
для временных интервалов.end=None
- правая граница для создания интервалов. Приминает число для цифровых интервалов или объект pandas.Timestamp
для временных интервалов.periods=None
- целое число - количество периодов для генерации.freq=None
- длина каждого интервала. Должно соответствовать передаваемому типу аргументам start
и end
, например, 2 для числового интервала или '5H'
для временного интервала. По умолчанию - 1 для числовых значений и 'D'
для даты/времени.name=None
- имя результирующего IntervalIndex
.closed='right'
- как закрывать или вообще НЕ закрывать интервалы. Принимает следующие строки: 'left'
, 'right'
, 'both'
, 'neither'
.
Аргумент
closed
на примере числовых интервалов: замкнутый интервал (в математике обозначаемый квадратными скобками) содержит свои конечные точки, т. е. замкнутый интервал[0, 5]
характеризуется условиями0 <= x <= 5
. Это то, что означаетclosed='both'
. Открытый интервал (в математике обозначаемый круглыми скобками) не содержит своих конечных точек, т. е. открытый интервал(0, 5)
характеризуется условиями0 < x < 5
. Это то, что означаетclosed='neither'
. Интервалы также могут быть полуоткрытыми или полузакрытыми, т.е.[0, 5)
описывается0 <= x < 5
(closed='left'
), а(0, 5]
описывается0 < x <= 5
(closed='right'
).
IntervalIndex
.Функция interval_range()
модуля pandas
создает и возвращает IntervalIndex
фиксированной частоты по заданным параметрам.
Из четырех аргументов start
, end
, period
и freq
необходимо указать ровно три. Если аргумент freq
опущен, то результирующий IntervalIndex
будет содержать элементы с интервалами, линейно расположенными между началом start
и концом end
включительно.
Создание числовых интервалов:
>>> import pandas as pd >>> pd.interval_range(start=0, end=5) # IntervalIndex([(0, 1], (1, 2], (2, 3], (3, 4], (4, 5]], # dtype='interval[int64, right]')
Также поддерживается создание временных интервалов.
>>> pd.interval_range(start=pd.Timestamp('2024-01-01'), end=pd.Timestamp('2024-01-04')) # IntervalIndex([(2024-01-01 00:00:00, 2024-01-02 00:00:00], # (2024-01-02 00:00:00, 2024-01-03 00:00:00], # (2024-01-03 00:00:00, 2024-01-04 00:00:00]], # dtype='interval[datetime64[ns], right]')
Аргумент freq
определяет частоту между левым start
и правым end
конечными точками интервалов в результирующем индексе IntervalIndex
. Для создания числовых интервалов частота должна быть числом.
>>> pd.interval_range(start=0, periods=4, freq=1.5) # IntervalIndex([(0.0, 1.5], (1.5, 3.0], (3.0, 4.5], (4.5, 6.0]], # dtype='interval[float64, right]')
Для создания временных интервалов частота должна быть конвертирована в DateOffset
. Это значит что можно пользоваться значениями псевдонимами периодов временных рядов pandas
.
>>> pd.interval_range(start=pd.Timestamp('2024-01-01'), periods=3, freq='MS') # IntervalIndex([(2024-01-01 00:00:00, 2024-02-01 00:00:00], # (2024-02-01 00:00:00, 2024-03-01 00:00:00], # (2024-03-01 00:00:00, 2024-04-01 00:00:00]], # dtype='interval[datetime64[ns], right]')
Если в функцию pandas.interval_range()
передать начало start
, конец end
и периодичность periods
, то частота будет генерироваться автоматически (линейно).
>>> pd.interval_range(start=0, end=6, periods=4) # IntervalIndex([(0.0, 1.5], (1.5, 3.0], (3.0, 4.5], (4.5, 6.0]], # dtype='interval[float64, right]')
Аргумент closed
указывает, какие конечные точки отдельных интервалов в IntervalIndex
будут закрыты.
>>> pd.interval_range(end=5, periods=4, closed='both') # IntervalIndex([[1, 2], [2, 3], [3, 4], [4, 5]], # dtype='interval[int64, both]')
Бывают случаи, когда прочитанные данные уже содержат столбец интервалов, но представленный как простая строка Python. В таких случаях встает задача: как разобрать строку с интервалом в фактический интервал библиотеки pandas
? Так вот, можно проанализировать строку вручную, а затем преобразовать ячейки в IntervalIndex
:
import ast import pandas as pd def parse_str_interval(s): """Разбор СТРОКИ с интервалом""" table = str.maketrans({'[': '(', ']': ')'}) left_closed = s.startswith('[') right_closed = s.endswith(']') left, right = ast.literal_eval(s.translate(table)) t = 'neither' if left_closed and right_closed: t = 'both' elif left_closed: t = 'left' elif right_closed: t = 'right' return pd.Interval(left, right, closed=t) df1 = pd.DataFrame({'interval': {4: '(-0.001, 2.0]', 5: '(2.0, 6.0]'}, 'variable': {4: 'A', 5: 'A'}}) df1['interval'] = df1['interval'].apply(parse_str_interval) df2 = pd.DataFrame({'A': [1, 1, 3]}) bins = df1[df1.variable.eq('A')].interval new_series = pd.cut(df2['A'], bins=pd.IntervalIndex(bins)) print(new_series) # 0 (-0.001, 2.0] # 1 (-0.001, 2.0] # 2 (2.0, 6.0] # Name: A, dtype: category # Categories (2, interval[float64, right]): [(-0.001, 2.0] < (2.0, 6.0]]