我正在构建数据分析工具,我需要在数据库中存储竞争赔率。其中一种赔率类型被称为" trifecta"或"三联体"你必须以正确的顺序挑选三名参与者。由于每场比赛最多可以有16名选手(但通常是10名左右),这意味着我有16x15x14种不同的排列。为了存储这些,我用表格制作了表格" race_id"," pos1"," pos2"," pos3"和"价值"我只存储现有赔率的地方。 Pos1是赢家,pos2是第二名,pos3是第三名,value是这个特定排列所具有的赔率值。
这一切都运行得很好,我通常在db中存储每个种族大约500个排列。
我有麻烦弄清楚我该怎么做。任何提示和技巧都表示赞赏。
以下是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
这是一个真正的问题,我不希望任何人为我做这件事。我只是希望得到一些提示或提示如何解决这个问题。
答案 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