Created
December 12, 2015 19:53
-
-
Save bowbahdoe/1f4db9f402f6f87906bf to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| from __future__ import division, print_function | |
| import csv | |
| def get_weight(text_importance): | |
| '''returns the integer value of the | |
| text based importance rating''' | |
| imp = {"Irrelevant":0, | |
| "A Little Important":1, | |
| "Somewhat Important":10, | |
| "Very Important":50, | |
| "Mandatory":250} | |
| return imp[text_importance] | |
| def load_data(filename): | |
| with open(filename) as csvfile: | |
| people = [] | |
| spamreader = csv.reader(csvfile, delimiter=',') | |
| row_num = 0 | |
| for row in spamreader: | |
| responses = [] | |
| if row[0] == '': | |
| continue | |
| if row_num>0: | |
| name = row[1] | |
| gender = row[2] | |
| for i in range(3,len(row),3): | |
| answer = row[i] | |
| preferred = row[i+1].split(", ") | |
| weight = get_weight(row[i+2]) | |
| responses.append(Response(answer, | |
| preferred, | |
| weight, | |
| i)) | |
| people.append(Student(name, | |
| gender, | |
| responses)) | |
| row_num+=1 | |
| return people | |
| class Response: | |
| def __init__(self, | |
| personal_answer, | |
| acceptable_answers, | |
| weight, | |
| question_id): | |
| self.personal_answer = personal_answer | |
| self.acceptable_answers = acceptable_answers | |
| self.weight = weight | |
| self.question_id = question_id | |
| def get_match_percentages(person_1, | |
| person_2): | |
| person_1_score = 0 | |
| total_possible_points_person_1 = person_2.total_points | |
| person_2_score = 0 | |
| total_possible_points_person_2 = person_1.total_points | |
| #makes math hard if we go equal rights, sorry | |
| assert (person_1.gender != person_2.gender) | |
| #time complexity of algorithm O(n^2) | |
| #time saved in thought O(n^2) | |
| for person_1_response in person_1.responses: | |
| for person_2_response in person_2.responses: | |
| if(person_1_response.question_id == person_2_response.question_id): | |
| if person_1_response.personal_answer in person_2_response.acceptable_answers: | |
| person_1_score += person_2_response.weight | |
| if person_2_response.personal_answer in person_1_response.acceptable_answers: | |
| person_2_score += person_1_response.weight | |
| person_1_percentage = person_1_score / total_possible_points_person_1 | |
| person_2_percentage = person_2_score / total_possible_points_person_2 | |
| assert len(person_2.responses) == len(person_1.responses) | |
| root = 1/len(person_2.responses) | |
| return (person_1_percentage * person_2_percentage) ** (1/2) | |
| return (person_1_percentage * person_2_percentage) ** (root) | |
| class Student: | |
| def __init__(self,name,gender,responses): | |
| self.name = name | |
| self.gender = gender | |
| self.responses = responses | |
| self.total_points = 0 | |
| for response in self.responses: | |
| self.total_points += response.weight | |
| def __str__(self): | |
| return str(self.name) | |
| def __unicode__(self): | |
| return self.name | |
| def sep_genders(data): | |
| males = [] | |
| females = [] | |
| for person in data: | |
| if person.gender == "Male": | |
| males.append(person) | |
| else: | |
| females.append(person) | |
| return [males,females] | |
| def find_all_matches(gender_sep_data): | |
| males = gender_sep_data[0] | |
| females = gender_sep_data[1] | |
| for person in males: | |
| for other_person in females: | |
| percent = get_match_percentages(person, | |
| other_person) | |
| print("{0} and {1} : {2}%".format(person.name, | |
| other_person.name, | |
| percent*100)) | |
| print() | |
| print() | |
| for person in females: | |
| for other_person in males: | |
| percent = get_match_percentages(person, | |
| other_person) | |
| print("{0} and {1} : {2}%".format(person.name, | |
| other_person.name, | |
| percent*100)) | |
| print() | |
| data = load_data("psych.csv") | |
| find_all_matches(sep_genders(data)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment