0

私はPythonを学んでいるので、助けていただければ幸いです。2 列のデータ セットがあります。1 つ目は一意の ID で、2 つ目はアイテムの文字列です。データからツリーを作成するために networkX を使用しています (以下を参照)。レベルごとのアイテム頻度を知る必要があります。たとえば、A のパス (1,2,3,4) の場合、各ノードのカウントは 1:4、2:2、3:2、および 4:2 である必要があります。ノード数を取得するにはどうすればよいですか?

私のデータは次のようになります。

A      1, 2, 3, 4
B      1, 2, 1, 4
C      1, 3, 4, 3
D      1, 4, 3, 2

私がこれまでに持っているコードは次のとおりです。

#create graph
G = nx.MultiGraph()

#read in strings from csv
testfile = 'C:…file.txt'

with open(testfile, "r") as f:
    line = f.readline
    f = (i for i in f if '\t' in i.rstrip())
    for line in f:
        customerID, path = line.rstrip().split("\t")
        path2 =  path.rstrip("\\").rstrip("}").split(",")
        pathInt = list()
        for x in path2:
            if x is not None:
                newx = int(x)
                pathInt.append(newx)
                print(pathInt)
        varlength = len(pathInt)
        pathTuple = tuple(pathInt)
        G.add_path([pathTuple[:i+1] for i in range(0, varlength)])

nx.draw(G)
plt.show() # display
4

1 に答える 1

0

まず、文字列リストから int タプルへの変換をもう少し簡潔にすることができます。

pathTuple = tuple(int(x) for x in path2 )
G.add_path([path[:i+1] for i in range(0, len(path))])

カウント データを格納するために、defaultdict で defaultdict を使用します。これは基本的に、二重インデックスを許可し、デフォルトで 0 になるデータ構造です。

import collections
counts = collections.defaultdict(lambda:collections.defaultdict(lambda:0))

これは、この種のアクセスにcounts[level][node]使用できます。パス内の位置を調べることで、各ノードが各レベルに出現する頻度をカウントするために使用できます。

この後、コードは次のようになります。

#create graph
G = nx.MultiGraph()

#read in strings from csv
testfile = 'C:…file.txt'

with open(testfile, "r") as f:
    line = f.readline
    f = (i for i in f if '\t' in i.rstrip())
    for line in f:
        customerID, path = line.rstrip().split("\t")
        path2 =  path.rstrip("\\").rstrip("}").split(",")
        pathTuple = tuple(int(x) for x in path2 )
        G.add_path([pathTuple[:i+1] for i in range(0, len(pathTuple))])

        for level, node in enumerate(path):
            counts[level][node]+=1

そして、これを行うことができます:

level = 0
node = 1
print 'Node', node, 'appears', counts[level][node], 'times on level', level
>>> Node 1 appears 4 times on level 0
于 2012-08-08T19:59:48.743 に答える