Skip to content

Instantly share code, notes, and snippets.

@bowbahdoe
Created December 12, 2015 19:53
Show Gist options
  • Select an option

  • Save bowbahdoe/1f4db9f402f6f87906bf to your computer and use it in GitHub Desktop.

Select an option

Save bowbahdoe/1f4db9f402f6f87906bf to your computer and use it in GitHub Desktop.
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