繁体   English   中英

用计算列处理列表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM