在Python中重新格式化数据(排列)

时间:2014-12-02 21:47:11

标签: python algorithm python-2.7 formatting permutation

我正在构建数据分析工具,我需要在数据库中存储竞争赔率。其中一种赔率类型被称为" trifecta"或"三联体"你必须以正确的顺序挑选三名参与者。由于每场比赛最多可以有16名选手(但通常是10名左右),这意味着我有16x15x14种不同的排列。为了存储这些,我用表格制作了表格" race_id"," pos1"," pos2"," pos3"和"价值"我只存储现有赔率的地方。 Pos1是赢家,pos2是第二名,pos3是第三名,value是这个特定排列所具有的赔率值。
这一切都运行得很好,我通常在db中存储每个种族大约500个排列。

你还活着吗?现在出现了让我烦恼的部分。偶尔我需要从db中提取一些数据,并且它必须以某种形式(CSV)。这不取决于我 新格式为" raceid"," perm_1_2_3"," perm_1_2_4",...," perm_1_2_16"," perm_1_3_2&#34 ;," perm_1_3_4",...
所有列都必须以这种新形式存在,即使我没有将它们存储在db中。

我有麻烦弄清楚我该怎么做。任何提示和技巧都表示赞赏。

以下是db中的一小部分数据:

raceid    pos1    pos2    pos3    value
201411    1       2       6       4643.6
201411    1       2       7       2321.8
201411    1       2       9       2321.8
201411    1       3       2       9287.2
201411    1       3       4       4643.6

编辑:
我需要这个:

raceid    perm_1_2_3    perm_1_2_4    perm_1_2_5    perm_1_2_6    perm_1_2_7    perm_1_2_8    perm_1_2_9    perm_1_2_10    ...
201411    None          None          None          4643.6        2321.8        None          2321.8        None

这是一个真正的问题,我不希望任何人为我做这件事。我只是希望得到一些提示或提示如何解决这个问题。

2 个答案:

答案 0 :(得分:1)

好的,所以您还没有解释某种形式的输入数据,并希望通过perm_1_2_3生成列perm_16_15_14

一种非常简单的方法是使用permutations函数生成所有排列;然后它只是字符串格式化的问题:

headers = ['raceid']
values = [raceid]
for perm in itertools.permutations(list(range(1, horses+1)), 3):
    headers.append('perm_{}_{}_{}'.format(*perm))
    values.append(odds.get(perm, None))

我假设odds是一个键入马数字元组的词典,可能存储在一个由raceid键入的更大的词典中,你有类似的东西:

for raceid, pos1, pos2, pos3, value in csv.reader(f):
    oddses[raceid][int(pos1), int(pos2), int(pos3)] = value

答案 1 :(得分:1)

您可以使用类似的内容生成这些列名称:

import itertools
for x in itertools.permutations([1,2,3]):
    print x

这项工作在python 2.6及更高版本中。 对于旧版本,您可以查看此帖子: How to generate all permutations of a list in Python