Mercurial > hg > horiscopes
changeset 16:b11cff4b7f83
implement compatibility scores
author | DaveM |
---|---|
date | Mon, 05 Mar 2018 14:22:09 +0000 |
parents | 50a95089414d |
children | e7a3fb5b9473 |
files | V4/runme.py V4/synastry.py V4/test.py |
diffstat | 3 files changed, 160 insertions(+), 50 deletions(-) [+] |
line wrap: on
line diff
--- a/V4/runme.py Sun Mar 04 17:09:50 2018 +0000 +++ b/V4/runme.py Mon Mar 05 14:22:09 2018 +0000 @@ -55,7 +55,6 @@ pickle.dump(data,handle) def parseHoriscope(people,saveFile): - horiscopeList = [] for person in people: issue = person.identifyIssues() if issue is not None: @@ -69,42 +68,49 @@ if saveFile is not None: savePick(saveFile,people) -def testMain(): - restartDataFile = 1 - if(restartDataFile): - pickFile = 'outData.pick' - # people = makePeople('individuals.csv') - # savePick(pickFile,people) - people = loadPick(pickFile) - parseSaveFile = pickFile.split('.')[0]+'_collect.pick' - parseHoriscope(people,parseSaveFile) - else: - people = loadPick('onlineDatacollect.pick') - for p in people: - if p.horiscope is None: - print p.id - else: - p.horiscope.calcAllAspects() - - # horiscopeData = presentResults(parseSaveFile) - # comRules = comp.parseCompatDef('compatibilityRules.csv') - # applyCompatScore(horiscopeData,rules) +# def testMain(): +# pickFile = 'outData.pick' +# restartDataFile = 0 +# if(restartDataFile): +# # people = makePeople('individuals.csv') +# # savePick(pickFile,people) +# people = loadPick(pickFile) +# parseSaveFile = pickFile.split('.')[0]+'_collect.pick' +# parseHoriscope(people,parseSaveFile) +# else: +# people = loadPick('outData_collect.pick') +# comp = syn.compatibility() +# comp.parseCompatRules('compatibilityRules.csv') +# for person in people: +# if person.issue is None: +# person.score = comp.calcCompatibility(person.horiscope) +# if person.score is None: +# person.issue = 'None Planet Locations' +# else: +# print person.id,person.score +# pdb.set_trace() def _main(): pickFile = 'outData.pick' - # people = dict() if not os.path.exists(pickFile): - print 'reParse file' people = makePeople('individuals.csv') savePick(pickFile,people) else: - print 'read in ' + pickFile people = loadPick(pickFile) parseSaveFile = pickFile.split('.')[0]+'_collect.pick' - parseHoriscope(people,parseSaveFile) - horiscopeData = presentResults(parseSaveFile) - comRules = comp.parseCompatDef('compatibilityRules.csv') - applyCompatScore(horiscopeData,rules) + if not os.path.exists(parseSaveFile): + parseHoriscope(people,parseSaveFile) + else: + people = loadPick(parseSaveFile) + comp = syn.compatibility() + comp.parseCompatRules('compatibilityRules.csv') + for person in people: + person.score = None + if person.issue is None: + person.score = comp.calcCompatibility(person.horiscope) + if person.score is None: + person.issue = 'None Planet Locations' + savePick('fullResults.pick',people) if __name__ == "__main__": - testMain() + _main()
--- a/V4/synastry.py Sun Mar 04 17:09:50 2018 +0000 +++ b/V4/synastry.py Mon Mar 05 14:22:09 2018 +0000 @@ -1,4 +1,91 @@ import random +import csv +import re +import pdb + +class compatibility: + def __init__(self): + self.rules = [] + self.uniqueID = 0 + print 'Warning, need to fix [Vertex, Ascendant House, None Location] issues' + + def addRule(self,planetTuple,aspectList,score): + rule = compatibilityRule(self.uniqueID,planetTuple,aspectList,score) + self.rules.append(rule) + self.uniqueID += 1 + + def findRule(self,planet): + ruleList = [r for r in self.rules if r.planet == planet] + print ruleList + return ruleList + + def readFile(self,filename): + text = [] + with open(filename) as fp: + line = fp.readline() + text.append(line.strip()) + while line: + line = fp.readline() + text.append(line.strip()) + return text + + def parseCompatRules(self,filename): + comList = self.readFile(filename) + # compat = {} + for com in comList: + c = com.split(',') + # print c + if len(c) == 4: + if len(c[1]) > 1: + aspectList = [] + planetTuple = tuple(sorted((c[0].lower(),c[2].lower()))) + score = c[3] + for subset in c[1].split(' '): + aspectList.append(subset) + elif len(c[1]) == 0 : + if 'house' not in c[2]: + print 'some error where rule is not house' + planetTuple = (c[0].lower(),'house') + houseNo = re.findall('\d+', c[2]) + if len(houseNo) != 1: + print 'multiple house numbers found - ERROR' + aspectList = int(houseNo[0]) + score = int(c[3]) + self.addRule(planetTuple,aspectList,score) + # return compat + # pdb.set_trace() + + def calcCompatibility(self, horiscope): + score = 0 + for r in self.rules: + if 'vertex' in r.planet: + # print 'ERROR - catch Vertex issue' + pass + elif r.planet[1] == 'house' and r.planet[0] == 'asc': + # print 'ERROR - catch Ascendant House issue' + pass + elif horiscope.planets[r.planet[0]].angleA is None: + # print 'Error - None Location' + return None + elif r.planet[1] == 'house': + if horiscope.isInHouse(r.planet[0],r.aspect): + score += r.score + else: + # print 'query standard synastry' + aspect,variance = horiscope.calcAspect(r.planet[0],r.planet[1]) + if aspect is not None: + if aspect in r.aspect: + score += r.score + return score + + + +class compatibilityRule: + def __init__(self,uniqueId,planetTuple,aspectList,score): + self.id = uniqueId + self.planet = planetTuple + self.aspect = aspectList + self.score = score class Person: url = 'https://horoscopes.astro-seek.com/calculate-love-compatibility/' @@ -15,21 +102,22 @@ def identifyIssues(self): if self.id is None: - return 'id' + self.issue = 'id' elif self.dob is None: - return 'dob' + self.issue = 'dob' elif self.tob is None: - return 'tob' + self.issue = 'tob' elif self.cob is None: - return 'cob' + self.issue = 'cob' elif self.p_dob is None: - return 'p_dob' + self.issue = 'p_dob' elif self.p_tob is None: - return 'p_tob' + self.issue = 'p_tob' elif self.p_cob is None: - return 'p_cob' + self.issue = 'p_cob' else: - return None + self.issue = None + return self.issue def makePayload(self): if type(self.cob) is str: @@ -147,10 +235,17 @@ self.calcAngle(componentA,componentB) for aspect in planetPositions.aspectDict: if self.angleRange[0] < planetPositions.aspectDict[aspect] and self.angleRange[1] > planetPositions.aspectDict[aspect]: - self.aspect[componentA,componentB] = aspect - self.aspectDiff = abs(self.angle - planetPositions.aspectDict[aspect]) - return self.aspect,self.aspectDiff + aspectDiff = abs(self.angle - planetPositions.aspectDict[aspect]) + self.aspect[componentA,componentB] = (aspect,aspectDiff) + return aspect,aspectDiff + return None,None + def isInHouse(self,component,houseNo): + # print (self.planets[component].houseA,self.planets[component].houseB,houseNo) + if (self.planets[component].houseA == houseNo) or (self.planets[component].houseB == houseNo): + return True + return False + def calcAllAspects(self): for p1 in planetPositions.planetNames: for p2 in planetPositions.planetNames:
--- a/V4/test.py Sun Mar 04 17:09:50 2018 +0000 +++ b/V4/test.py Mon Mar 05 14:22:09 2018 +0000 @@ -1,17 +1,26 @@ #!/usr/bin/env python +# import synastry as syn +# import random + +# synMap = syn.planetPositions() + +# synMap.test_random() + +# print (synMap.planets['sun'].angleA,synMap.planets['sun'].angleB) +# print synMap.calcAspect('sun','sun') + +# print (synMap.planets['sun'].angleA,synMap.planets['moon'].angleB) +# print synMap.calcAspect('sun','moon') + + import synastry as syn -import random +import pdb -synMap = syn.planetPositions() +comp = syn.compatibility() +comp.parseCompatRules('compatibilityRules.csv') -synMap.test_random() +print [r.planet for r in comp.rules] -print (synMap.planets['sun'].angleA,synMap.planets['sun'].angleB) -print synMap.calcAspect('sun','sun') - -print (synMap.planets['sun'].angleA,synMap.planets['moon'].angleB) -print synMap.calcAspect('sun','moon') - - +pdb.set_trace() \ No newline at end of file