【发布时间】:2018-05-19 05:21:23
【问题描述】:
我正在尝试在给定数据集的情况下构建层次结构,其中每一行代表一个学生、他们所学的课程以及其他一些元数据。从这个数据集中,我试图构建一个邻接矩阵,并根据学生所选择的课程以及不同学生在选择课程时所采取的路径来确定层次结构。
话虽如此,要构造这个邻接矩阵,计算量很大。这是我目前的代码,已经运行了大约 2 个小时。
uniqueStudentIds = df.Id.unique()
uniqueClasses = df['Course_Title'].unique()
for studentID in uniqueStudentIds:
for course1 in uniqueClasses:
for course2 in uniqueClasses:
if (course1 != course2 and have_taken_both_courses(course1, course2, studentID)):
x = vertexDict[course1]
y = vertexDict[course2]
# Assuming symmetry
adjacency_matrix[x][y] += 1
adjacency_matrix[y][x] += 1
print(course1 + ', ' + course2)
def have_taken_both_courses(course1, course2, studentID):
hasTakenFirstCourse = len(df.loc[(df['Course_Title'] == course1) & (df['Id'] == studentID)]) > 0
if hasTakenFirstCourse:
return len(df.loc[(df['Course_Title'] == course2) & (df['Id'] == studentID)]) > 0
else:
return False
鉴于我有一个非常大的数据集大小,我试图在并行化/多线程这个计算上昂贵的 for 循环中查阅在线资源。但是,我是 python 和多处理的新手,所以任何指导将不胜感激!
【问题讨论】:
-
您最好在 sql 中执行此操作。您只是在寻找所有课程 x, y,这样有一个学生同时参加了 x 和 y?要看的一件事是使用集合而不是列表。它们在查找时速度更快。
-
虽然我想在 SQL 中执行此操作,但我需要构造矩阵,然后进行一些数据格式化以汇集到 API 中。鉴于我的数据文件是 CSV,我不确定我会如何做到这一点,并且我最终必须返回一个表示图形的 json 对象
-
您实际上是在对每个唯一对进行线性扫描以获取计数,每次都重复迭代。这:
len(df.loc[(df['Course_Title'] == course1) & (df['Id'] == studentID)]) > 0在您的紧密循环中非常昂贵。并行化不会像更有效地计数那样有帮助。此外,如果您要对唯一 ID 进行 for 循环,只需转换为列表,不要使用 numpy 数组
标签: python pandas parallel-processing multiprocessing