Python:如何从csv文件创建图形节点和边缘?

时间:2015-07-12 05:41:48

标签: python nodes graph-theory networkx

我有一个csv数据文件,其中每行表示一个事件。一个简化的例子是,

  Datetime                 ColA     ColB    ColC   
  2015/07/12 08:45:34      ABC       12      
  2015/07/12 08:46:04      DCD       10     ABC 
  2015/07/12 08:46:23      XYZ       34     ABC 
  2015/07/12 08:46:56      MNO       10     XYZ
  2015/07/12 08:46:56      FGH       20     

因此,每一行都是node,其属性由每列Datetime, ColA, ColB, ColC的值表示。这些节点中的每一个都通过ColAColC之间的关系连接。

因此,在此示例中,从第1行到第2行和第3行存在边,因为后面行的ColC等于第一行的ColA。行3和行4类似地通过有向边连接。

第1行没有ColC,因此它没有连接到更高的任何节点,因此第5行也是如此。

如何创建图形数据结构以在Python中创建此关系?它们都应按时间顺序排序,如果有两行ColA与行ColC匹配,则选择时间更接近的行。

1 个答案:

答案 0 :(得分:0)

您可以构建一个二分图,其中日期时间为一部分,ColA / ColC值为另一部分。然后将图形“投影”到日期时间节点上 - 如果它们都链接到ColA / ColC节点,则在两个日期时间之间创建链接。

以下是一些代码,显示了创建无向图的一种方法。我不明白你的例子中的方向是什么意思。

import csv
import StringIO
import networkx as nx
from networkx.algorithms import bipartite

data ="""Datetime,ColA,ColB,ColC
2015/07/12 08:45:34,ABC,12,
2015/07/12 08:46:04,DCD,10,ABC
2015/07/12 08:46:23,XYZ,34,ABC
2015/07/12 08:46:56,MNO,10,XYZ
2015/07/12 08:46:56,FGH,20,"""

G = nx.Graph()
csvfile = StringIO.StringIO(data)
reader = csv.DictReader(csvfile)
nodes = []
for row in reader:
    nodes.append(row['Datetime'])
    G.add_node(row['Datetime'])
    if row['ColA'] != '':
        G.add_edge(row['Datetime'],row['ColA'])
    if row['ColC'] != '':
        G.add_edge(row['Datetime'],row['ColC'])
print G.edges()
B = bipartite.projected_graph(G, nodes)
print B.edges()

输出

[('2015/07/12 08:46:23', 'XYZ'), ('2015/07/12 08:46:23', 'ABC'), ('ABC', '2015/07/12 08:46:04'), ('ABC', '2015/07/12 08:45:34'), ('DCD', '2015/07/12 08:46:04'), ('FGH', '2015/07/12 08:46:56'), ('2015/07/12 08:46:56', 'XYZ'), ('2015/07/12 08:46:56', 'MNO')]
[('2015/07/12 08:46:23', '2015/07/12 08:46:04'), ('2015/07/12 08:46:23', '2015/07/12 08:46:56'), ('2015/07/12 08:46:23', '2015/07/12 08:45:34'), ('2015/07/12 08:46:04', '2015/07/12 08:45:34')]