我的数据集是一起工作或单独工作的人员列表。
每个项目都有一行,列中包含所有参与该项目的人员的姓名。如果第2列是一行中的第一个空列,则它是一个独立作业。如果第4列是连续的第一个空列,则有3个人一起工作。
我有代码可以找到所有对。在输出数据集中,创建方形N x N,每个actor标记列和行。单元格(A,B)和(B,A)包含该对一起工作的次数。使用B的处理与使用A的B处理相同。
输入数据的示例,以逗号分隔的方式:
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)
我的问题是:
如果我有一个包含数月和数年的专栏,是否可以为每个月制作一个矩阵电子表格? (即,对于2011年,我将有12个矩阵)?
对于我使用的任何细分,是否可以创建一个变量,使变量名称是所有合作人员的组合?例如“ABD”意味着项目人员A,人员B和人员D一起工作,并且将等于ABD以三个一组的顺序工作多少次,无论顺序如何。项目最多可容纳20人,因此必须能够创建2到20个组。此外,如果变量应按字母顺序排列,这将是最简单的。
答案 0 :(得分:1)
1)按月和按比例对项目进行排序年,然后为每个月创建一个新的“网格”。 e.g:
拉月和&从每一行开始。删除月份和从该行开始,然后将剩余数据添加到字典中。最后你得到类似{(月,年)的东西:[行,行,... ]}。从那里,可以轻松遍历每个月/每年并创建网格,输出电子表格等。
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)