Как я могу добавить условие в код для базы данных?

avatar
Antoche
9 августа 2021 в 00:07
77
1
1

Я хочу создать компьютерную программу в коде Python для использования большой базы данных (+400 тыс. строк).

Я хочу решить следующую задачу: соединить любых двух студентов базы данных, по возможным "цепочкам" студентов. Ученик этих путей будет иметь две общие характеристики (посещаемый класс и год повышения).

Пример: Если вы хотите составить базовую цепочку из двух учеников, ученика А и ученика Б, эти два ученика должны были учиться в одном классе в течение одного года, чтобы цепочка была верной.

Если это цепочка из 3 учеников, учащиеся A, B и C: учащийся A должен был учиться в том же классе в том же году, что и учащийся B, и учащийся B в том же классе того же года, что и учащийся C, чтобы составить цепочку "истинный". Если нет, то цепочка ложная.

Тем не менее, у меня есть код, в котором есть проблема, он не считает год. Ответ программы основан только на посещаемом классе, а не на год. Если два ученика учились в одном классе, но в разные годы, ответ будет истинным, тогда как он должен быть ложным.

Код на данный момент:


import pandas as pd
import itertools

class Student:
    
    """
    Object to interact with students
    """
    def __init__(self,
                 name,
                 df):

        self.name = name
        self.grades = set(df[df['student_name'] == name]['Grade'].tolist())
    
    def __repr__(self):
        return f'({self.name})'
    
    def __eq__(self,other):
        return self.name == other.name 
    
    @staticmethod
    def is_connected(student1,student2):
        """
        Check if two students are connected i.e if they were in the same class or graduated the same year
        :param student1: Student
        :param student2: Student
        """

        return len(student1.grades.intersection(student2.grades)) > 0
    
    def __hash__(self):
        return hash((self.name, self.grade, self.year))

def get_info(row):
    """
    Given a df row of students, return the main information
    """
    return row.Year,row.Grade, row.name

def check_path(path):
    """
    Given a list of students check if it forms a path

    :param path: list[Students]
    """
    path_working = True
    for i in range(len(path)-1):
        path_working = Student.is_connected(path[i],path[i+1])
        if not path_working:
            break
    return path_working

def get_df(filename):
    """
    Read the csv filename of students
    """
    df = pd.read_csv(filename,sep = ';')
    return df


if __name__ == '__main__':

    filename = 'fileofstudents.csv'
    df = pd.read_csv(filename,sep = ';')
    students = []
    with open('paths.txt','r') as f:

        lines = f.readlines()
        for line in lines:
            name = line.strip()
            student = Student(name,df)
            students.append(student)
    
    #If you want to check if the given path is correct
    is_path = check_path(students)
    print(is_path)

    #If you want to check if there exists a path given the students
    paths = list(itertools.permutations(students))
    result = False
    for path in paths:
        result = check_path(path)
        if result:
            print(path)
            break
            

Кто-нибудь знает, как добавить вторую характеристику "год" в код, чтобы ответы кода были верными только тогда, когда учащиеся учились в одном классе в тот же год?

Источник

Ответы (1)

avatar
CCCC
11 августа 2021 в 13:14
0

i) Убедитесь, что в вашей таблице базы данных есть столбец для класса, и назовите его как-то иначе, но не CLASS, поскольку CLASS является ключевым словом. ii) В вашей таблице БД должен быть столбец для года, не называйте его годом, вы можете назвать его yearFd, schoolYear или как угодно, но не только YEAR.

iii) В программе приложения напишите свои метки и текстовые поля (qLineEdits в Python) они должны быть заполнены, и затем система проверит, соответствует ли предоставленная вами информация условию, которое вы им даете. Я привожу вам пример ниже: определение имя_функции (я): г)

     xyz == "dept name" 
     stu = "SessionYear"                   
     if xyz and stu:
     sqlStatement = (write your db connection and sql statement here)
     print("ERROR")
                self.msgBox.setText("Student belongs to the right set")
                self.msgBox.setWindowTitle("Alert")
                self.msgBox.exec_()```