[英]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
具有相同的编号,它就是一个模块。 因此,此列表中有五个模块。 创建Edge的算法是网络分析的第一部分。 当边缘在同一模块中时,该算法会创建它们。 该算法有效,这不是我的问题的一部分。 以下代码必须分析模块中的Machine分布。
例如:机器ID
2是OrderID
2的一部分。因此,我的结果中需要解决方案1,但是机器ID
2在OrderID
2中出现了两次。实际上我的代码输出是Modul5
中的MachineID
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
您的问题是您无条件执行Nodes.append(row[1])
。 因此,每次遇到machineID时,都会添加该ID,而无需检查它是否先前已为同一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-当您解释问题时,请尝试将解释与代码联系起来。 例如,我花了一段时间才知道模数是命令。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.