从 Pandas DataFrame 或 CSV 生成图表工具图表
Generating graph-tool graph from Pandas DataFrame or CSV
我已经开始使用 graph-tool
,希望它是一个 python 库,可以让我分析大图(~8M
个顶点,~22M
个边,在 Pandas DataFrame / CSV 中)。 'source' 和 'target' 列是特定数字服务的用户 ID。
我从一个玩具示例开始,遵循方法 in this post。
import pandas as pd
df = pd.DataFrame({'source':range(11,15), 'target':range(12,16)})
g = Graph(directed=True)
g.add_edge_list(df.values)
你可以在我的虚拟示例中看到,只有 5 个不同的顶点 (11, 12, 13, 14, 15)
。然而,当我生成图形时,创建了 16 个顶点,似乎填补了 0 和最大节点值之间的差距。
g.get_vertices()
returns:
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], dtype=uint64)
我假设 graph-tool 'reads' df 的值作为索引,而不是实际顶点的名称。这是从 docs:
Each vertex in a graph has an unique index, which is always between
:math:0 and :math:N-1, where :math:N is the number of vertices.
我如何创建没有这些冗余顶点的图(如果我导入我的数据,可能有数百万个),以及如何使用我的用户 ID 不被视为索引?
我一直在翻阅可用的方法/文档,但无法弄清楚,对于从 df 案例大量导入。
我还尝试了什么:
df.to_csv('test.csv', index=False)#, header=False)
g2 = graph_tool.load_graph_from_csv('test.csv', skip_first=True)
这似乎创建了一个只有 5 个顶点的图,但是 'loses' 它们的名称(用户 ID)。
g2.get_vertices()
returns
array([0, 1, 2, 3, 4], dtype=uint64)
而不是 [11, 12, 13, 14, 15]
。
感谢您的帮助!提前致谢。
我在 Jupyter/Anaconda
上使用 python 2.7
。
你想要的是通过add_edge_list()
方法的hashed
参数启用的:
vmap = g.add_edge_list(df.values, hashed=True)
其中 vmap
是一个 属性 地图,顶点为 "names"。
来自文档字符串:
Optionally, if hashed == True
, the vertex values in the edge list
are not assumed to correspond to vertex indices directly. In this case
they will be mapped to vertex indices according to the order in which
they are encountered, and a vertex property map with the vertex values
is returned. If string_vals == True
, the algorithm assumes that the
vertex values are strings. Otherwise, they will be assumed to be numeric
if edge_list
is a :class:~numpy.ndarray
, or arbitrary python
objects if it is not.
请注意,为了保证高效的数据结构,在图形工具中,顶点总是 连续的整数,因此它们总是从 0 到 N-1 编号。如果你想给它们不同的 "names",你必须使用 属性 地图,如文档中所述。
我已经开始使用 graph-tool
,希望它是一个 python 库,可以让我分析大图(~8M
个顶点,~22M
个边,在 Pandas DataFrame / CSV 中)。 'source' 和 'target' 列是特定数字服务的用户 ID。
我从一个玩具示例开始,遵循方法 in this post。
import pandas as pd
df = pd.DataFrame({'source':range(11,15), 'target':range(12,16)})
g = Graph(directed=True)
g.add_edge_list(df.values)
你可以在我的虚拟示例中看到,只有 5 个不同的顶点 (11, 12, 13, 14, 15)
。然而,当我生成图形时,创建了 16 个顶点,似乎填补了 0 和最大节点值之间的差距。
g.get_vertices()
returns:
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], dtype=uint64)
我假设 graph-tool 'reads' df 的值作为索引,而不是实际顶点的名称。这是从 docs:
Each vertex in a graph has an unique index, which is always between :math:0 and :math:N-1, where :math:N is the number of vertices.
我如何创建没有这些冗余顶点的图(如果我导入我的数据,可能有数百万个),以及如何使用我的用户 ID 不被视为索引? 我一直在翻阅可用的方法/文档,但无法弄清楚,对于从 df 案例大量导入。
我还尝试了什么:
df.to_csv('test.csv', index=False)#, header=False)
g2 = graph_tool.load_graph_from_csv('test.csv', skip_first=True)
这似乎创建了一个只有 5 个顶点的图,但是 'loses' 它们的名称(用户 ID)。
g2.get_vertices()
returns
array([0, 1, 2, 3, 4], dtype=uint64)
而不是 [11, 12, 13, 14, 15]
。
感谢您的帮助!提前致谢。
我在 Jupyter/Anaconda
上使用 python 2.7
。
你想要的是通过add_edge_list()
方法的hashed
参数启用的:
vmap = g.add_edge_list(df.values, hashed=True)
其中 vmap
是一个 属性 地图,顶点为 "names"。
来自文档字符串:
Optionally, if
hashed == True
, the vertex values in the edge list are not assumed to correspond to vertex indices directly. In this case they will be mapped to vertex indices according to the order in which they are encountered, and a vertex property map with the vertex values is returned. Ifstring_vals == True
, the algorithm assumes that the vertex values are strings. Otherwise, they will be assumed to be numeric ifedge_list
is a :class:~numpy.ndarray
, or arbitrary python objects if it is not.
请注意,为了保证高效的数据结构,在图形工具中,顶点总是 连续的整数,因此它们总是从 0 到 N-1 编号。如果你想给它们不同的 "names",你必须使用 属性 地图,如文档中所述。