2014-12-02 2 views
-1

Я создаю инструмент анализа данных, и мне нужно хранить коэффициенты гонки в базе данных. Один из таких типов шансов называется «trifecta» или «triplet», где вам нужно выбрать победителей трех участников в правильном порядке. Как может быть до 16 гонщиков (но обычно это около 10) за расы, это означает, что у меня есть 16x15x14 различных возможных перестановок. Чтобы сохранить их, я сделал таблицу со столбцами «race_id», «pos1», «pos2», «pos3» и «value», где храню только существующие коэффициенты. Pos1 - победитель, pos2 - второе место, pos3 - третье место, а значение - это значение шансов, которое имеет эта конкретная перестановка.
Все это работает достаточно хорошо, и я обычно имею около 500 перестановок за гонку, хранящихся в db.Данные реформата (перестановки) в Python

Вы все еще живы? Теперь приходит часть, которая вызывает у меня проблемы. Иногда мне нужно вытащить некоторые данные из db, и он ДОЛЖЕН БЫТЬ в определенной форме (CSV). Это не для меня.
Новый формат - «гоночный», «perm_1_2_3», «perm_1_2_4», ..., «perm_1_2_16», «perm_1_3_2», «perm_1_3_4», ...
Все столбцы должны существовать в этой новой форме, даже если я не храните их в 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 

Edit:
мне это нужно, как:

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

Если вам нужно извлечь некоторые данные из файла CSV, используйте модуль 'csv'. Вам нужно передать не-default 'delimiter = '\ t'', и вам нужно будет преобразовать значения из строк в int/float/what явно, но кроме этого все тривиально. – abarnert

+0

Мне нужно объединить данные, находящиеся в базе данных, и выводить их как CSV. Написание CSV здесь не сложная. У меня возникли проблемы с форматированием этих данных для «правильной» формы. – Zhack

ответ

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 
+0

Спасибо вам за это. Решила это в считанные минуты, и теперь кажется, что это вопрос немой. – Zhack

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

+0

Я тоже хотел бы принять ваш ответ, но, к сожалению, я должен выбрать его. :( – Zhack

+0

@ Жак: Это круто! – Turbo

Смежные вопросы