Я хочу создать компьютерную программу в коде 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
Кто-нибудь знает, как добавить вторую характеристику "год" в код, чтобы ответы кода были верными только тогда, когда учащиеся учились в одном классе в тот же год?