假设我有四个间隔:
a = pd.Interval(0, 2)
b = pd.Interval(1, 2)
c = pd.Interval(0, 1.1)
d = pd.Interval(-1,-0.5)
最常见/最常见的重叠是1到1.1之间,因为所有a
,b
和c
(上面四个中的三个)都覆盖了该重叠。
在给定N个间隔列表的情况下,如何找到它?理想情况下,我想要一个可以接受上述4个间隔的列表并返回pd.Interval(1, 1.1)
作为输出的函数。
答案 0 :(得分:1)
我以为您正在尝试获取大多数其他间隔中包含的间隔,因为具有最常见重叠的间隔是(-1,1.1]
而不是(1,1.1]
,我不知道是否
我错了,但是使用pd.IntervalsIndex.overlaps我得到了:
import pandas as pd
from itertools import product
a = pd.Interval(0, 2)
b = pd.Interval(1, 2)
c = pd.Interval(0, 1.1)
d = pd.Interval(-1,-0.5)
ls=[a,b,c,d]
indexinter = pd.IntervalIndex(ls)
print(indexinter.overlaps(pd.Interval(1, 1.1)))
print('Interval (1,1.1] overlaps ',sum(indexinter.overlaps(pd.Interval(1, 1.1))),' of 4')
print('\n')
print(indexinter.overlaps(pd.Interval(-1, 1.1)))
print('Interval (-1,1.1] overlaps ',sum(indexinter.overlaps(pd.Interval(-1, 1.1))),' of 4')
输出:
[ True True True False]
Interval (1,1.1] overlaps 3 of 4
[ True True True True]
Interval (-1,1.1] overlaps 4 of 4
没什么,要获取大多数其他间隔中包含的间隔,您可以尝试以下方法:
import pandas as pd
import portion as P
d = pd.Interval(0, 2)
b = pd.Interval(1, 2)
c = pd.Interval(0, 1.1)
a = pd.Interval(-1,-0.5)
def getmaxoverlapwrap(ls,inter):
intervals=[P.openclosed(i.left, i.right) for i in ls]
for i in intervals[1:]:
newinter=inter&i
if newinter.empty==False:
inter=newinter
return inter
def getmaxoverlap(ls):
intervals=[P.openclosed(i.left, i.right) for i in ls]
ls1=[getmaxoverlapwrap(ls,i) for i in intervals]
index = list(map(lambda x: sum([(x in s) for s in ls]), ls1)).index(max(list(map(lambda x: sum([(x in s) for s in ls]), ls1))))
return ls1[index]
ls=[a,b,c,d]
indexinter = pd.IntervalIndex(ls)
print(getmaxoverlap(ls))
您必须安装库portion
(以前以python-intervals的形式分发),该库为Python 3.5+中的间隔提供了数据结构和操作,例如:-支持任意(可比)间隔)对象,-封闭或开放,有限或(半)无限间隔,-间隔集(原子间隔的联合),-间隔的自动简化等。
import pandas as pd
from itertools import product
a = pd.Interval(0, 2)
b = pd.Interval(1, 2)
c = pd.Interval(0, 1.1)
d = pd.Interval(-1,-0.5)
def getmostcontained(ls):
indexinter = pd.IntervalIndex([pd.Interval(inter.left, inter.right, closed='both') for inter in ls])
rights = [i.right for i in ls]
lefts=[i.left for i in ls]
allcomb = [pd.Interval(i[0],i[1]) for i in list(set(list(product(lefts, rights)))) if i[0]<=i[1]]
count=0
maxi=sum(indexinter.contains(allcomb[0].left))+sum(indexinter.contains(allcomb[0].right))
for i in allcomb:
newmaxi=sum(indexinter.contains(i.left))+sum(indexinter.contains(i.right))
if newmaxi>maxi:
count=allcomb.index(i)
return allcomb[count]
ls=[a,b,c,d]
print(getmostcontained(ls))
import pandas as pd
a = pd.Interval(0, 2)
b = pd.Interval(1, 2)
c = pd.Interval(0, 1.1)
d = pd.Interval(-1,-0.5)
def getmaxoverlap(ls):
indexinter = pd.IntervalIndex(ls)
start=ls[0].left
end=ls[0].right
checkstart=sum(indexinter.contains(start+0.00000000099))
checkend=sum(indexinter.contains(end))
for i in ls:
if sum(indexinter.contains(i.left+0.000000000099))>checkstart:
checkstart=sum(indexinter.contains(i.left+0.000000000099))
start=i.left
if sum(indexinter.contains(i.right))>checkend:
checkend=sum(indexinter.contains(i.right))
end=i.right
return pd.Interval(start, end)
ls=[a,b,c,d]
print(getmostcontained(ls))
所有选项的输出:
(1,1.1]
第一个选项花费0.025967300000047544 seconds
运行脚本的100倍,并花费27.19270740000138 seconds
运行脚本的100000倍,第二个选项花费0.15769210000144085 seconds
运行的脚本100倍,并且花费115.13360900000043 seconds
运行脚本的100000倍,第三种选择花费0.08970480000061798 seconds
运行脚本的100倍,并花费107.52801619999991 seconds
运行脚本的100000倍。至少在第二个和第三个选项上,这种差异可能几乎不明显,但是这里是我得到的时间戳,以便您知道并选择一个。