changeset 15:50a95089414d

updating to allow for all aspects to be calculated, and remove default value passing for people.
author DaveM
date Sun, 04 Mar 2018 17:09:50 +0000
parents a0c217ee4168
children b11cff4b7f83
files V4/dParse.py V4/runme.py V4/synastry.py timesheet.xlsx
diffstat 4 files changed, 85 insertions(+), 223 deletions(-) [+]
line wrap: on
line diff
--- a/V4/dParse.py	Sun Mar 04 15:03:15 2018 +0000
+++ b/V4/dParse.py	Sun Mar 04 17:09:50 2018 +0000
@@ -8,19 +8,9 @@
 import random
 import pdb
 
-DEFAULT_TIME_H = 12
-DEFAULT_TIME_M = 00
-DEAULT_LOCATION = 'USA'
-
-# def parseCSV(filename):
-# 	stream = csv.DictReader(open(filename,'rb'))
-# 	dictList = []
-# 	people = []
-# 	for line in stream:
-# 		people.append(syn.person(line))
-# 	return people
-# 		# dictList.append(regulateData(line))
-# 	# return dictList
+DEFAULT_TIME_H = None
+DEFAULT_TIME_M = None
+DEAULT_LOCATION = None
 
 def regulateData(dataDict):
 	print("Parse %s"%(str(dataDict['ID'])))
@@ -238,76 +228,4 @@
 		M = DEFAULT_TIME_M
 	return (H,M)
 
-def makePayload(dataDict):
-	if type(dataDict['COB']) is str:
-		cob_0 = float(dataDict['COB'].split(',')[0][1:])
-		cob_1 = float(dataDict['COB'].split(',')[1])
-		dataDict['COB'] = (cob_0,cob_1)
-	if type(dataDict['pCOB']) is str:
-		pcob_0 = float(dataDict['pCOB'].split(',')[0][1:])
-		pcob_1 = float(dataDict['pCOB'].split(',')[1])
-		dataDict['pCOB'] = (pcob_0,pcob_1)
-	if type(dataDict['DOB']) is str:
-		dataDict['DOB'] = dataDict['DOB'][1:-1].split(',')
-	if type(dataDict['pDOB']) is str:
-		dataDict['pDOB'] = dataDict['pDOB'][1:-1].split(',')
-	if type(dataDict['TOB']) is str:
-		dataDict['TOB'] = dataDict['TOB'][1:-1].split(',')
-	if type(dataDict['pTOB']) is str:
-		dataDict['pTOB'] = dataDict['pTOB'][1:-1].split(',')
-	# pdb.set_trace()
 
