0

私のデータセットは、一緒に働いているか、一人で働いている人々のリストです。

各プロジェクトの行と、そのプロジェクトに携わったすべての人の名前の列があります。列2が行の最初の空の列である場合、それは単独のジョブでした。列4が行の最初の空の列である場合、3人が一緒に作業していました。

すべてのペアを見つけるためのコードがあります。出力データセットでは、すべてのアクターが列と行にラベルを付けて、正方形NxNが作成されます。セル(A、B)と(B、A)には、そのペアが一緒に機能した回数が含まれています。Bでの作業は、BがAでの作業と同じように扱われます。

カンマ区切りの入力データの例:

A,.,.
A,B,.
B,C,E
B,F,.
D,F,.
A,B,C
D,B,.
E,C,B
X,D,A
F,D,.
B,.,.
F,.,.
F,X,C
C,F,D

Python3.2を使用しています。これを行うコード:

import csv
import collections
import itertools

grid = collections.Counter()

with open("connect.csv", "r") as fp:
    reader = csv.reader(fp)
    for line in reader:
        # clean empty names
        line = [name.strip() for name in line if name.strip()]
        # count single works
        if len(line) == 1:
            grid[line[0], line[0]] += 1
        # do pairwise counts
        for pair in itertools.combinations(line, 2):
            grid[pair] += 1
            grid[pair[::-1]] += 1

actors = sorted(set(pair[0] for pair in grid))

with open("connection_grid.csv", "w") as fp:
    writer = csv.writer(fp)
    writer.writerow([''] + actors)
    for actor in actors:
        line = [actor,] + [grid[actor, other] for other in actors]
        writer.writerow(line)

私の質問は次のとおりです。

  1. 月と年の列がある場合、月ごとのマトリックススプレッドシートを作成することはできますか?(つまり、2011年の場合、12個の行列があります)?

  2. 私が使用する内訳が何であれ、変数名が一緒に働いたすべての人々の組み合わせであるような変数を作成することは可能ですか?たとえば、「ABD」は、人物A、人物B、および人物Dが一緒に作業したプロジェクトを意味し、ABDが3つのグループとしてどのような順序で作業した回数にも等しくなります。プロジェクトは最大20人を収容できるため、2〜20人のグループを作成できる必要があります。また、変数をアルファベット順にするのが最も簡単です。

4

1 に答える 1

1

1)プロジェクトを月と年で並べ替えてから、毎月新しい「グリッド」を作成します。例えば:

すべての行から月と年を引き出します。行から月と年を削除し、残りのデータを辞書に追加します。最終的には、{(monthyear):[ lineline、...]}のようになります。そこから、毎月/年をループして、グリッドや出力スプレッドシートなどを簡単に作成できます。

2)''.join(sorted(list)).replace('.','')一緒に働いた人をアルファベット順にリストします。

import csv
import collections
import itertools

grids = dict()
groups = dict()

with open("connect.csv", "r") as fp:
    reader = csv.reader(fp)
    for line in reader:
        # extract month/year from the last column
        date = line.pop(-1)
        month,year = date.split('/')
        # clean empty names
        line = [name.strip() for name in line if name.strip()]
        # generate group name
        group = ''.join(sorted(line)).replace('.','')
        #increment group count
        if group in groups:
            groups[group]+=1
        else:
            groups[group]=1
        #if grid exists for month, update else create
        if (month,year) in grids:
            grid = grids[(month,year)]
        else:
            grid = collections.Counter()
            grids[(month,year)] = grid
        # count single works
        if len(line) == 1:
            grid[line[0], line[0]] += 1
        # do pairwise counts
        for pair in itertools.combinations(line, 2):
            grid[pair] += 1
            grid[pair[::-1]] += 1

for date,grid in grids.items():
    actors = sorted(set(pair[0] for pair in grid))
    #Filename from date
    filename = "connection_grid_%s_%s.csv" % date
    with open(filename, "w") as fp:
        writer = csv.writer(fp)
        writer.writerow([''] + actors)
        for actor in actors:
            line = [actor,] + [grid[actor, other] for other in actors]
            writer.writerow(line)

with open('groups.csv','w') as fp:
    writer = csv.writer(fp)
    for item in sorted(groups.items()):
        writer.writerow(item)
于 2012-09-30T17:31:00.587 に答える