使用计算列操作列表

Manipulate List with calculating column

我正在使用 iPython 2.7,我想将生产系统分析为网络。

因此,我正在尝试从 csv-file 中创建一个网络。 csv-file 包括两列。第一列是工单的表示;第二个代表工作站。工单代表模块。工作站必须是网络的节点。 在 data.csv-文件之后:

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 在 [= 中出现了两次17=] 2. 其实我的代码输出的是2. MachineID 10 in Modul5 也出现了两次。我的代码需要在最后 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

你的问题是你无条件地做了Nodes.append(row[1])。因此,每次遇到 machineID 时都会添加它,而不检查之前是否为同一订单附加了它。

因此,我能想到的最简单的解决方案是利用订单有序这一事实。你可以制作一个字典,将每台机器映射到它的最后一个订单。然后,如果机器以前从未遇到过,或者遇到过并且它的最后一个顺序与当前顺序不同,那么你只追加。这是我对您的代码进行更改的部分:

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- post 代码能够重现问题是很好的,但是试着自己想想,问题可能出在哪里,你认为哪里可以解决。

3- 当您解释问题时,请尝试将解释与代码联系起来。例如,我花了一段时间才弄清楚模块是一个订单。