-	print dataDict['pDOB']
-
-	R = {'send_calculation':'1', #Req
-		'muz_narozeni_den':dataDict['DOB'][0],
-		'muz_narozeni_mesic':dataDict['DOB'][1],
-		'muz_narozeni_rok':dataDict['DOB'][2],
-		'muz_narozeni_hodina':dataDict['TOB'][0],
-		'muz_narozeni_minuta':dataDict['TOB'][1],
-		'muz_narozeni_city':'',
-		'muz_narozeni_mesto_hidden':'Manually+place%3A+%C2%B0%27N%2C+%C2%B0%27E',#auto
-		'muz_narozeni_stat_hidden':'XX',
-		'muz_narozeni_podstat_kratky_hidden':'',
-		'muz_narozeni_podstat_hidden':'',
-		'muz_narozeni_podstat2_kratky_hidden':'',
-		'muz_narozeni_podstat3_kratky_hidden':'',
-		'muz_narozeni_input_hidden':'',
-		'muz_narozeni_sirka_stupne':str(abs(dataDict['COB'][0])).split('.')[0],
-		'muz_narozeni_sirka_minuty':str(float('0.'+str(dataDict['COB'][0]).split('.')[1])*60).split('.')[0],
-		'muz_narozeni_sirka_smer': '1' if dataDict['COB'][0]<0 else '0', #address N Dir (0':'N',1':'S)
-		'muz_narozeni_delka_stupne':str(abs(dataDict['COB'][1])).split('.')[0], #address E - Main
-		'muz_narozeni_delka_minuty':str(float('0.'+str(dataDict['COB'][1]).split('.')[1])*60).split('.')[0],
-		'muz_narozeni_delka_smer': '1' if dataDict['COB'][1]<0 else '0', #address E Dir (0':'E',1':'W)
-		'muz_narozeni_timezone_form':'auto',
-		'muz_narozeni_timezone_dst_form':'auto',
-		'send_calculation':'1',
-		'zena_narozeni_den':dataDict['pDOB'][0],
-		'zena_narozeni_mesic':dataDict['pDOB'][1],
-		'zena_narozeni_rok':dataDict['pDOB'][2],
-		'zena_narozeni_hodina':dataDict['pTOB'][0],
-		'zena_narozeni_minuta':dataDict['pTOB'][1],
-		'zena_narozeni_city':'',
-		'zena_narozeni_mesto_hidden':'Manually+place%3A+%C2%B0%27N%2C+%C2%B0%27E',
-		'zena_narozeni_stat_hidden':'XX',
-		'zena_narozeni_podstat_kratky_hidden':'',
-		'zena_narozeni_podstat_hidden':'',
-		'zena_narozeni_podstat2_kratky_hidden':'',
-		'zena_narozeni_podstat3_kratky_hidden':'',
-		'zena_narozeni_input_hidden':'',
-		'zena_narozeni_sirka_stupne':str(abs(dataDict['pCOB'][0])).split('.')[0],
-		'zena_narozeni_sirka_minuty':str(float('0.'+str(dataDict['pCOB'][0]).split('.')[1])*60).split('.')[0],
-		'zena_narozeni_sirka_smer': '1' if dataDict['pCOB'][0]<0 else '0',
-		'zena_narozeni_delka_stupne':str(abs(dataDict['pCOB'][1])).split('.')[0],
-		'zena_narozeni_delka_minuty':str(float('0.'+str(dataDict['pCOB'][1]).split('.')[1])*60).split('.')[0],
-		'zena_narozeni_delka_smer': '1' if dataDict['pCOB'][1]<0 else '0',
-		'zena_narozeni_timezone_form':'auto',
-		'zena_narozeni_timezone_dst_form':'auto',
-		'switch_interpretations':'0',
-		'house_system':'placidus',
-		'uhel_orbis':'#tabs_redraw'}
-	return R
-
-
-
-
--- a/V4/runme.py	Sun Mar 04 15:03:15 2018 +0000
+++ b/V4/runme.py	Sun Mar 04 17:09:50 2018 +0000
@@ -1,29 +1,33 @@
 #!/usr/bin/env python
+
+
 import dParse as dp
-# import compatibility as comp
 import synastry as syn
 import requests
-import re
 import time
 import csv
-import random
 import pdb
 import os
 import pickle
-from HTMLParser import HTMLParser
-# from lxml import html
+import sys
 from bs4 import BeautifulSoup
 
 def parsePage(resp):
+	gotLocation = 0
 	horiscope = syn.planetPositions()
 	soup = BeautifulSoup(resp.content, 'lxml')
 	tcCell = soup.find_all('div', attrs={'class':'right-sedy-banner-svetlejsi'})
 	for cell in tcCell:
+		if "Planets in partner's house" in cell.get_text():
+			gotLocation = 1
 		divList = cell.find_all('div')
 		for i in range(len(divList)):
-			planetName = divList[i].getText().lower()
-			if planetName in planetPositions.planetNames:
-				horiscope.planets[planetName].setLocation(divList[i+2].getText(),divList[i+4].getText())
+			planetName = divList[i].getText().lower().strip().replace(':','').split(' ')[0]
+			if planetName in syn.planetPositions.planetNames:
+				if gotLocation and not '/' in planetName:
+					horiscope.planets[planetName].setHouse(divList[i+2].getText(),divList[i+4].getText())
+				else:
+					horiscope.planets[planetName].setLocation(divList[i+2].getText(),divList[i+4].getText())
 	return horiscope
 
 def makePeople(filename):
@@ -36,42 +40,11 @@
 		# pdb.set_trace()
 	return people
 
-# def setURL(p):
-# 	url = 'https://horoscopes.astro-seek.com/calculate-love-compatibility/'
-# 	payload = dp.makePayload(p)
-# 	return (url,payload)
-
 def requestURL(url,payload):
 	r = requests.get(url, params=payload)
 	time.sleep(5)
 	return r
 
