Сохранение результатов моделирования на постоянной основе для Python? - PullRequest
2 голосов
/ 25 марта 2010

Справочная информация: я запускаю несколько симуляций для набора данных. Для каждой сессии я выделяю проекты студентам. Разница между каждой сессией заключается в том, что я рандомизирую порядок учеников таким образом, чтобы все ученики получили возможность получить проект, который им нужен. Я записывал некоторые распределения в электронную таблицу (например, в Excel), и она в основном выглядела так (крошечный снимок, фактическая таблица простирается на несколько тысяч сессий, примерно 100 студентов).

|          | Session 1 | Session 2 | Session 3 |
|----------|-----------|-----------|-----------|
|Stu1      |Proj_AA    |Proj_AB    |Proj_AB    |
|----------|-----------|-----------|-----------|
|Stu2      |Proj_AB    |Proj_AA    |Proj_AC    |
|----------|-----------|-----------|-----------|
|Stu3      |Proj_AC    |Proj_AC    |Proj_AA    |
|----------|-----------|-----------|-----------|

Теперь код, который имеет дело с распределением, хранит сеанс в объекте. При следующем запуске выделения объект перезаписывается.

Таким образом, я действительно хотел бы сохранить все результаты распределения. Это важно, поскольку позже мне нужно извлечь из данных такую ​​информацию, как: какой проект Stu1 был назначен наиболее или, возможно, насколько популярен Proj_AC (сколько раз ему было назначено / количество сеансов).

Question(s):
Какие методы я могу использовать для постоянного хранения такой информации о сеансе? По сути, каждый вывод сеанса должен добавляться в хранилище после завершения и перед началом следующего цикла выделения.

Одним из решений, предложенным другом, было сопоставление этих результатов с реляционной базой данных с использованием SQLAlchemy. Мне нравится эта идея, поскольку она дает мне возможность углубиться в базы данных.

Теперь структура базы данных, которую я рекомендовал, была:

|----------|-----------|-----------|
|Session   |Student    |Project    |
|----------|-----------|-----------|
|1         |Stu1       |Proj_AA    |
|----------|-----------|-----------|
|1         |Stu2       |Proj_AB    |
|----------|-----------|-----------|
|1         |Stu3       |Proj_AC    |
|----------|-----------|-----------|
|2         |Stu1       |Proj_AB    |
|----------|-----------|-----------|
|2         |Stu2       |Proj_AA    |
|----------|-----------|-----------|
|2         |Stu3       |Proj_AC    |
|----------|-----------|-----------|
|3         |Stu1       |Proj_AB    |
|----------|-----------|-----------|
|3         |Stu2       |Proj_AC    |
|----------|-----------|-----------|
|3         |Stu3       |Proj_AA    |
|----------|-----------|-----------|

Здесь было предложено сделать столбцы Session и Student составным ключом. Таким образом, я могу получить доступ к определенной записи для конкретного студента для конкретной сессии. Или я могу просто получить весь прогон выделения для определенного сеанса.

Questions:
Идея хорошая?
Как реализовать и запросить составной ключ, используя SQLAlchemy?
Что происходит с базой данных, если конкретному студенту не назначен проект (происходит, если все проекты, которые он хочет, будут приняты)? В коде, если студенту не назначен проект, вместо proj_id он просто получает None для этого поля / объекта.


Я прошу прощения за то, что задал несколько вопросов, но, поскольку они тесно связаны, я решил задать их в одном и том же месте.


Edit - 25/03/2010

Структура класса для ученика в настоящее время выглядит так:

class Student(DeptPerson):
    def __init__(self, name, stud_id):
        super(Student, self).__init__(name, stud_id)
        self.preferences = collections.defaultdict(set)
        self.allocated_project = None
        self.allocated_rank = 0

(Разное). Он наследуется от класса DeptPerson, который имеет name и stud_id.

Таким образом, поскольку функция распределения выполняет назначенные проекты (на которые ссылается уникальный идентификатор - Project - это собственный класс) учащемуся (для одного прогона / пробной сессии), это будет отражать значение в allocated_project. Если учащемуся не назначен проект для определенного прогона (потому что у кого-то другого он уже есть, мвхахах ... извините), allocated_project остается как None (это довольно полезная информация для меня).

Ответы [ 3 ]

3 голосов
/ 25 марта 2010

Двумерное отображение данных - это таблица реляционной базы данных с двумя ключами.

В вашем примере ключ ученика и ключ сеанса.

«Композитный ключ» - это шум, который вы можете игнорировать. Это не полезно и не нужно. Составной ключ плохо решает любые проблемы и создает много трудностей. Притворись, что никогда не слышал.

Что мы делаем, это вводим дополнительный столбец с простым «идентификатором». Это «сгенерированный автоматически суррогатный ключ», потому что они гребут. Автоматически генерируемые уникальные ключи для каждой строки - это хорошо. Композитные ключи - это плохо.

1 голос
/ 26 марта 2010

Логическая структура, которую вы имеете, может рассматриваться как Тройная связь , где рекомендуемая вам таблица соответствует объекту отношения Attendance. Поэтому в идеале вы должны также создать свою объектную модель, подобную этой:

Тройные отношения http://www.databasedesignstudio.com/faq/ternary-erd.jpg.

Теперь в вашем случае можно спорить, зачем вам более 1 таблицы, если у вас есть только одно поле для каждой из Entity таблиц. Но я бы все равно смоделировал это таким образом, так как эта модель лучше представляет реальный мир, и вам все еще нужно хранить где-то, над чем Project студенты предпочитают работать, что будет другой таблицей, имеющей отношение «многие ко многим» с Student таблица.

Работать с сущностями лучше и проще для понимания sqlalchemy; тогда как, если вы просто сохраните один стол, сколько вы на самом деле будете delve into the database

О composite keys: С. Лотт дал вам веские основания избегать их использования, и я полностью согласен с его мнением по теме.

0 голосов
/ 25 марта 2010

Не могу помочь с вещами в БД, так как я новичок и знаю только достаточно, чтобы запрашивать данные из таблиц sqlite ...

Однако, для настойчивости, вы могли бы использовать модуль рассола для хранения ваших объектов? Проверьте документы для точного использования, но я думаю, что это в значительной степени файл (имя файла, 'wb'). Write (pickle.pickle (myobject)), чтобы написать его и myobject = pickle.unpickle (file (filename, 'rb') ) читать.

Затем вы можете читать несколько таблиц / что угодно в несколько переменных и делать любые сравнения, которые вы хотите.

Если вам не нужно / не нужно читать его обратно через Python, вы также можете просто вручную отформатировать его как разделитель табуляции или что-то в этом роде и загрузить этот файл в приложение электронной таблицы по вашему выбору (OpenOffice Calc просто фантастический).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...