2015-07-12 99 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