-# def makeURLPayload(url,payload):
-# 	url += '?'
-# 	for p in payload:
-# 		url += '&' + str(p)
-# 		url += '=' + str(payload[p])
-# 	return url
-
-# def printToFile(filename,data,removeAdds):
-# 	if removeAdds == True:
-# 		del data['DOB']
-# 		del data['TOB']
-# 		del data['pDOB']
-# 		del data['pTOB']
-# 		del data['COB']
-# 		del data['pCOB']
-# 		del data['horiscope']
-# 	# keys = data[0].keys()
-# 	keys = []
-# 	for d in data:
-# 		keys = keys + d.keys()
-# 	keys = sorted(uniqueList(keys))
-# 	with open(filename,'w') as stream:
-# 		dict_writer = csv.DictWriter(stream, keys, extrasaction='ignore')
-# 		dict_writer.writeheader()
-# 		dict_writer.writerows(data)
-
 def loadPick(filename):
 	with open(filename, 'rb') as handle:
 		b = pickle.load(handle)
@@ -81,102 +54,38 @@
 	with open(filename, 'wb') as handle:
 		pickle.dump(data,handle)
 
-# def tempPF(fName,data):
-# 	f__ = open(fName,'w')
-# 	f__.write(data)
-# 	f__.close()
-
 def parseHoriscope(people,saveFile):
 	horiscopeList = []
 	for person in people:
-		if person.p_dob is None or person.p_dob == '':
-			print 'SKIPPING person '+ person.id + ' p_dob is None'
-			# person.horiscope = None
-			# horiscopeList.append({'ID':person['ID']})
+		issue = person.identifyIssues()
+		if issue is not None:
+			print 'SKIPPING person '+ person.id + ' error with ' + issue 
 		else:
 			print 'parsing person '+ person.id
-			parseTries = 3
-			while parseTries > 0:
-				try:
-					person.makePayload()
-					resp = requestURL(person.url,person.payload)
-					person.horiscope = parsePage(resp)
-					pdb.set_trace()
-					parseTries = 0
-				except:
-					print sys.exc_info()[0]
-					parseTries -= 1
-			# for d in person.horiscope.keys():
-			# 	person[d] = person['horiscope'][d]
-			# horiscopeList.append(person)
-	# 		if saveFile is not None:
-	# 			savePick(saveFile,horiscopeList)
-	# return horiscopeList
-	# savePick(pickFile,person)
-	# savePick('2'+pickFile,horiscopeList)
-	# printToFile('final_'+outFile,horiscopeList)
-
-# def printDict(d):
-# 	for d_ in d:
-# 		print (d,d_)
-
-# def refactorHoriscope(hor):
-# 	d = {}
-# 	d['ID'] = hor['ID']
-# 	for h in hor['horiscope']:
-# 		hs = sorted(h)
-# 		d[(hs[0], hs[1], hor['horiscope'][h][0])] = 1
-# 		d[(hs[0], hs[1])] = float(str(hor['horiscope'][h][1]) + '.' + str(hor['horiscope'][h][2]))
-# 	return d
-
-# def uniqueList(seq): 
-#    # order preserving
-#    noDupes = []
-#    [noDupes.append(i) for i in seq if not noDupes.count(i)]
-#    return noDupes
-
-# def merge_two_dicts(x, y):
-#     z = x.copy()   # start with x's keys and values
-#     z.update(y)    # modifies z with y's keys and values & returns None
-#     return z
-
-# def findMissing(unique,keyList):
-# 	missing = []
-# 	for u in unique:
-# 		if u not in keyList:
-# 			missing.append(u)
-# 	return u
-
-# def presentResults(saveFile):
-# 	data = []
-# 	data2 = []
-# 	hlist = loadPick(saveFile)
-# 	keyList = []
-# 	for h in hlist:
-# 		d = refactorHoriscope(h)
-# 		keyList.append(d.keys())
-# 		data.append(d)
-# 	uniqueKeys = uniqueList(keyList)
-# 	# for da in data:
-# 	# 	missingKeys = findMissing(uniqueKeys,da.keys())
-# 	# 	# pdb.set_trace()
-# 	# 	d2 = dict(zip(missingKeys,[0]*len(missingKeys)))
-# 	# 	da = merge_two_dicts(da,d2)
-# 	# 	data2.append(da)
-# 	return data
-
-
-def newTest():
-	people = makePeople('individuals.csv')
-
+			person.makePayload()
+			person.resp = requestURL(person.url,person.payload)
+			person.horiscope = parsePage(person.resp)
+			# person.horiscope.printPositions()
+		if saveFile is not None:
+				savePick(saveFile,people)
 
 def testMain():
