Справочная информация: я запускаю несколько симуляций для набора данных. Для каждой сессии я выделяю проекты студентам. Разница между каждой сессией заключается в том, что я рандомизирую порядок учеников таким образом, чтобы все ученики получили возможность получить проект, который им нужен. Я записывал некоторые распределения в электронную таблицу (например, в 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
(это довольно полезная информация для меня).