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