Mercurial > hg > horiscopes
diff V4/synastry.py @ 16:b11cff4b7f83
implement compatibility scores
author | DaveM |
---|---|
date | Mon, 05 Mar 2018 14:22:09 +0000 |
parents | 50a95089414d |
children | ae220e89cb3a |
line wrap: on
line diff
--- 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: