0

我的数据集是一起工作或单独工作的人员列表。

我为每个项目设置了一行,并在列中列出了参与该项目的所有人员的姓名。如果第 2 列是一行中的第一个空列,则它是一个单独的工作。如果第 4 列是连续的第一个空列,则有 3 个人一起工作。

我有找到所有对的代码。在输出数据集中,创建了一个 N x N 的正方形,每个参与者都标记了列和行。单元格 (A,B) 和 (B,A) 包含该对一起工作的次数。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

我正在使用 Python 3.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 作为三人一组工作的次数,无论顺序如何。项目最多可容纳 20 人,因此必须能够以 2 到 20 人为一组。此外,如果变量应按字母顺序排列,那将是最简单的。

4

1 回答 1

1

1)按月和年对您的项目进行排序,然后为每个月创建一个新的“网格”。例如:

从每一行中提取月份和年份。从行中删除月份和年份,然后将剩余数据添加到字典中。最后你会得到类似 {( month , year ): [ line , line , ...]} 的东西。从那里,很容易循环每个月/年并创建一个网格、输出电子表格等。

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 回答