使用计算列操作列表
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- 当您解释问题时,请尝试将解释与代码联系起来。例如,我花了一段时间才弄清楚模块是一个订单。
我正在使用 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- 当您解释问题时,请尝试将解释与代码联系起来。例如,我花了一段时间才弄清楚模块是一个订单。