-	pickFile = 'outData.pick'
-	# people = makePeople('individuals.csv')
-	# savePick(pickFile,people)
-	people = loadPick(pickFile)
-	parseSaveFile = pickFile.split('.')[0]+'_collect.pick'
-	parseHoriscope(people,parseSaveFile)
+	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)
--- a/V4/synastry.py	Sun Mar 04 15:03:15 2018 +0000
+++ b/V4/synastry.py	Sun Mar 04 17:09:50 2018 +0000
@@ -13,6 +13,24 @@
 		self.p_cob = personDict['pCOB']
 		self.horiscope = None
 
+	def identifyIssues(self):
+		if self.id is None:
+			return 'id'
+		elif self.dob is None:
+			return 'dob'
+		elif self.tob is None:
+			return 'tob'
+		elif self.cob is None:
+			return 'cob'
+		elif self.p_dob is None:
+			return 'p_dob'
+		elif self.p_tob is None:
+			return 'p_tob'
+		elif self.p_cob is None:
+			return 'p_cob'
+		else:
+			return None
+
 	def makePayload(self):
 		if type(self.cob) is str:
 			cob_0 = float(self.cob.split(',')[0][1:])
@@ -81,19 +99,27 @@
 			'switch_interpretations':'0',
 			'house_system':'placidus',
 			'uhel_orbis':'#tabs_redraw'}
-		# return R
 
 
 class planetRelation:
+	noHouseList = ['asc','ic','dsc','mc','asc/mc','sun/moon']
 	def __init__(self,planetName):
 		self.name = planetName
 		self.angleA = None
 		self.angleB = None
+		if planetName not in planetRelation.noHouseList:
+			self.houseA = None
+			self.houseB = None
 
 	def setLocation(self,A,B):
-		self.angleA = '.'.join(A.encode('ascii','replace').split('?'))[:-1]
-		self.angleB = '.'.join(B.encode('ascii','replace').split('?'))[:-1]
+		self.angleA = float('.'.join(A.encode('ascii','replace').split('?'))[:-1])
+		self.angleB = float('.'.join(B.encode('ascii','replace').split('?'))[:-1])
+		# print self.angleA,self.angleB
 
+	def setHouse(self,A,B):
+		self.houseA = int(A.encode('ascii','ignore'))
+		self.houseB = int(B.encode('ascii','ignore'))
+		# print self.houseA,self.houseB
 
 	def test_random(self):
 		self.angleA = random.random()*360
@@ -101,12 +127,12 @@
 
 
 class planetPositions:
-	aspectDict = {'conjunct':0,'semi-square':45,'sextile':60,'square':90,'trine':120,'opposite':180}
-	planetNames = ['sun','moon','mercury','venus','mars','jupiter','saturn','uranus','neptune','pluto','node','lilith','chiron','asc','ic','dsc','mc','asc_mc','sun_moon']
+	aspectDict = {'conjunction':0,'semi-square':45,'sextile':60,'square':90,'trine':120,'opposite':180}
+	planetNames = ['sun','moon','mercury','venus','mars','jupiter','saturn','uranus','neptune','pluto','node','lilith','chiron','asc','ic','dsc','mc','asc/mc','sun/moon']
 	def __init__(self):
 		self.planets = {}
-		for i in range(len(planetPositions.planetNames)):
-			self.planets[planetPositions.planetNames[i]] = planetRelation(planetPositions.planetNames[i])
+		for p in planetPositions.planetNames:
+			self.planets[p] = planetRelation(p)
 		self.aspect = {}
 
 	def test_random(self):
@@ -122,13 +148,22 @@
 		for aspect in planetPositions.aspectDict:
 			if self.angleRange[0] < planetPositions.aspectDict[aspect] and self.angleRange[1] > planetPositions.aspectDict[aspect]:
 				self.aspect[componentA,componentB] = aspect
-				return aspect
+				self.aspectDiff = abs(self.angle - planetPositions.aspectDict[aspect])
+				return self.aspect,self.aspectDiff
 
+	def calcAllAspects(self):
+		for p1 in planetPositions.planetNames:
+			for p2 in planetPositions.planetNames:
+				self.calcAspect(p1,p2)
 
+	def printPositions(self):
+		for p in planetPositions.planetNames:
+			if p in planetRelation.noHouseList:
+				print p,self.planets[p].angleA,self.planets[p].angleB
+			else:
+				print p,self.planets[p].angleA,self.planets[p].angleB,self.planets[p].houseA,self.planets[p].houseB
 
 
 
 
 
-
-
Binary file timesheet.xlsx has changed