如何用大数据并行化python循环

2024-10-01 22:44:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在给定一个数据集的情况下构造层次结构,其中每一行表示一个学生、他们所学的课程以及其他一些元数据。从这个数据集中,我试图构建一个邻接矩阵,并根据学生所上的课程以及不同学生选择课程时所走的路径来确定层次结构。在

也就是说,要构造这个邻接矩阵,在计算上是非常昂贵的。这是我当前的代码,已经运行了大约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和多处理还不熟悉,所以任何指导都将不胜感激!在


Tags: 数据iniddffor层次结构title学生
1条回答
网友
1楼 · 发布于 2024-10-01 22:44:14

它似乎是循环的方式比你必须的。对于每一个学生,你做NxN迭代,其中N是总类数。但你的学生只选修了其中的一部分。所以你可以大大减少迭代次数。在

这两门课你都要花很多钱。在

这样的事情可能会快得多:

import numpy as np
import itertools
import pandas as pd

df = pd.read_table('/path/to/data.tsv')

students_df = pd.DataFrame(df['student'].unique())
students_lkp = {x[1][0]: x[0] for x in students_df.iterrows()}

classes_df = pd.DataFrame(df['class'].unique())
classes_lkp = {x[1][0]: x[0] for x in classes_df.iterrows()}

df['student_key'] = df['student'].apply(lambda x: students_lkp[x])
df['class_key'] = df['class'].apply(lambda x: classes_lkp[x])

df.set_index(['student_key', 'class_key'], inplace=True)

matr = np.zeros((len(classes_df), len(classes_df)))

for s in range(0, len(students_df)):
    print s
    # get all the classes for this student
    classes = df.loc[s].index.unique().tolist()
    for x, y in itertools.permutations(classes, 2):
        matr[x][y] += 1

相关问题 更多 >

    热门问题