2015-07-12 96 views
0

我有一个csv数据文件,其中每行表示一个事件。一个简单的例子是,Python:如何从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,则选择时间更接近的行。

+0

你可以用邻接表来呈现图形结构。看看这篇文章。 http://interactivepython.org/LpOMZ/courselib/static/pythonds/Graphs/graphintro.html#an-adjacency-list – czheo

+0

@czheo谢谢你的建议。我试图创建所有列作为属性的节点。超出了这里简单示例所示的内容。 – sfactor

回答

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')] 
+0

感谢您的答案。关于箭头的含义。这就像父母的孩子关系。因此,第1行将是第2行和第3行的父代。 – sfactor

+0

由于第1行在第2和第3行之前?你应该能够通过查看时间戳来捕获。 – Aric