classrank/ClassRank

View on GitHub
classrank/filters/datawrapper.py

Summary

Maintainability
A
1 hr
Test Coverage
from classrank.database.wrapper import Query
class DataWrapper:
    def __init__(self, instances=dict(), db=None, school="gatech", metric="rating"):
        self.db = db
        self.dataDict = instances
        if db:
            self.school = school
            self.metric = metric
            self.queryDB()
        self.instanceLookup = {}
        self.featureLookup = {}
        self.createLookups()
        self.data = [[None for feature in self.featureLookup] for instance in self.instanceLookup]
        self.convertData()
        
    def createLookups(self):
        instanceCounter = 0
        featureCounter = 0
        for instance in self.dataDict:
            if instance not in self.instanceLookup:
                self.instanceLookup[instance] = instanceCounter
                instanceCounter += 1
                for feature in self.dataDict[instance]:
                    if feature not in self.featureLookup:
                        self.featureLookup[feature] = featureCounter
                        featureCounter += 1

    def convertData(self):
        for instance in self.dataDict:
            for feature in self.dataDict[instance]:
                self.data[self.instanceLookup[instance]][self.featureLookup[feature]] = self.dataDict[instance][feature]
        
    def addData(self, instances):
        #update the data dictionary
        for instance in instances:
            if instance in self.dataDict:
                self.dataDict[instance].update(instances[instance])
            else:
                self.dataDict[instance] = instances[instance]
        #probably more taxing than necesarry
        self.createLookups()
        self.convertData()

    def getData(self, *args):
        if len(args) == 2:
            return self.data[self.instanceLookup[args[0]]][self.featureLookup[args[1]]]
        else:
            return self.data
    
    def getInstanceLookup(self):
        return self.instanceLookup

    def getFeatureLookup(self):
        return self.featureLookup

    def getDataDict(self):
        return self.dataDict
        
    def getRow(self, instance):
        return self.instanceLookup[instance]

    def getColumn(self, feature):
        return self.featureLookup[feature]
    
    def queryDB(self):
        with Query(self.db) as query:
            for student in query.query(self.db.student).filter(self.db.school.abbreviation==self.school).all():
                results = query.query(self.db.rating, self.db.section).filter(self.db.rating.student_id == student.uid).\
                    filter(self.db.rating.section_id==self.db.section.uid).all() #a tuple of lists
                #results = list(zip(*results)) #a list of tuples
                instance = {}
                for result in results:
                    courseName = query.query(self.db.course).filter(self.db.course.uid==result[1].course_id).first()
                    courseName = courseName.name
                    rating = result[0].__getattribute__(self.metric)
                    #if self.metric == "rating":
                    #    rating = result[0][0].rating
                    #elif self.metric == "grade":
                    #    rating = result[0][0].grade
                    #elif self.metric == "workload":
                    #    rating = result[0][0].workload
                    #elif self.metric == "difficulty":
                    #    rating = result[0][0].difficulty
                    instance[courseName] = rating
                self.dataDict[student.uid] = instance