2015-10-27 43 views
0

我正在使用iPython 2.7,我想將生產系統分析爲網絡。操作列表與計算列

因此,我試圖創建一個網絡出csv-filecsv-file包括兩列。第一列是工單的表示;第二個代表工作站。工單代表模塊。工作站必須是網絡的節點。 繼data.csv -File:

ORDER_ID,MACHINE_ID, 
0,0, 
0,1, 
1,1, 
2,2, 
2,3, 
2,4, 
2,5, 
2,6, 
2,1, 
2,7, 
2,2, 
3,8, 
3,1, 
4,9, 
5,10, 
5,10, 
5,5, 
5,11, 
5,0, 
5,12, 
5,13, 

只要OrderID具有相同的數字,它是一個模塊。所以在這個列表中有五個模塊。創建邊緣的算法是網絡分析的第一部分。該算法在同一模塊中創建邊。該算法的工作原理,這不是我的問題的一部分。以下代碼必須分析模塊中的機器分配。

例如:本機ID 2是OrderID 2.所以,我需要在我的結果解決方案1一部分,但機器ID 2出現在OrderID 2.其實我的代碼的輸出是2 MachineIDModul5 10出現兩次兩次,以及。我的代碼需要在最後的for-loop (Analysis)中添加。我猜這個代碼需要一個if支票,每Module(OrderID)增加一個machineID一次。

由於兩列的相互依賴性,我無法找到解決方案。 我當前的代碼:

#Import Module 
import networkx as nx 
import csv 

#Create Graph 
g = nx.DiGraph() 

#open File 
Data = open("Data.csv") 
csv_F = csv.reader(Data,delimiter=',') #open File "data.csv" 
Data.next()       #skiping first row in file 

#Algorithmus for creating Edges 
prevOrder = -1 
prevMachine = -1 
Nodes = []      #creating file for calculate sum of nodes 
SumModul = []      #creating file for calculate sum of moduls 
for row in csv_F:  
    if row[0] == prevOrder: 
     g.add_edge(str(prevMachine),str(row[1])) 
    prevOrder = row[0] 
    prevMachine = row[1] 
    Nodes.append(row[1]) 
    SumModul.append(row[0])    # Add Index to List of Moduls 
    QuaModul = len(list(set(SumModul))) # Quantity of Moduls 
Data.close() 

#Node Reuse 
print "Quantity of Moduls: "+ str(QuaModul) 

#Sort List of Nodes to get Sum of sorted nodes 
QuantityNodes = [] 
for node in g.nodes(): 
    QuantityNodes.append(int(node)) 
    QuantityNodes.sort() 

#Analysis 
for sortNode in QuantityNodes: #for-loop for nodes 
    NodeRU = [Nodes.count(str(sortNode))] 
    for NRU in NodeRU: 
     print "Node Reuse of Node: " + str(sortNode) 
     print float(NRU) 
     print float((float(NRU)*100)/QuaModul) 

我期待下面的結果:

Qantity of Moduls: 6 
Node Reuse of Node: 0 
2.0 
33.3333333333 
Node Reuse of Node: 1 
4.0 
66.6666666667 
Node Reuse of Node: 2 
1.0 
16.6666666667 
Node Reuse of Node: 3 
1.0 
16.6666666667 
Node Reuse of Node: 4 
1.0 
16.6666666667 
Node Reuse of Node: 5 
2.0 
33.3333333333 
Node Reuse of Node: 6 
1.0 
16.6666666667 
Node Reuse of Node: 7 
1.0 
16.6666666667 
Node Reuse of Node: 8 
1.0 
16.6666666667 
Node Reuse of Node: 10 
1.0 
16.6666666667 
Node Reuse of Node: 11 
1.0 
16.6666666667 
Node Reuse of Node: 12 
1.0 
16.6666666667 
Node Reuse of Node: 13 
1.0 
16.6666666667 
+0

什麼是你的「分佈」的邏輯和你的代碼不清楚:什麼是「g」和「add_edge」?如果你不能顯示一個小的可重複的代碼,我們不能提供幫助。試着簡化你的「計算」要求,因爲這不是你的主要問題,你可能只是想要像「groupby」這樣的東西 – Anzel

+1

@Anzel - 'g'是一個networkx有向圖 - 它是代碼的第5行,而networkx是其中一個標籤。 'add_edge'是最常見的networkx命令之一。不出所料,它爲'g'增添了一個優勢。 – Joel

+0

請原諒我。現在希望它更易於理解。 –

回答

1

你的問題是,你無條件做Nodes.append(row[1])。因此,每次遇到machineID時,都會添加它,而不檢查它是否先前附加了相同的Order。

因此,我能想到解決這個問題的最簡單的解決方案就是利用訂單有序的事實。你可以創建一個字典,將每臺機器映射到最後一個訂單。然後,如果機器以前從未遇到過,或者遇到過,並且其最後一個訂單與當前訂單不同,那麼您只能追加。這裏就是我更改了代碼的一部分:

d = {} # Machine to last order dictionary 
for row in csv_F:  
    if row[0] == prevOrder: 
     g.add_edge(str(prevMachine),str(row[1])) 
    prevOrder = row[0] 
    prevMachine = row[1] 
    #check that the machine has never been encountered before or that its last order is different from its current one. 
    if (row[1] not in d or (row[1] in d and d[row[1]] != row[0])): 
     Nodes.append(row[1]) 
    SumModul.append(row[0])    # Add Index to List of Moduls 
    d[row[1]] = row[0] # map the machine to its order 
    QuaModul = len(list(set(SumModul))) # Quantity of Moduls 
Data.close() 

提示寫一個更好的問題你的代碼是非常難走,我花了很長的時間來了解你的問題,我很幸運,我以前已經回答過有關同一主題的問題。因此,在提問時請注意以下事項:

1-儘量讓您的代碼更具可讀性,例如您可以爲自己添加一些註釋,以便我們能夠跟蹤正在發生的事情。

2-發佈代碼以便能夠重現問題很好,但試着想一想自己,問題可能在哪裏以及您認爲哪些問題可以解決。

3-當您解釋問題時,嘗試將解釋與代碼關聯起來。例如,我花了一段時間才發現模塊是一個命令。

+1

感謝您的幫助和方便的提示。下次我會跟着他們。代碼有效! –