pandas.Interval.overlapsを使って2つのIntervalが重なるかどうかを判定する方法


pandas.Interval.overlapsは、2つのIntervalオブジェクトが重なっているかどうかを確認するためのメソッドです。Intervalオブジェクトは、開始点と終了点を持つ範囲を表すデータ構造です。

pandas.Interval.overlaps(other, include_endpoints=True)

引数

  • include_endpoints: Trueの場合、閉じた端点も重なりとみなされます。デフォルトはTrueです。
  • other: 重なりを確認するIntervalオブジェクト

戻り値

  • False: 2つのIntervalオブジェクトが重なっていない場合
  • True: 2つのIntervalオブジェクトが重なっている場合

詳細

2つのIntervalオブジェクトが重なるかどうかは、以下の条件のいずれかに該当する場合です。

  • 2つのIntervalオブジェクトの1つの閉じた端点がもう1つのIntervalオブジェクトの内部にある
  • 1つのIntervalオブジェクトがもう1つのIntervalオブジェクト全体を完全に含む

例えば、以下のIntervalオブジェクトは重なっています。

interval1 = pd.Interval(left=0, right=10)
interval2 = pd.Interval(left=5, right=15)

一方、以下のIntervalオブジェクトは重なっていない。

interval1 = pd.Interval(left=0, right=5)
interval2 = pd.Interval(left=10, right=15)

import pandas as pd

interval1 = pd.Interval(left=0, right=10)
interval2 = pd.Interval(left=5, right=15)

result = interval1.overlaps(interval2)
print(result)

このコードは、interval1interval2が重なっているかどうかを確認し、Trueを出力します。

  • pandas.Seriesオブジェクトには、overlapsメソッドがあり、Seriesオブジェクト内のすべてのIntervalオブジェクトと指定されたIntervalオブジェクトとの重なりを確認できます。
  • pandas.IntervalIndexクラスには、overlapsメソッドがあり、IntervalIndex内のすべてのIntervalオブジェクトと指定されたIntervalオブジェクトとの重なりを確認できます。


例1:2つのIntervalオブジェクトの重なりを確認する

import pandas as pd

interval1 = pd.Interval(left=0, right=10)
interval2 = pd.Interval(left=5, right=15)

result = interval1.overlaps(interval2)
print(result)

例2:IntervalIndex内のすべてのIntervalオブジェクトと指定されたIntervalオブジェクトとの重なりを確認する

import pandas as pd

intervals = pd.IntervalIndex([pd.Interval(left=0, right=10),
                             pd.Interval(left=15, right=20),
                             pd.Interval(left=25, right=30)])
interval = pd.Interval(left=5, right=22)

result = intervals.overlaps(interval)
print(result)

このコードは、intervals 内のすべてのIntervalオブジェクトと interval との重なりを確認し、ブール型の配列を出力します。各要素は、対応するIntervalオブジェクトと interval が重なっているかどうかを表します。

例3:pandas.Seriesオブジェクト内のすべてのIntervalオブジェクトと指定されたIntervalオブジェクトとの重なりを確認する

import pandas as pd

s = pd.Series([pd.Interval(left=0, right=10),
                pd.Interval(left=15, right=20),
                pd.Interval(left=25, right=30)],
              index=['a', 'b', 'c'])
interval = pd.Interval(left=5, right=22)

result = s.overlaps(interval)
print(result)

このコードは、s 内のすべてのIntervalオブジェクトと interval との重なりを確認し、abc キーに対応するブール値を出力します。



比較演算子を使う

最も単純な代替方法は、比較演算子を使って2つのIntervalオブジェクトを直接比較することです。例えば、以下のコードは、interval1interval2 が重なっているかどうかを判定します。

import pandas as pd

interval1 = pd.Interval(left=0, right=10)
interval2 = pd.Interval(left=5, right=15)

result = (interval1.left <= interval2.right) and (interval1.right >= interval2.left)
print(result)

このコードは、interval1.leftinterval2.right 以下であり、かつ interval1.rightinterval2.left 以上であるかどうかを確認します。2つの条件が両方とも真の場合、Intervalオブジェクトは重なっていると判定されます。

numpy.intersect1d を使う

numpy.intersect1d 関数は、2つの1次元配列の共通要素を見つけるために使用できます。この関数を Intervalオブジェクトの端点に適用することで、2つのIntervalオブジェクトが重なっているかどうかを判定することができます。

import pandas as pd
import numpy as np

interval1 = pd.Interval(left=0, right=10)
interval2 = pd.Interval(left=5, right=15)

endpoints1 = np.array([interval1.left, interval1.right])
endpoints2 = np.array([interval2.left, interval2.right])

common_endpoints = np.intersect1d(endpoints1, endpoints2)
result = len(common_endpoints) > 0
print(result)

このコードは、interval1interval2 の端点を NumPy 配列に変換し、np.intersect1d 関数を使って共通要素を見つけます。共通要素が1つ以上ある場合、Intervalオブジェクトは重なっていると判定されます。

Intervalオブジェクトを扱うためのライブラリは他にもいくつかあります。例えば、Shapely や GeoPandas は、空間データ解析のためのライブラリであり、Intervalオブジェクトを含む幾何オブジェクトを扱うための機能を提供しています。これらのライブラリを使用すると、より複雑な形状の重なりを判定することができます。