Я хочу вычислить сходство между элементами (0,1,2,3 ..) на основе их временной информации. Временная информация может быть мгновенной (начальная), временным интервалом (startdate, enddate) или null (NaT); см. пример кадра данных (df_for) ниже.Python - вычислить сходство между элементами на основе временной информации (мгновенный, интервал)
- {мгновенная, мгновенные}: если равно сим = 1, в противном случае сим = 0
- {мгновенная, нуль} или наоборот, сим = 0
- {мгновенная, интервал} : если мгновенно в пределах интервала, sim = 1 или если интервал содержит момент, sim = 1
- {интервал, интервал}: если интервалы перекрываются, sim = пересечение обоих интервалов/объединение обоих интервалов
- {interval, интервал}: если a terval содержит другое, затем sim = 1
Следующий код на основе python получает временную информацию из фрейма данных и выполняет условия выше (1-5). Код является подробным, мне интересно, есть ли умный способ/lib для вычисления подобия между периодами времени и моментами времени с использованием python.
m, k = df_for.shape
sim = np.zeros((m, m))
data = df_for.values
for i in range(m):
for j in range(m):
if i != j:
st1 = data[i][0]
ed1 = data[i][1]
st2 = data[j][0]
ed2 = data[j][1]
#both items are null values
if pd.isnull(st1) and pd.isnull(ed1) and pd.isnull(st2) and pd.isnull(ed2):
sim[i][j] = 0.
# {instant, instant} => equal, not equal
if pd.notnull(st1) and pd.isnull(ed1) and pd.notnull(st2) and pd.isnull(ed2):
if st1 == st2:
sim[i][j] = 1.
else:
sim[i][j] = 0.
# {instant, null} => sim is 0
if pd.notnull(st1) and pd.isnull(ed1) and pd.isnull(st2) and pd.isnull(ed2):
sim[i][j] = 0.
# {instant, interval} => meets, during
if pd.notnull(st1) and pd.isnull(ed1) and pd.notnull(st2) and pd.notnull(ed2):
if(st2 <= st1 <= ed2):
sim[i][j] = 1. #a time is between two other times
else:
sim[i][j] = 0.
# {interval, instant} => meets, contains
if pd.notnull(st1) and pd.notnull(ed1) and pd.notnull(st2) and pd.isnull(ed2):
if(st1 <= st2 <= ed1):
sim[i][j] = 1. #a time is between two other times
else:
sim[i][j] = 0.
# {interval, interval} => equal, overlaps, not overlaps
if pd.notnull(st1) and pd.notnull(ed1) and pd.notnull(st2) and pd.notnull(ed2):
if (st1 <= st2 <= ed1) or (st2 <= st1 <= ed2):
intersect = min(ed1,ed2)- max(st1,st2) # earliestend-lateststart
union = max(st1,st2,ed1,ed2) - min(ed1,ed2,st1,st2)
overlaps = intersect/union
#print(intersect/np.timedelta64(1, 'D'),union/np.timedelta64(1, 'D'))
if (st1 > st2 and ed1 < ed2) or (st1 < st2 and ed1 > ed2): # contains, during
overlaps = 1.0
sim[i][j]=overlaps
else:
sim[i][j] = 0.
else:
sim[i][j] = 1.
спасибо за улучшение кода. это min_interval, ссылающийся на «размер меньшего интервала (а не размер объединения)»? i обновил ed1, ed2 в вашем коде до et1, et2 .. – kitchenprinzessin
Да, это то, что должна сделать эта часть кода. Я пропустил несколько переменных 'ed', поэтому я отредактировал их, чтобы исправить их. – Blckknght
спасибо.Интересно, может ли этот случай (разрыв в сходстве) примениться к {мгновенному, мгновенному} тоже. – kitchenprinzessin