annotate V4/synastry.py @ 16:b11cff4b7f83

implement compatibility scores
author DaveM
date Mon, 05 Mar 2018 14:22:09 +0000
parents 50a95089414d
children ae220e89cb3a
rev   line source
DaveM@13 1 import random
DaveM@16 2 import csv
DaveM@16 3 import re
DaveM@16 4 import pdb
DaveM@16 5
DaveM@16 6 class compatibility:
DaveM@16 7 def __init__(self):
DaveM@16 8 self.rules = []
DaveM@16 9 self.uniqueID = 0
DaveM@16 10 print 'Warning, need to fix [Vertex, Ascendant House, None Location] issues'
DaveM@16 11
DaveM@16 12 def addRule(self,planetTuple,aspectList,score):
DaveM@16 13 rule = compatibilityRule(self.uniqueID,planetTuple,aspectList,score)
DaveM@16 14 self.rules.append(rule)
DaveM@16 15 self.uniqueID += 1
DaveM@16 16
DaveM@16 17 def findRule(self,planet):
DaveM@16 18 ruleList = [r for r in self.rules if r.planet == planet]
DaveM@16 19 print ruleList
DaveM@16 20 return ruleList
DaveM@16 21
DaveM@16 22 def readFile(self,filename):
DaveM@16 23 text = []
DaveM@16 24 with open(filename) as fp:
DaveM@16 25 line = fp.readline()
DaveM@16 26 text.append(line.strip())
DaveM@16 27 while line:
DaveM@16 28 line = fp.readline()
DaveM@16 29 text.append(line.strip())
DaveM@16 30 return text
DaveM@16 31
DaveM@16 32 def parseCompatRules(self,filename):
DaveM@16 33 comList = self.readFile(filename)
DaveM@16 34 # compat = {}
DaveM@16 35 for com in comList:
DaveM@16 36 c = com.split(',')
DaveM@16 37 # print c
DaveM@16 38 if len(c) == 4:
DaveM@16 39 if len(c[1]) > 1:
DaveM@16 40 aspectList = []
DaveM@16 41 planetTuple = tuple(sorted((c[0].lower(),c[2].lower())))
DaveM@16 42 score = c[3]
DaveM@16 43 for subset in c[1].split(' '):
DaveM@16 44 aspectList.append(subset)
DaveM@16 45 elif len(c[1]) == 0 :
DaveM@16 46 if 'house' not in c[2]:
DaveM@16 47 print 'some error where rule is not house'
DaveM@16 48 planetTuple = (c[0].lower(),'house')
DaveM@16 49 houseNo = re.findall('\d+', c[2])
DaveM@16 50 if len(houseNo) != 1:
DaveM@16 51 print 'multiple house numbers found - ERROR'
DaveM@16 52 aspectList = int(houseNo[0])
DaveM@16 53 score = int(c[3])
DaveM@16 54 self.addRule(planetTuple,aspectList,score)
DaveM@16 55 # return compat
DaveM@16 56 # pdb.set_trace()
DaveM@16 57
DaveM@16 58 def calcCompatibility(self, horiscope):
DaveM@16 59 score = 0
DaveM@16 60 for r in self.rules:
DaveM@16 61 if 'vertex' in r.planet:
DaveM@16 62 # print 'ERROR - catch Vertex issue'
DaveM@16 63 pass
DaveM@16 64 elif r.planet[1] == 'house' and r.planet[0] == 'asc':
DaveM@16 65 # print 'ERROR - catch Ascendant House issue'
DaveM@16 66 pass
DaveM@16 67 elif horiscope.planets[r.planet[0]].angleA is None:
DaveM@16 68 # print 'Error - None Location'
DaveM@16 69 return None
DaveM@16 70 elif r.planet[1] == 'house':
DaveM@16 71 if horiscope.isInHouse(r.planet[0],r.aspect):
DaveM@16 72 score += r.score
DaveM@16 73 else:
DaveM@16 74 # print 'query standard synastry'
DaveM@16 75 aspect,variance = horiscope.calcAspect(r.planet[0],r.planet[1])
DaveM@16 76 if aspect is not None:
DaveM@16 77 if aspect in r.aspect:
DaveM@16 78 score += r.score
DaveM@16 79 return score
DaveM@16 80
DaveM@16 81
DaveM@16 82
DaveM@16 83 class compatibilityRule:
DaveM@16 84 def __init__(self,uniqueId,planetTuple,aspectList,score):
DaveM@16 85 self.id = uniqueId
DaveM@16 86 self.planet = planetTuple
DaveM@16 87 self.aspect = aspectList
DaveM@16 88 self.score = score
DaveM@13 89
DaveM@13 90 class Person:
DaveM@13 91 url = 'https://horoscopes.astro-seek.com/calculate-love-compatibility/'
DaveM@13 92 def __init__(self,personDict):
DaveM@13 93 # self. = planetPositions()
DaveM@13 94 self.id = personDict['ID']
DaveM@13 95 self.dob = personDict['DOB']
DaveM@13 96 self.tob = personDict['TOB']
DaveM@13 97 self.cob = personDict['COB']
DaveM@13 98 self.p_dob = personDict['pDOB']
DaveM@13 99 self.p_tob = personDict['pTOB']
DaveM@13 100 self.p_cob = personDict['pCOB']
DaveM@13 101 self.horiscope = None
DaveM@13 102
DaveM@15 103 def identifyIssues(self):
DaveM@15 104 if self.id is None:
DaveM@16 105 self.issue = 'id'
DaveM@15 106 elif self.dob is None:
DaveM@16 107 self.issue = 'dob'
DaveM@15 108 elif self.tob is None:
DaveM@16 109 self.issue = 'tob'
DaveM@15 110 elif self.cob is None:
DaveM@16 111 self.issue = 'cob'
DaveM@15 112 elif self.p_dob is None:
DaveM@16 113 self.issue = 'p_dob'
DaveM@15 114 elif self.p_tob is None:
DaveM@16 115 self.issue = 'p_tob'
DaveM@15 116 elif self.p_cob is None:
DaveM@16 117 self.issue = 'p_cob'
DaveM@15 118 else:
DaveM@16 119 self.issue = None
DaveM@16 120 return self.issue
DaveM@15 121
DaveM@13 122 def makePayload(self):
DaveM@13 123 if type(self.cob) is str:
DaveM@13 124 cob_0 = float(self.cob.split(',')[0][1:])
DaveM@13 125 cob_1 = float(self.cob.split(',')[1])
DaveM@13 126 self.cob = (cob_0,cob_1)
DaveM@13 127 if type(self.p_cob) is str:
DaveM@13 128 pcob_0 = float(self.p_cob.split(',')[0][1:])
DaveM@13 129 pcob_1 = float(self.p_cob.split(',')[1])
DaveM@13 130 self.p_cob = (pcob_0,pcob_1)
DaveM@13 131 if type(self.dob) is str:
DaveM@13 132 self.dob = self.dob[1:-1].split(',')
DaveM@13 133 if type(self.p_dob) is str:
DaveM@13 134 self.p_dob = self.p_dob[1:-1].split(',')
DaveM@13 135 if type(self.tob) is str:
DaveM@13 136 self.tob = self.tob[1:-1].split(',')
DaveM@13 137 if type(self.p_tob) is str:
DaveM@13 138 self.p_tob = self.p_tob[1:-1].split(',')
DaveM@13 139 # pdb.set_trace()
DaveM@13 140
DaveM@13 141 # print dataDict['pDOB']
DaveM@13 142
DaveM@13 143 self.payload = {'send_calculation':'1', #Req
DaveM@13 144 'muz_narozeni_den':self.dob[0],
DaveM@13 145 'muz_narozeni_mesic':self.dob[1],
DaveM@13 146 'muz_narozeni_rok':self.dob[2],
DaveM@13 147 'muz_narozeni_hodina':self.tob[0],
DaveM@13 148 'muz_narozeni_minuta':self.tob[1],
DaveM@13 149 'muz_narozeni_city':'',
DaveM@13 150 'muz_narozeni_mesto_hidden':'Manually+place%3A+%C2%B0%27N%2C+%C2%B0%27E',#auto
DaveM@13 151 'muz_narozeni_stat_hidden':'XX',
DaveM@13 152 'muz_narozeni_podstat_kratky_hidden':'',
DaveM@13 153 'muz_narozeni_podstat_hidden':'',
DaveM@13 154 'muz_narozeni_podstat2_kratky_hidden':'',
DaveM@13 155 'muz_narozeni_podstat3_kratky_hidden':'',
DaveM@13 156 'muz_narozeni_input_hidden':'',
DaveM@13 157 'muz_narozeni_sirka_stupne':str(abs(self.cob[0])).split('.')[0],
DaveM@13 158 'muz_narozeni_sirka_minuty':str(float('0.'+str(self.cob[0]).split('.')[1])*60).split('.')[0],
DaveM@13 159 'muz_narozeni_sirka_smer': '1' if self.cob[0]<0 else '0', #address N Dir (0':'N',1':'S)
DaveM@13 160 'muz_narozeni_delka_stupne':str(abs(self.cob[1])).split('.')[0], #address E - Main
DaveM@13 161 'muz_narozeni_delka_minuty':str(float('0.'+str(self.cob[1]).split('.')[1])*60).split('.')[0],
DaveM@13 162 'muz_narozeni_delka_smer': '1' if self.cob[1]<0 else '0', #address E Dir (0':'E',1':'W)
DaveM@13 163 'muz_narozeni_timezone_form':'auto',
DaveM@13 164 'muz_narozeni_timezone_dst_form':'auto',
DaveM@13 165 'send_calculation':'1',
DaveM@13 166 'zena_narozeni_den':self.p_dob[0],
DaveM@13 167 'zena_narozeni_mesic':self.p_dob[1],
DaveM@13 168 'zena_narozeni_rok':self.p_dob[2],
DaveM@13 169 'zena_narozeni_hodina':self.p_tob[0],
DaveM@13 170 'zena_narozeni_minuta':self.p_tob[1],
DaveM@13 171 'zena_narozeni_city':'',
DaveM@13 172 'zena_narozeni_mesto_hidden':'Manually+place%3A+%C2%B0%27N%2C+%C2%B0%27E',
DaveM@13 173 'zena_narozeni_stat_hidden':'XX',
DaveM@13 174 'zena_narozeni_podstat_kratky_hidden':'',
DaveM@13 175 'zena_narozeni_podstat_hidden':'',
DaveM@13 176 'zena_narozeni_podstat2_kratky_hidden':'',
DaveM@13 177 'zena_narozeni_podstat3_kratky_hidden':'',
DaveM@13 178 'zena_narozeni_input_hidden':'',
DaveM@13 179 'zena_narozeni_sirka_stupne':str(abs(self.p_cob[0])).split('.')[0],
DaveM@13 180 'zena_narozeni_sirka_minuty':str(float('0.'+str(self.p_cob[0]).split('.')[1])*60).split('.')[0],
DaveM@13 181 'zena_narozeni_sirka_smer': '1' if self.p_cob[0]<0 else '0',
DaveM@13 182 'zena_narozeni_delka_stupne':str(abs(self.p_cob[1])).split('.')[0],
DaveM@13 183 'zena_narozeni_delka_minuty':str(float('0.'+str(self.p_cob[1]).split('.')[1])*60).split('.')[0],
DaveM@13 184 'zena_narozeni_delka_smer': '1' if self.p_cob[1]<0 else '0',
DaveM@13 185 'zena_narozeni_timezone_form':'auto',
DaveM@13 186 'zena_narozeni_timezone_dst_form':'auto',
DaveM@13 187 'switch_interpretations':'0',
DaveM@13 188 'house_system':'placidus',
DaveM@13 189 'uhel_orbis':'#tabs_redraw'}
DaveM@13 190
DaveM@13 191
DaveM@13 192 class planetRelation:
DaveM@15 193 noHouseList = ['asc','ic','dsc','mc','asc/mc','sun/moon']
DaveM@13 194 def __init__(self,planetName):
DaveM@13 195 self.name = planetName
DaveM@13 196 self.angleA = None
DaveM@13 197 self.angleB = None
DaveM@15 198 if planetName not in planetRelation.noHouseList:
DaveM@15 199 self.houseA = None
DaveM@15 200 self.houseB = None
DaveM@13 201
DaveM@13 202 def setLocation(self,A,B):
DaveM@15 203 self.angleA = float('.'.join(A.encode('ascii','replace').split('?'))[:-1])
DaveM@15 204 self.angleB = float('.'.join(B.encode('ascii','replace').split('?'))[:-1])
DaveM@15 205 # print self.angleA,self.angleB
DaveM@13 206
DaveM@15 207 def setHouse(self,A,B):
DaveM@15 208 self.houseA = int(A.encode('ascii','ignore'))
DaveM@15 209 self.houseB = int(B.encode('ascii','ignore'))
DaveM@15 210 # print self.houseA,self.houseB
DaveM@13 211
DaveM@13 212 def test_random(self):
DaveM@13 213 self.angleA = random.random()*360
DaveM@13 214 self.angleB = random.random()*360
DaveM@13 215
DaveM@13 216
DaveM@13 217 class planetPositions:
DaveM@15 218 aspectDict = {'conjunction':0,'semi-square':45,'sextile':60,'square':90,'trine':120,'opposite':180}
DaveM@15 219 planetNames = ['sun','moon','mercury','venus','mars','jupiter','saturn','uranus','neptune','pluto','node','lilith','chiron','asc','ic','dsc','mc','asc/mc','sun/moon']
DaveM@13 220 def __init__(self):
DaveM@13 221 self.planets = {}
DaveM@15 222 for p in planetPositions.planetNames:
DaveM@15 223 self.planets[p] = planetRelation(p)
DaveM@13 224 self.aspect = {}
DaveM@13 225
DaveM@13 226 def test_random(self):
DaveM@13 227 for planet in self.planets:
DaveM@13 228 self.planets[planet].test_random()
DaveM@13 229
DaveM@13 230 def calcAngle(self,componentA,componentB):
DaveM@13 231 self.angle = max(self.planets[componentA].angleA,self.planets[componentB].angleB) - min(self.planets[componentA].angleA,self.planets[componentB].angleB)
DaveM@13 232 self.angleRange = self.angle-10,self.angle+10
DaveM@13 233
DaveM@13 234 def calcAspect(self,componentA,componentB):
DaveM@13 235 self.calcAngle(componentA,componentB)
DaveM@13 236 for aspect in planetPositions.aspectDict:
DaveM@13 237 if self.angleRange[0] < planetPositions.aspectDict[aspect] and self.angleRange[1] > planetPositions.aspectDict[aspect]:
DaveM@16 238 aspectDiff = abs(self.angle - planetPositions.aspectDict[aspect])
DaveM@16 239 self.aspect[componentA,componentB] = (aspect,aspectDiff)
DaveM@16 240 return aspect,aspectDiff
DaveM@16 241 return None,None
DaveM@13 242
DaveM@16 243 def isInHouse(self,component,houseNo):
DaveM@16 244 # print (self.planets[component].houseA,self.planets[component].houseB,houseNo)
DaveM@16 245 if (self.planets[component].houseA == houseNo) or (self.planets[component].houseB == houseNo):
DaveM@16 246 return True
DaveM@16 247 return False
DaveM@16 248
DaveM@15 249 def calcAllAspects(self):
DaveM@15 250 for p1 in planetPositions.planetNames:
DaveM@15 251 for p2 in planetPositions.planetNames:
DaveM@15 252 self.calcAspect(p1,p2)
DaveM@13 253
DaveM@15 254 def printPositions(self):
DaveM@15 255 for p in planetPositions.planetNames:
DaveM@15 256 if p in planetRelation.noHouseList:
DaveM@15 257 print p,self.planets[p].angleA,self.planets[p].angleB
DaveM@15 258 else:
DaveM@15 259 print p,self.planets[p].angleA,self.planets[p].angleB,self.planets[p].houseA,self.planets[p].houseB
DaveM@13 260
DaveM@13 261
DaveM@13 262
DaveM@13 263
DaveM@13 264