【问题标题】:how to create an adjacency matrix with time overlaps?如何创建具有时间重叠的邻接矩阵?
【发布时间】:2019-04-10 03:20:19
【问题描述】:

考虑这个简单的例子

#python bros
pd.DataFrame({'id' : [1,1,2,3],
                       'time_in' : [0,30,1,5],
                       'time_out' : [2,35,3,6]})
Out[66]: 
   id  time_in  time_out
0   1        0         2
1   1       30        35
2   2        1         3
3   3        5         6


#R bros
dplyr::data_frame(id = c(1,1,2,3),
                  time_in = c(0,30,1,5),
                  time_out = c(2,35,3,6))

在这里,解释很简单。

个人1 在时间0 和时间2 之间停留在给定地点。个人2 在时间1 和时间3 之间停留在那里。因此,个人 2 遇到了个人 1 并在我的网络中连接到它。

也就是说,我的网络的节点是id,如果它们的[time_in, time_out]间隔重叠,两个节点之间就有一条边。

有没有一种有效的方法可以从这些输入数据中生成adjacency matrixedge list,以便我可以在networkx 等网络包中使用它?我的真实数据集远不止于此。

谢谢!

【问题讨论】:

  • 两者。我不介意使用任何一个。这看起来像一个非标准问题......

标签: python r pandas dplyr networkx


【解决方案1】:

我认为这是制作邻接矩阵的可能解决方案。想法是将每个时隙相互比较,然后减少顶点组的比较。

import numpy as np
import pandas as pd

df = pd.DataFrame({'id' : [1, 1, 2, 3],
                   'time_in' : [0, 30, 1, 5],
                   'time_out' : [2, 35, 3, 6]})
# Sort so equal ids are together
df.sort_values('id', inplace=True)
# Get data arrays
ids = df.id.values
t_in = df.time_in.values
t_out = df.time_out.values
# Graph vertices
vertices = np.unique(ids)
# Find time slot overlaps
overlaps = (t_in[:, np.newaxis] <= t_out) & (t_out[:, np.newaxis] >= t_in)
# Find vertex group slices
reduce_idx = np.concatenate([[0], np.where(np.diff(ids) != 0)[0] + 1])
# Reduce by vertex groups to make adjacency matrix
connect = np.logical_or.reduceat(overlaps, reduce_idx, axis=1)
connect = np.logical_or.reduceat(connect, reduce_idx, axis=0)
# Clear diagonal if you want to remove self-connection
i = np.arange(len(vertices))
connect[i, i] = False
# Adjacency matrix as data frame
graph_df = pd.DataFrame(connect, index=vertices, columns=vertices)
print(graph_df)

输出:

       1      2      3
1  False   True  False
2   True  False  False
3  False  False  False

【讨论】:

  • 很好,但我想知道它是如何随着多行扩展的。我们不能在这里使用 pandas 而不是 raw numpy 吗?
  • @ℕʘʘḆḽḘ 也许吧,虽然我不确定如何(也许其他人可以解决)。我的意思是你显然可以按id 分组,但我不知道其余的。根据数据,可能还有其他可能的算法。例如,如果时隙始终是整数,您可以将每个顶点的存在表示为布尔数组并对其进行操作,尽管我不确定在什么条件下会更好或更坏。
  • 谢谢。也可能是获得edge list 比获得adjacency matrix 更容易
猜你喜欢
  • 2023-01-21
  • 1970-01-01
  • 2018-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多